自從公司使用大數據產品以後,就不多碰開源的東西了,集羣出問題也是跟研發溝通,前些天有朋友問我,怎麼能把hive底層的引擎換成spark,我想了想,是否是將hive的數據庫共享給spark而後用spark-shell不就行了,後來查了查資料,原來不是這樣的,這裏面的操做還挺多了。哎,真的是,用了別人產品,開發是方便了,原理懂的就少了,小編一直還沉浸在用一條SQL底層就能轉換的spark程序並行執行任務的幸福生活中。乘着週末,一我的享受着公司的WiFi和空調,把這個開源的hive引擎換成spark搞一搞,順便分享給你們,最重要的是死肥宅到技術宅的轉變。
因爲資金有限,只能使用虛擬機給你們演示,這裏小編把本身的搭建的hadoop的平臺環境介紹一下,先帶你們回顧一下hadoopHA模式下,有哪些進程須要啓動:(hadoop是2.7.x版本的)
→Namenode:(active-standby):HDFS的主節點,用於元數據管理和管理從節點
→ Datanode:HDFS的從節點,用於存儲數據
→ ResourceMananger:yarn的主節點,用於資源調度
→ Nodemanager:yarn的從節點,用於具體的執行任務
→ Zookeeper:服務協調(進程名QuorumPeerMain)
→ JournalNode:用於主備namenode的元數據的共享
→ DFSZKFailoverController:監控着namenode的生死,時刻準備主備切換。
大概就這麼多吧,一個極爲普通的hadoop平臺,小編這裏用了3臺虛擬機:
每一個節點上的服務:
hadoop01:
hadoop02:
hadoop03:
抱怨服務分配不均勻的小夥伴,停下大家的鍵盤,小編只是演示,匆匆忙忙的搭建的。html
這裏我在三臺機器上都分發了hive的安裝包:
執行命令啓動hive:(怎麼快怎麼來,不用beeline了)java
[hadoop@hadoop01 applications]$ hive
運行幾個命令試試:node
hive> use test; #進入數據庫 hive> show tables; #查看有哪些表 hive> create external table `user`(id string,name string) row format delimited fields terminated by ',' location "/zy/test/user"; #建表 #導入數據 [hadoop@hadoop01 ~]$ for i in `seq 100` ;do echo "10$i,zy$i">> user.txt ;done ; [hadoop@hadoop01 ~]$ hadoop fs -put user.txt /zy/test/user hive> select * from `user`;
OK,hive是沒有問題的!mysql
首先查看一下hive和spark版本的兼容:
這裏小編的spark是2.0.0,hive是2.3.2。
Spark下載地址:https://archive.apache.org/dist/spark/spark-2.0.0/
Hive的下載地址:http://hive.apache.org/downloads.html
這裏有spark須要去hive模塊編譯,這裏小編將編譯好的spark提供給你們:
連接:https://pan.baidu.com/s/1tPu2a34JZgcjKAtJcAh-pQ 提取碼:kqvs
至於hive嘛,官網的就能夠sql
#hive配置(hive-site.xml: <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hadoop03:3306/hivedb?createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBC metastore</description> <!-- 若是 mysql 和 hive 在同一個服務器節點,那麼請更改 hadoop02 位 localhost --> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> <description>username to use against metastore database</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>123456</value> <description>password to use against metastore database</description> </property> <!--指定hive數據倉庫的數據存儲在hdfs上的目錄:--> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <!-- hive執行引擎--> <property> <name>hive.execution.engine</name> <value>spark</value> </property> <property> <name>hive.enable.spark.execution.engine</name> <value>true</value> </property> <!-- spark家目錄--> <property> <name>spark.home</name> <value>/applications/spark-2.0.0-bin-hadoop2-without-hive</value> </property> <!--也能夠在spark default中設置--> <property> <name>spark.master</name> <value>yarn</value> </property> <property> <name>spark.eventLog.enabled</name> <value>true</value> </property> <property> <name>spark.eventLog.dir</name> <value>hdfs://zy-hadoop:8020/spark-log</value> <description>必需要有這個目錄</description> </property> <property> <name>spark.executor.memory</name> <value>512m</value> </property> <property> <name>spark.driver.memory</name> <value>512m</value> </property> <property> <name>spark.serializer</name> <value>org.apache.spark.serializer.KryoSerializer</value> </property> <!--把spark jars下的jar包上傳到hdfs上,yarn模式下減小集羣間的分發--> <property> <name>spark.yarn.jars</name> <value>hdfs://zy-hadoop:8020/spark-jars/*</value> </property> <property> <name>hive.spark.client.server.connect.timeout</name> <value>300000</value> </property> <!--下面的根據實際狀況配置 --> <property> <name>spark.yarn.queue</name> <value>default</value> </property> <property> <name>spark.app.name</name> <value>zyInceptor</value> </property> </configuration> 這裏須要注意的一點是,hadoop是HA模式,因此hdfs的路徑應該寫爲: hdfs://cluster_name:8020/path
#spark的配置(spark-env.sh) #!/usr/bin/env bash export JAVA_HOME=/applications/jdk1.8.0_73 export SCALA_HOME=/applications/scala-2.11.8 export HADOOP_HOME=/applications/hadoop-2.8.4 export HADOOP_CONF_DIR=/applications/hadoop-2.8.4/etc/hadoop export HADOOP_YARN_CONF_DIR=/applications/hadoop-2.8.4/etc/hadoop export SPARK_HOME=/applications/spark-2.0.0-bin-hadoop2-without-hive export SPARK_WORKER_MEMORY=512m export SPARK_EXECUTOR_MEMORY=512m export SPARK_DRIVER_MEMORY=512m export SPARK_DIST_CLASSPATH=$(/applications/hadoop-2.8.4/bin/hadoop classpath)
① 在hive lib找到如下jar包拷貝到spark jars目錄下:
hive-beeline-2.3.3.jar
hive-cli-2.3.3.jar
hive-exec-2.3.3.jar
hive-jdbc-2.3.3.jar
hive-metastore-2.3.3.jarshell
[hadoop@hadoop01 lib]$ cp hive-beeline-2.3.2.jar hive-cli-2.3.2.jar hive-exec-2.3.2.jar hive-jdbc-2.3.2.jar hive-metastore-2.3.2.jar /applications/spark-2.0.0-bin-hadoop2.7/jars/
② 在spark jars中找到如下jar包拷貝到hive lib目錄下:
spark-network-common_2.11-2.0.0.jar
spark-core_2.11-2.0.0.jar
scala-library-2.11.8.jar
chill-java,
chill
jackson-module-paranamer,
jackson-module-scala,
jersey-container-servlet-core
jersey-server,
json4s-ast ,
kryo-shaded,
minlog,
scala-xml,
spark-launcher
spark-network-shuffle,
spark-unsafe ,
xbean-asm5-shaded數據庫
[hadoop@hadoop01 jars]$ cp spark-network-common_2.11-2.0.0.jar spark-core_2.11-2.0.0.jar scala-library-2.11.8.jar chill-java-0.8.0.jar chill_2.11-0.8.0.jar jackson-module-paranamer-2.6.5.jar jackson-module-scala_2.11-2.6.5.jar jersey-container-servlet-core-2.22.2.jar jersey-server-2.22.2.jar json4s-ast_2.11-3.2.11.jar kryo-shaded-3.0.3.jar minlog-1.3.0.jar scala-xml_2.11-1.0.2.jar spark-launcher_2.11-2.0.0.jar spark-network-shuffle_2.11-2.0.0.jar spark-unsafe_2.11-2.0.0.jar xbean-asm5-shaded-4.4.jar /applications/hive-2.3.2-bin/lib/
③ 配置文件的分發
將hadoop中的yarn-site.xml、hdfs-site.xml 放入spark的conf中
將hive-site.xml也放入spark的conf中apache
④ 分發jar包
在hive-site.xml配置了:spark.yarn.jars
這裏咱們先在hdfs中建立這個目錄:json
[hadoop@hadoop01 conf]$ hadoop fs -mkdir /spark-jars
將spark的jars中的全部jar包放入這個目錄中:bash
[hadoop@hadoop01 jars]$ hadoop -put ./jars/*.jar /spark-jars
⑤ 啓動spark
[hadoop@hadoop01 jars]$ /applications/spark-2.0.0-bin-hadoop2-without-hive/sbin/start-all.sh
此時這個節點中會出現這幾個進程:
測試,在hive中運行一個SQL:
測試,在hive中運行一個SQL:
這裏通常使用select count(1) from table; 來檢測!
Spark界面會出現:
Yarn的界面會有:
出現以上界面,表示hive on spark安裝成功!!
緣由:spark中不能含有hive的依賴,去掉-Phive進行編譯spark。
解決:編譯spark
下面是hive官網給出的教程:
#Prior to Spark 2.0.0:(他說的是優先在spark2.0.0上,其實就是spark1.6版本的編譯) ./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.4,parquet-provided" #Since Spark 2.0.0: ./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided" #Since Spark 2.3.0: ./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided,orc-provided"
編譯成功以後,在執行前面的內容便可。
這裏小編也有編譯好以後的spark:
連接:https://pan.baidu.com/s/1tPu2a34JZgcjKAtJcAh-pQ 提取碼:kqvs