摘要:結構上Hive On Spark和SparkSQL都是一個翻譯層,把一個SQL翻譯成分散式可執行的Spark程式。
本文分享自華為雲社群《Hive on Spark和Spark sql on Hive有啥區別?》,作者:dayu_dls 。
結構上Hive On Spark和SparkSQL都是一個翻譯層,把一個SQL翻譯成分散式可執行的Spark程式。Hive和SparkSQL都不負責計算。Hive的預設執行引擎是mr,還可以執行在Spark和Tez。Spark可以連線多種資料來源,然後使用SparkSQL來執行分散式計算。
Hive On Spark 配置
(1)首先安裝包要選擇對,否則就沒有開始了。
Hive版本:apache-hive-2.1.1-bin.tar
spark版本:spark-1.6.3-bin-hadoop2.4-without-hive(不需要把Hive編譯進去)
(2)假設你已經安裝好Hive(後設資料為Derby)和spark,那麼預設Hive走mr,需要修改以下配置讓Hive走spark
<property> <name>hive.execution.engine</name> <value>spark</value> </property>
(3)配置環境變數及執行時引數
在hive-site.xml中配置SPARK_HOME;
在hive-site.xml或者或者spark-default.conf或者spark-env.conf配置spark執行時引數,也可以在Hive執行環境中設定臨時引數:
set spark.master=<Spark Master URL> set spark.eventLog.enabled=true; set spark.eventLog.dir=<Spark event log folder (must exist)> set spark.executor.memory=512m; set spark.serializer=org.apache.spark.serializer.KryoSerializer;
將編譯好的Spark安裝包中lib目錄下的spark-assembly-*.jar包新增至HIVE_HOME/lib中
(4)啟動Hive
/opt/hive/bin/hive --service metastore
(5)啟動Hive命令列視窗
beeline -u jdbc:hive2://localhost:10000 或者 /opt/hive/bin/hive
(6)開啟你的Hive on spark之旅
0: jdbc:hive2://localhost:10000> create table test (f1 string,f2 string) stored as orc; No rows affected (2.018 seconds) 0: jdbc:hive2://localhost:10000> insert into test values(1,2);
Spark sql on Hive
(1)獲取包
Hive版本:apache-hive-2.1.1-bin.tar
spark版本:spark-1.6.3-bin-hadoop2.4(需要把Hive編譯進去)
(2)在$SPARK_HOME/conf目錄建立hive-site.xml檔案,內容如下:
<configuration> <property> <name>hive.metastore.uris</name> <value>thrift://master1:9083</value> <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description> </property> </configuration>
(3)如果你使用的後設資料庫是mysql,那麼請把mysql驅動放到$SPARK_HOME/lib下,否則跳過。
(4)啟動Hive後設資料服務,待spark執行時訪問。
(5)執行命令
./bin/spark-shell --master spark://master:7077 scala> val hc = new org.apache.spark.sql.hive.HiveContext(sc); scala> hc.sql("show tables").collect.foreach(println) [sougou,false] [t1,false]
Sparkthriftserver啟用
spark提供了spark-sql命令可以直接操作hive或impala,可以啟用sparkthriftserver服務,然後利用beeline遠端連線spark,利用spark sql。sparksql的誕生其實就是為了代替hsql。Sparksql的後設資料也是使用hive的metastore進行管理,所以需要配置hive.metastore.uris引數。
這裡說下sparkthriftserver和hivethriftserver的區別,二者的埠一定要區分:
hivethriftserver:hive服務端的服務,遠端通過jdbc或者beeline連線,使用hsql操作hive。
sparkthriftserver:spark的服務,遠端通過jdbc或者beeline連線spark,使用spark sql操作hive。
(1)在$SPARK_HOME/conf目錄建立hive-site.xml檔案,內容如下:
<configuration> <property> <name>hive.metastore.uris</name> <value>thrift://master1:9083</value> <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description> </property> <!--Thrift JDBC/ODBC server--> <property> <name>hive.server2.thrift.min.worker.threads</name> <value>5</value> </property> <property> <name>hive.server2.thrift.max.worker.threads</name> <value>500</value> </property> <property> <name>hive.server2.thrift.port</name> <value>10001</value> </property> <property> <name>hive.server2.thrift.bind.host</name> <value>master</value> </property> </configuration>
(2)啟動sparkthriftserver
./start-thriftserver.sh --hiveconf hive.server2.thrift.port=10000 --master yarn --driver-class-path /data/spark-2.2.0-bin-hadoop2.7/jars/mysql-connector-java-5.1.43-bin.jar --executor-memory 5g --total-executor-cores 5
啟動sparkthriftserver後,後臺預設會執行spark-sql命令,實際上是用spark-submit向yarn提交一個任務。這樣就會在yarn的8088頁面工作列中起一個常駐任務,用來執行spark sql。
(3)連線spark
./beeline -u jdbc:hive2://172.168.108.6:10001 -n root
(4)這裡的sql可以在8088頁面看到執行過程。