當前位置:首頁 » 編程語言 » sparksql操作hive
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sparksql操作hive

發布時間: 2023-05-13 20:47:23

A. 源碼級解讀如何解決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的零拷貝

B. 【數倉】對比spark-hive的兩種分布式計算模式

最近在學習過程中發現SparkSQL、Hive on Spark、Spark on Hive是非常容易混淆的的概念。了解三者的關系前,先要先明白幾個概念。

相對於HIve on MapRece,本質上來說,Hive on Spark是Hive把自己的引擎從MapRece替換為更高效的SparkRDD。數據源是hive本身,當我們執行HQL時底層已經不再是將HQL轉換為MapRece任務,而是跑SparkRDD任務。
在hive-site-xml中把hive.execution.engine配置換成spark,在hive所在節點安裝Spark並配置環境變數。外部遠程登錄或者hive命令行模式就會執行spark任務了。
即:Hive on Spark = HQL解析 + SparkRDD引擎

Spark on Hive是以Spark角度看Hive是數據源,在Spark中配置Hive,並獲取Hive中的元數據,然後用SparkSQL操作hive表的數據並直接翻譯成SparkRDD任務。Hive只是作為一個Spark的數據源。
bin/spark-sql、bin/spark-submit採用的是這種方式。提交任務的jar必須帶著hive-site.xml的配置。
即:Spark on Hive = SparkSql解析 + SparkRDD引擎

Spark on Hive的模式更加絲滑,性能更好。
HIve on Spark的模式對大數據周邊組件的支持兼容性更好。

C. SparkSQL同步Hbase數據到Hive表

spark 2.3.0
hive 3.0.0
hbase 2.0.0

常規操作 hbase數據同步到hive是螞搭通過再hive端建立hbase的映射表。
但是由於集群組件問題,建立的棗物笑映射表不能進行
insert into A select * from hbase映射表
操作。報錯!
org.apache.hadoop.hbase.client.RetriesExhaustedException: Can't get the location for replica 0
at org.apache.hadoop.hbase.client..getRegionLocations(.java:332)

spark讀取hbase數據形成RDD,構建schma信息,形成DF
通過sparkSQL 將df數據寫入到指定的hive表格中。

hadoop本地環境版本一定要與依賴包版本保持一直,不然報如下錯誤
java.lang.IllegalArgumentException: Unrecognized Hadoop major version number: 3.1.1

hbase 1.X與2.X有很大差距,所以再看案例參考是一定要結合自己的hbase版本。
筆者程序編譯中遇到
Cannot Resolve symbol TableInputFormat HBase找不到TableInputFormat
因為:新版本2.1.X版本的HBASE又把maprece.TableInputFormat單獨抽取出來了
需要導入依賴
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-maprece</artifactId>
<version>${hbase.version}</version>
</dependency>

一定要把hbase相關凳含的包都cp 到spark的jars文件下面。然後重啟spark服務。
不然你會遇到此類錯誤
Class org.apache.hadoop.hive.hbase.HBaseSerDe not found

或者
java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration
這些都是缺少jar包的表現。

D. Spark SQL寫入Hive,同分區overwrite,不同分區insert

摘要: Spark SQL , Hive

新建hive表,定隱源義好欄位類型和 分區欄位

將DataFrame創建為視圖表,創建一個分區字元串對象,使用 insert overwrite 指定 partition(dt=????) 進行指定分區的overwrite操作

建表之後test為一張空表,分別指定三次插入overwrite操作,dt分別為灶悉態"陸衡20201203","20201203","20201208",最終結果只有兩個分區的數據

E. 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

F. sparkSQL用jdbc連接hive和用元數據連接hive的區別,各自優缺點

spark on hive : 是spark 通過spark-sql 使用hive 語句操作hive ,底層運行的還是 spark rdd.
*(1)就是通過sparksql,載入hive的配置文件,獲取到hive的元數據信息
* (2)spark sql獲取到hive的元數據信息之後就可以拿到hive的所有表的數據
* (3)接下來就可以通過spark sql來操作hive表中的數據
hive on spark: 是hive 等的執行引擎變成spark , 不再是maprece. 相對於上一項,這個要實現責麻煩很多, 必須重新編譯你的spark. 和導入jar包,

G. spark sql怎麼去獲取hive 表一定日期范圍內的數據

select orderid,fenjian,timee
from
(
select orderid,fenjian,timee,row_number(orderid,fenjian) rn
from (
select orderid,fenjian,timee from tableName
distribute by orderid,fenjian sort by orderid,fenjian,timee asc
) t1
) t2
where t2.rn=1