hive on spark 安裝配置
需求介紹
最近發現集群上hive的mapreduce計算特別慢,尤其用kettle抽取mysql數據到hive中時候 。儘管用了調優,但是因為硬體資源的限制,效果不明顯。於是想把hive的計算引擎換成spark,畢竟總體上來說spark要比MR快得多。今天抽空過來處理一下。
前置條件
在配置之前,先確保安裝了Hadoop集群,JDK,Hive,MySQL,Scala。
我的集群配置信息如下:
類型 機器名 IP
主節點 master 196.128.18.20
從節點 slave1 196.128.18.21
從節點 slave2 196.128.18.22
從節點 slave3 196.128.18.23
從節點 slave4 196.128.18.24
說明
Hive on Spark 在官網的介紹是:「Hive on Spark provides Hive with the ability to utilizeApache Sparkas its execution engine.」 ,也就是用Spark作為hive的執行引擎。
Hive默認是用MR(MapReduce)做計算引擎的,它也可以用Tez和Spark做計算引擎,與MR把中間結果存入文件系統不同,Spark全部在內存執行,所以總體上Spark要比MR開很多。
Spark集群需要用到hdfs系統,所以安裝Spark需要先安裝好hadoop集群,同時hive用MySQL作為元數據存儲資料庫,所以需要先安裝好MySQL。另外編譯spark需要安裝maven和Scala。
一、環境說明
本機器軟體環境如下:
操作系統:CentOS 6.6
Hadoop 2.6.5
Hive 2.3.3
Spark 2.1.0
MySQL 5.6
JDK 1.7
Maven 3.5.3
Scala 2.10
二、編譯和安裝Spark(Spark on YARN)
2.1 編譯Spark源碼
Hive 和 Spark 是有兼容行問題,所以需要用對應的Hive和Spark,下面是官網提供的兼容版本:
在Spark官網上下載編譯過的版本是帶了hive的jar包的,而要用 spark on hive , 官網介紹是:
「Note that you must have a version of Spark which does not include the Hive jars」
也就是要不包含 Hive jars包的,所以我們需要下載源碼重新編譯,並且編譯的時候不能指定hive。
我們去官網https://spark.apache.org/downloads.html下載 spark2.1.0的源碼:
下載解壓到 /home/hadoop 下:
hadoop 用戶執行:sudo tar -zxf spark-2.1.0.tgz -C /home/hadoop
注意:編譯前請確保已經安裝JDK、Maven和Scala,並在/etc/profile里配置環境變數。
開始編譯
cd /home/hadoop/spark-2.1.0/dev
執行:
./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6,parquet-provided"
編譯過程需要在線下載Maven依賴的jar包,所以需要確保能聯網,這個步驟時間可能比較長,取決於你的網速本次是大約花費二三十分鐘。看網上說可能需要好幾個小時。剛開始列印信息如下:
[hadoop@master dev]$ ./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6,parquet-provided"
-bash: ./dev/make-distribution.sh: No such file or directory
[hadoop@mini1 dev]$ ./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6,parquet-provided" +++ dirname ./make-distribution.sh
++ cd ./..
++ pwd
+ SPARK_HOME=/home/hadoop/instSoft/spark-2.1.0
+ DISTDIR=/home/hadoop/instSoft/spark-2.1.0/dist
+ MAKE_TGZ=false
+ MAKE_PIP=false
+ MAKE_R=false
+ NAME=none
+ MVN=/home/hadoop/instSoft/spark-2.1.0/build/mvn
+ (( 4 ))
+ case $1 in
+ NAME=hadoop2-without-hive
+ shift
+ shift
+ (( 2 ))
+ case $1 in
+ MAKE_TGZ=true
+ shift
+ (( 1 ))
+ case $1 in
+ break
+ "[" -z /usr/lib/jvm/jre-1.7.0-openjdk.x86_64 "]"
+ "[" -z /usr/lib/jvm/jre-1.7.0-openjdk.x86_64 "]"
++ command -v git
過程會看到很多下載信息,如:
Downloaded from central: https://repo1.maven.org/maven2/junit/junit/4.12/junit-4.12.jar (315 kB at 135 kB/s)
Downloading from central: https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
Downloaded from central: https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar (45 kB at 16 kB/s)
Downloading from central: https://repo1.maven.org/maven2/com/novocode/junit-interface/0.11/junit-interface-0.11.jar
Downloaded from central: https://repo1.maven.org/maven2/com/novocode/junit-interface/0.11/junit-interface-0.11.jar (30 kB at 9.0 kB/s)
Downloading from central: https://repo1.maven.org/maven2/org/scala-sbt/test-interface/1.0/test-interface-1.0.jar
Downloaded from central: https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.11/1.0.2/scala-xml_2.11-1.0.2.jar (649 kB at 177 kB/s)
Downloaded from central: https://repo1.maven.org/maven2/org/scala-sbt/test-interface/1.0/test-interface-1.0.jar (15 kB at 3.8 kB/s)
編譯完成如下圖:
編譯成功後,在spark-2.1.0目錄下會多一個文件:spark-1.5.0-cdh5.5.1-bin-hadoop2-without-hive.tgz , 如下圖(紅色):
把改文件解壓到 /usr/local 目錄下:
sudo tar -zxfspark-1.5.0-cdh5.5.1-bin-hadoop2-without-hive.tgz -C /usr/local
修改許可權並重命名:
cd /usr/local
sudo chown -R hadoop:hadoop spark-2.1.0
sudo mv spark-2.1.0 spark
2.2 配置Spark
配置環境變數
sudo vi /etc/profile
在最後添加:
export SPARK_HOME=/usr/local/spark
export PATH=$PATH:$SPARK_HOME/bin
配置spark變數
cd /usr/local/spark/conf
vi spark-env.sh
添加以下代碼:
export SPARK_DIST_CLASSPATH=$(/opt/hadoop/bin/hadoop classpath)
保存退出
三、下載安裝配置HIVE
官網下載 hive 2.3.3
2. 解壓並重命名
hadoop用戶執行:
sudo tar -zxf apache-hive-2.3.3-bin.tar.gz -C /usr/local
sudo chown -R hadoop:hadoop hive-2.3.3
sudo mv hive-2.3.3 hive
3. 把spark的必要jar放入hive
cp /usr/local/spark/jars/scala-library-2.11.8.jar/usr/local/hive/lib
cp /usr/local/spark/jars/spark-network-common_2.11-2.1.1.jar/usr/local/hive/lib
cp /usr/local/spark/jars/spark-core_2.11-2.1.1.jar/usr/local/hive/lib
4. 下載MySQL的jdbc驅動並放到hive中
注意該驅動需要另外下載:
cpmysql-connector-java-5.1.44-bin.jar/usr/local/hive/lib
5. 配置 hive-site.xml
cd /usr/local/hive/conf
新建hive-site.xml文件:
vi hive-site.xml
添加以下內容:
jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8
root
password
password to use against metastore database
spark
true
spark.master
yarn-cluster
spark.serializer
3
4
2048m
2
1024m
default
spark.app.name
myInceptor
true
true
nonstrict
true
1
-XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
false
保存退出。
說明一下,文件開始是hive連接MySQL元資料庫hive的信息:
用戶名為 root ,密碼為 password,資料庫名稱是 hive ,驅動為jdbc,埠是3306 , 連接串如下:
mysql -plocalhost -uroot -ppassword
對於不熟悉MySQL的同學,需要注意一下連接許可權。
第二部分是把hive的執行引擎配置為spar
第三部分是一些spark的性能參數配置以及其他一些配置,需要根據系統自身硬體配置。
6. 配置 hive-env.xml
vi hive-env.xml
在最後加入一下內容:
export HADOOP_OPTS="$HADOOP_OPTS -XX:NewRatio=12 -Xms1024m -Xms10m -XX:MaxPermSize=256m -XX:MaxHeapFreeRatio=40 -XX:MinHeapFreeRatio=15 -XX:-UseGCOverheadLimit"
export HADOOP_HEAPSIZE=4096
export HADOOP_HOME=/usr/local/hadoop
export HIVE_CONF_DIR=/usr/local/hive/conf
export HIVE_AUX_JARS_PATH=/usr/local/hive/lib
保存退出。
五、HIVE初始化
執行:
/usr/local/hive/bin/schematool -initSchema -dbType mysql
我剛開始報錯:
原因是我原來安裝了hive,在mysql中已經創建了hive資料庫並保存了元數據,所以我先drop掉hive資料庫,再次初始化,成功!
五、驗證是否安裝配置成功
1.準備數據
(1)進入hive,創建外表用戶信息表
hive>use default;
hive>CREATE EXTERNAL TABLE user_info (id int,name string,age int,salary decimal(8,2))
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
LOCATION "/data/logdata/";
(2)手工造10萬條記錄,分隔符是逗號,並傳到hdfs的/data/logdata下面(該目錄下面只有這個
文件)
hadoop fs -put ./user_info.txt /data/logdata/
(3) 檢查能否讀到數據
hive>select * from user_info;
(4)創建另一張目標表
hive>create table user_info_t(id int, name string, age int, salary decimal(8,2));
(5)把user_info中的10萬條記錄插入到user_info_t表中
hive>insert into user_info_t select id,name,age,salary from user_info;
(6)查看是否用spark計算和時間:
可以看到任務確實用spark作為計算引擎,耗時45秒,因為受硬體設備限制,較之前用mapreduce耗時數分鐘設置十幾分鐘已經是大大提升了效率!
結論:配置成功!
總結:以上是今天花了半天時間弄出來的,看似簡單,實際是踩坑無數,邊踩邊填,總算磕磕碰碰弄出來了,還算順利,花一大晚上整理總結一些小經驗,希望能給大家一點參考意義。時間匆忙,以及經驗不足,這裡面肯定還有不少遺漏甚至錯誤的地方,歡迎大家指出批評,謝謝!


TAG:金融科技探索 |