Hive on spark的搭建記錄
注:Hadoop-2.7.7、Hive-2.1.1、spark-1.6.0-bin-hadoop2.6,作業系統是Ubuntu18 64bit。最近做Hive on spark的任務,記錄下。
1、搭建偽分散式的Hadoop
- 從hadoop下載Hadoop-2.7
- etc/hadoop/,修改core-site.xml
List-1.1
<configuration> <property> <name>hadoop.tmp.dir</name> <value>/opt/software/docker/hadoop/hadoop-2.7.7/data/tmp</value> </property> <property> <name>fs.defaultFS</name> <value>hdfs://127.0.0.1:9000</value> </property> <property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property> </configuration>
- /etc/hadoop下,hadoop-env.sh中修改JAVA_HOME,指向JAVA的安裝目錄。
- /etc/hadoop下,hdfs-site.xml的檔案內容如下
List-1.2
<configuration> <property> <name>dfs.datanode.data.dir</name> <value>/opt/software/docker/hadoop/hadoop-2.7.7/data/data</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/opt/software/docker/hadoop/hadoop-2.7.7/data/name</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
- cp mapred-site.xml.template mapred-site.xml,之後檔案mapred-site.xml的內容如下:
List-1.3
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- yarn-site.xml的內容如下:
List-1.4
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
</configuration>
將Hadoop寫到環境變數裡面,在/etc/profile中加入如下
List-1.5
#hadoop
export HADOOP_HOME=/opt/software/docker/hadoop/hadoop-2.7.7
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
啟動Hadoop,命令列執行start-dfs.sh和start-yarn.sh,沒有報錯,之後命令列執行"hadoop fs -ls /"沒出錯,就ok了。如果報錯,可以去看日誌檔案。
2、安裝Hive-2.1.1
- 從官網下載Hive-2.1.1
- 在conf下,"cp hive-default.xml.template hive-site.xml"
- 之後修改hive-site.xml,在開始處加入如下
List-2.1
<property>
<name>system:java.io.tmpdir</name>
<value>/tmp/hive/java</value>
</property>
<property>
<name>system:user.name</name>
<value>${user.name}</value>
</property>
- 之後"cp hive-log4j2.properties.template hive-log4j2.properties",修改hive-log4j2.properties中日誌檔案的位置,之後我們就可以看Hive的日誌(這點很重要,我們可以通過日誌看具體報錯資訊)。
- 我們使用mysql來儲存hive的元資訊,所以修改hive-site.xml中javax.jdo.option.ConnectionUserName的值為mysql連線的username,修改javax.jdo.option.ConnectionPassword的值為連線mysql的密碼,修改javax.jdo.option.ConnectionURL的值為jdbc:mysql://xxx.xxx.xxx.xxx:3306/hive2。
將Hive配置到環境變數裡面,修改/etc/profile,加入如下內容,之後"source /etc/profile"
List-2.2
#hive
#export HIVE_HOME=/opt/software/docker/hadoop/apache-hive-2.1.1-bin
#export PATH=$HIVE_HOME/bin:$PATH
之後命令列執行"schematool -initSchema -dbType mysql",沒有報錯,報錯的話,看Hive日誌。
命令列執行hive命令,就進入Hive CLI了,之後可以執行建立表等操作。
3、Hive on park
因為Hive的計算引擎預設是map reduce,比較慢,我們想要將Hive的計算引擎設定為Spark。
這是最坑的部分。
要很注意的一點是hive和的版本要和spark的版本對應,可以看這裡 。由於上面我們使用的Hive版本2.1.1,所以,我們選用的Spark版本是1.6.0。
不能使用從apache spark官網下載的bin直接使用,因為那個裡面,有與hadoop/hive有關的程式碼,我們要自己編譯。
1、編譯Spark1.6.0
從github下載spark原始碼。安裝scala,我安裝的是2.12,/etc/profile如下
List-3.1.1
#scala
export SCALA_HOME=/opt/software/tool/scala2.12
export PATH=$SCALA_HOME/bin:$PATH
之後進行spark原始碼目錄,使用List-3.1.2中的命令進行打包,之後會看到一個名為"spark-1.6.0-bin-hadoop2-without-hive.tgz"的新檔案。
List-3.1.2
./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6,parquet-provided"
其實我的Spark偽分散式是用官網下的包安裝的,只是用List-3.1.2中lib下的spark-assembly-1.6.0-hadoop2.6.0.jar替換官網二進位制安裝的spark的lib下的spark-assembly-1.6.0-hadoop2.6.0.jar。
在SPARK_HOME/conf下,"cp spark-defaults.conf.template spark-defaults.conf",spark-defaults.conf的內容如下List-3.2:
List-3.2
spark.master spark://127.0.0.1:7077
spark.eventLog.enabled true
spark.eventLog.dir hdfs://127.0.0.1:9000/opt/applogs/spark
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.driver.memory 512M
spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
"cp spark-env.sh.template spark-env.sh",之後spark-env.sh內容如下,網上說的SPARK_DIST_CLASSPATH=%(hadoop classpath)不生效。
List-3.3
export JAVA_HOME=/opt/software/tool/jdk1.8
export HADOOP_HOME=/opt/software/docker/hadoop/hadoop-2.7.7
export SCALA_HOME=/opt/software/tool/scala2.12
export HADOOP_CONF_DIR=/opt/software/docker/hadoop/hadoop-2.7.7/etc/hadoop
export SPARK_MASTER_IP=mjduan-host
export SPARK_WORKER_MEMORY=3072M
export SPARK_DIST_CLASSPATH=$(/opt/software/docker/hadoop/hadoop-2.7.7/bin/hadoop classpath);
要修改Hive的hive-site.xml:
將hive.execution.engine的值改為spark。
在hdfs上新建目錄/yarn,並將List-3.1.2中得到的spark-assembly-1.6.0-hadoop2.6.0.jar放到hdfs的/yarn目錄下;在hdfs上新建目錄/opt/applogs/spark。
之後在hive-site.xml中加入如下List-3.4:
List-3.4
</property>
<property>
<name>spark.master</name>
<value>spark://127.0.0.1:7077</value>
</property>
<property>
<name>spark.eventLog.enabled</name>
<value>true</value>
</property>
<property>
<name>spark.eventLog.dir</name>
<value>hdfs://127.0.0.1:9000/opt/applogs/spark</value>
</property>
<property>
<name>spark.executor.memory</name>
<value>512M</value>
</property>
<property>
<name>spark.serializer</name>
<value>org.apache.spark.serializer.KryoSerializer</value>
</property>
<property>
<name>spark.yarn.jars</name>
<value>hdfs://hdfs:9000/yarn/spark-assembly-1.6.0-hadoop2.6.0.jar</value>
</property>
<property>
<name>hive.enable.spark.execution.engine</name>
<value>true</value>
</property>
<property>
<name>spark.home</name>
<value>/opt/software/docker/hadoop/spark-1.6.0-bin-hadoop2.6</value>
</property>
<property>
<name>spark.executor.extraJavaOptions</name>
<value>-XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"</value>
</property>
之後重啟Hive;進入SPARK_HOME/sbin,執行./start-all.sh,可以檢視日誌,日誌中有Spark的UI介面地址。
命令列執行hive,進入hive CLI,執行命令"set hive.execution.engine;"可以看到當前正在使用的計算引擎。在hive CLI中建立表、插入資料,沒有報錯,基本ok了。
Reference:
涉及的東西很多,到處搜。
- https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started
- https://www.cnblogs.com/breg/p/5552342.html
- http://www.aboutyun.com/thread-22954-1-1.html