當前位置:首頁 » 編程語言 » sparkhivesql

sparkhivesql

發布時間: 2022-12-06 18:36:28

Ⅰ spark從hive數據倉庫中讀取的數據可以使用sparksql進行查詢嗎

1、為了讓Spark能夠連接到Hive的原有數據倉庫,我們需要將Hive中的hive-site.xml文件拷貝到Spark的conf目錄下,這樣就可以通過這個配置文件找到Hive的元數據以及數據存放。
在這里由於我的Spark是自動安裝和部署的,因此需要知道CDH將hive-site.xml放在哪裡。經過摸索。該文件默認所在的路徑是:/etc/hive/conf 下。
同理,spark的conf也是在/etc/spark/conf。
此時,如上所述,將對應的hive-site.xml拷貝到spark/conf目錄下即可
如果Hive的元數據存放在Mysql中,我們還需要准備好Mysql相關驅動,比如:mysql-connector-java-5.1.22-bin.jar。
2、編寫測試代碼
val conf=new SparkConf().setAppName("Spark-Hive").setMaster("local")
val sc=new SparkContext(conf)

//create hivecontext
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)

sqlContext.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ") //這里需要注意數據的間隔符

sqlContext.sql("LOAD DATA INPATH '/user/liujiyu/spark/kv1.txt' INTO TABLE src ");

sqlContext.sql(" SELECT * FROM jn1").collect().foreach(println)

sc.stop()

3、下面列舉一下出現的問題:
(1)如果沒有將hive-site.xml拷貝到spark/conf目錄下,會出現:

分析:從錯誤提示上面就知道,spark無法知道hive的元數據的位置,所以就無法實例化對應的client。
解決的辦法就是必須將hive-site.xml拷貝到spark/conf目錄下
(2)測試代碼中沒有加sc.stop會出現如下錯誤:
ERROR scheler.LiveListenerBus: Listener EventLoggingListener threw an exception
java.lang.reflect.InvocationTargetException
在代碼最後一行添加sc.stop()解決了該問題。

源碼級解讀如何解決Spark-sql讀取hive分區表執行效率低問題

問題描述

在開發過程中使用spark去讀取hive分區表的過程中(或者使用hive on spark、nodepad開發工具),部分開發人員未注意添加分區屬性過濾導致在執行過程中載入了全量數據,引起任務執行效率低、磁碟IO大量損耗等問題。

解決辦法

1、自定義規則CheckPartitionTable類,實現Rule,通過以下方式創建SparkSession。

2、自定義規則CheckPartitionTable類,實現Rule,將規則類追加至Optimizer.batches: Seq[Batch]中,如下。

規則內容實現

1、CheckPartitionTable規則執行類,需要通過引入sparkSession從而獲取到引入conf;需要繼承Rule[LogicalPlan];

2、通過splitPredicates方法,分離分區謂詞,得到分區謂詞表達式。在sql解析過程中將謂詞解析為TreeNode,此處採用遞歸的方式獲取分區謂詞。

3、判斷是否是分區表,且是否添加分區欄位。

4、實現Rule的apply方法

大數據和雲計算的關系

大數據JUC面試題

大數據之Kafka集群部署

大數據logstsh架構

大數據技術kafka的零拷貝

Ⅲ Hive、SparkSQL是如何決定寫文件的數量

Hive自身和Spark都提供了對Hive的SQL支持,用SQL的交互方式操作Hive底層的HDFS文件,兩種方式在寫文件的時候有一些區別:

Hive在通過SQL寫文件是通過MapRece任務完成的,如下面這個例子:

在表中插入數據後,可以hdfs對應路徑下找到存儲的文件

可以看到插入生成了1個文件,這是因為每一條插入語句都會單獨啟動一個MapRece任務,一個MapRece任務對應一個結果文件。

當插入過程有shuffle時:

由 Hive實現group by的過程 可知,group by的時候會以group by的欄位為key進行shuffle,即上例中的 game_id 欄位。從執行日誌中可以看到整個任務啟用了62個mapper和1個recer,由於最終寫數據的過程是在recer中完成,所以最終寫數據的文件數量也應該只有1個。

註:Hive控制recer數量的規則如下:

Spark SQL也可以在hive中操作文件,執行命令

Hdfs中文件的存儲如下:

可以發現即使是同一條語句,spark也會啟動兩個任務區並行的寫文件,最終產生了兩個文件結果。

Spark中同樣以類似的SQL為例:

與Hive不同的是,Spark在執行shuffle過程的時候,會為每一個shuffle的key啟動一個任務來寫數據,上例中的key game_id 在源數據source_table的分布情況是共有26個不同的key。

因此spark會啟動26個任務來寫數據,在最終的結果文件中也應該有26個文件:

由於spark的寫文件方式,會導致產生很多小文件,會對NameNode造成壓力,讀寫性能變差,為了解決這種小文件問題,spark新的版本(筆者使用2.4.0.cloudera2版本)中支持了動態規劃shuffle過程,需要配置spark.sql.adaptive.enabled屬性。

在將spark.sql.adaptive.enabled屬性設置為true後,spark寫文件的結果為

從結果可以看到只有一個文件,這是由於動態規劃的作用,在寫文件的時候只啟動了一個任務。動態規劃的細節請參考 Adaptive Execution 讓 Spark SQL 更高效更智能 。

Ⅳ Spark SQL(十):Hive On Spark

Hive是目前大數據領域,事實上的SQL標准。其底層默認是基於MapRece實現的,但是由於MapRece速度實在比較慢,因此這幾年,陸續出來了新的SQL查詢引擎,包括Spark SQL,Hive On Tez,Hive On Spark等。

Spark SQL與Hive On Spark是不一樣的。Spark SQL是Spark自己研發出來的針對各種數據源,包括Hive、JSON、Parquet、JDBC、RDD等都可以執行查詢的,一套基於Spark計算引擎的查詢引擎。因此它是Spark的一個項目,只不過提供了針對Hive執行查詢的工功能而已,適合在一些使用Spark技術棧的大數據應用類系統中使用。

而Hive On Spark,是Hive的一個項目,它是將Spark作為底層的查詢引擎(不通過MapRece作為唯一的查詢引擎)。Hive On Spark,只適用於Hive,在可預見的未來,很有可能Hive默認的底層引擎就從MapRece切換為Spark了;適合於將原有的Hive數據倉庫以及數據統計分析替換為Spark引擎,作為全公司通用的大數據統計分析引擎。

Hive On Spark做了一些優化:
1、Map Join
Spark SQL默認對join是支持使用broadcast機制將小表廣播到各個節點上,以進行join的。但是問題是,這會給Driver和Worker帶來很大的內存開銷。因為廣播的數據要一直保留在Driver內存中。所以目前採取的是,類似乎MapRece的Distributed Cache機制,即提高HDFS replica factor的復制因子,以讓數據在每個計算節點上都有一個備份,從而可以在本地進行數據讀取。

2、Cache Table
對於某些需要對一張表執行多次操作的場景,Hive On Spark內部做了優化,即將要多次操作的表cache到內存中,以便於提升性能。但是這里要注意,並不是對所有的情況都會自動進行cache。所以說,Hive On Spark還有很多不完善的地方。

Hive QL語句 =>
語法分析 => AST =>
生成邏輯執行計劃 => Operator Tree =>
優化邏輯執行計劃 => Optimized Operator Tree =>
生成物理執行計劃 => Task Tree =>
優化物理執行計劃 => Optimized Task Tree =>
執行優化後的Optimized Task Tree

Ⅳ spark1.6.3執行hivesql遇到left join 時報can't zip rdds

在spark 上跑hive sql 腳本,在spark 2.x以上跑沒問題 ,hive上沒問題,spark1.6上跑最後會報如圖以上問題 ,牆內比較難找到對應解決辦法 ,可以在腳本里配置一下配置,spark.sql.adaptive.enabled=true,默認值是false。設置為true的話,就是開啟了Spark SQL自適應查詢引擎,就是在運行時,通過一些統計指標來動態優化Spark sql的執行計劃。

產生原因目前沒有找到合適的解釋,產生問題的地方很簡單,就是兩個表在left join 預估是因為數據傾斜導致 ,a left join b的時候 ,b表數據較小,大量數據關聯不上,導致數據傾斜

Ⅵ spark SQL和hive到底什麼關系

Hive是一種基於HDFS的數據倉庫,並且提供了基於SQL模型的,針對存儲了大數據的數據倉庫,進行分布式交互查詢的查詢引擎。

SparkSQL並不能完全替代Hive,它替代的是Hive的查詢引擎,SparkSQL由於其底層基於Spark自身的基於內存的特點,因此速度是Hive查詢引擎的數倍以上,Spark本身是不提供存儲的,所以不可能替代Hive作為數據倉庫的這個功能。

SparkSQL相較於Hive的另外一個優點,是支持大量不同的數據源,包括hive、json、parquet、jdbc等等。SparkSQL由於身處Spark技術堆棧內,基於RDD來工作,因此可以與Spark的其他組件無縫整合使用,配合起來實現許多復雜的功能。比如SparkSQL支持可以直接針對hdfs文件執行sql語句。

熱點內容
snkrs為什麼安卓永不了 發布:2023-01-29 10:54:49 瀏覽:943
linux防篡改 發布:2023-01-29 10:53:49 瀏覽:206
qt音樂播放器源碼 發布:2023-01-29 10:50:35 瀏覽:794
cc2541編程 發布:2023-01-29 10:44:42 瀏覽:988
華為哪個型號不同配置相同 發布:2023-01-29 10:43:05 瀏覽:298
ave編程 發布:2023-01-29 10:42:09 瀏覽:413
帶身份證的醫保卡如何改密碼 發布:2023-01-29 10:39:07 瀏覽:812
sql中查詢語句 發布:2023-01-29 10:36:26 瀏覽:517
我的世界如何製作伺服器里的搭路 發布:2023-01-29 10:35:06 瀏覽:682
cmd如何開伺服器 發布:2023-01-29 10:29:58 瀏覽:864