本文由 網易雲 釋出。
作者:唐雕龍
本篇文章僅限內部分享,如需轉載,請聯絡網易獲取授權。
面向新手的hadoop+hive學習環境搭建,加對我走過的坑總結,避免大家踩坑。
對於hive相關docker,並沒有官方的docker,第三方維護經過測試各種不靠譜,所以才想到自己搭建一套,然後後期在整理成docker上傳~~~
基礎環境:
1. 公司雲主機debain8.8 (不像docker,所以對系統核心無要求)
1. 前置安裝:
1.1 jdk8(hive要求jdk7以上,千萬不要jdk9!!!!!詳情見末尾作死一)1.2 hadoop 2.7.X以上1.3 mysql或者postgresql(作為hive metastore的資料庫)
2. 安裝hadoop:
1.安裝metastore所用到資料庫。
對於mysql或者postgresql就偷懶直接docker pull 然後docker run了一個出來。畢竟僅僅作為hive元資訊儲存角色。
docker pull mysql:5.7
docker run –name some-mysql -e MYSQL_ROOT_PASSWORD=XXX -d mysql:5.7
2.jdk版本升級。
官方下載jdk8的二進位制包,使用whichjava檢視系統自帶java目錄下載好的二進位制包直接解壓後編輯etc/profile檔案設定java相關的環境變數.
export JAVA_HOME=/xx/xx/jdk8
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
編輯完後記得source /etc/profile,接著執行java -version確認是否成功
3.增加hadoop安裝使用者
官方建議增加hadoop使用者組以及hadoop使用者,我也建議這樣做,但是公司雲主機的話我就直接用我們有數的公共賬號。
4.安裝ssh伺服器
hadoop使用到了ssh,所以需要
apt-get install openssh-server
然後測試
ssh localhost #會生成.ssh資料夾
並且配置ssh無密碼登陸
cd /home/XXXX/.ssh/ #XX為你的使用者名稱,比如有數賬號是youdata,XXX就是youdata
ssh-keygen -t rsa# 一路按回車就可以
cat ./id_rsa.pub >> ./authorized_keys # 加入授權
在執行一下ssh localhost 確保配置成功。
5.hadoop服務安裝
直接找到官方下載url,wget下來我用的是:
wget heep://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz
順便也把hive下載下來吧
wget http://mirror.bit.edu.cn/apache/hive/hive-2.1.1/apache-hive-2.1.1-bin.tar.gz
下載過後解壓即可,最好選擇掛載的比較大雲硬碟上。然後記得對你的安裝使用者給許可權。
sudo chown -R hadoop ./hadoop#hadoop為使用者,第二個為解壓後的資料夾名
然後進入hadoop目錄下,執行
./bin/hadoop version
如果成功就說明下載的hadoop是可用的。 接下來修改hadoop配置達到單機偽分散式啟動.所謂偽分散式就是在單機上以分離的java程式執行,節點同時扮演NameNode和DataNode,讀取的是HDFS中的檔案。
6.hadoop偽分散式配置
Hadoop 的配置檔案位於 /usr/local/hadoop/etc/hadoop/中,偽分散式需要修改2個配置檔案 core-site.xml 和 hdfs-
site.xml 。Hadoop的配置檔案是 xml 格式,每個配置以宣告 property 的 name 和 value 的方式來實現。
6.1. core-site.xml修改:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
其中目錄同樣推薦放在空間較大的盤上。並且確保使用者有許可權,所以最好用當前使用者建一個~~
6.2. hdfs-site.xml修改:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
同樣的,這兩個檔案目錄最好自己指定並且用當前使用者建,指定的好處是避免誤刪導致hadoop需要重新format.
7.初始化hadoop節點
配置完後在hadoop目錄下執行
./bin/hdfs namenode -format
成功後可以看到Exitting with status 0
坑一: 啟動時候提示:ssh: Could not resolve hostname xxx,設定hadoop環境變數即可解決
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
啟動日誌資訊是記錄在 /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.log 中,所以應該檢視這個字尾為 .log 的檔案;
8.hadoop服務啟動
啟動hadoop執行:
./sbin/start-dfs.sh
啟動成功後執行jps,可以看到
youdata@hzadg-youdata-test:/srv/nbs/0/hadoop$ jps
35664 SecondaryNameNode
52310 Jps
35320 NameNode
35485 DataNode
會出現 “NameNode”、”DataNode” 和 “SecondaryNameNode” 要關閉hadoop執行
./sbin/stop-dfs.sh
額外的啟動Yarn:YARN 是從 MapReduce 中分離出來的,負責資源管理與任務排程。YARN 執行於 MapReduce 之上,提供了高可用性、高擴充套件性 上述通過 ./sbin/start-dfs.sh 啟動 Hadoop,僅僅是啟動了 MapReduce 環境,我們可以啟動YARN ,讓 YARN 來負責資源管理與任務排程。 編輯/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
接著修改yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
然後啟動mapreduce即上面的
./sbin/start-dfs.sh # 啟動MapReduce
./sbin/start-yarn.sh # 啟動YARN
./sbin/mr-jobhistory-daemon.sh start historyserver #開啟歷史伺服器,才能在Web中檢視任務執行情況
YARN 有個好處是可以通過 Web 介面檢視任務的執行情況:http://localhost:8088/cluster 至此hadoop安裝完畢,接下來安裝hive.
3. 安裝hive:
1.對hive基本介紹
metadata: 即後設資料。後設資料包含用Hive建立的database、table等的元資訊。後設資料儲存在關係型資料庫中。如Derby、MySQL等。 Metastore:客戶端連線metastore服務,metastore再去連線MySQL資料庫來存取後設資料。有了metastore服務,就可以有多個客戶端同時連線,而且這些客戶端不需要知道MySQL資料庫的使用者名稱和密碼,只需要連線metastore 服務即 可 。然 後 對 於 metastore 有 三 種 配 置 方 式 :
1.內嵌模式使用的是內嵌的Derby資料庫來儲存後設資料,也不需要額外起Metastore服務。這個是預設的,配置簡單,但是一次只能一個客戶端連線
2.本地元儲存和遠端元儲存都採用外部資料庫來儲存後設資料,目前支援的資料庫有:MySQL、Postgres、Oracle、MS SQL Server.在這裡我們使用MySQL。
3.本地元儲存和遠端元儲存的區別是:本地元儲存不需要單獨起metastore服務,用的是跟hive在同一個程式裡的metastore服務。遠端元儲存需要單獨起metastore服務,然後每個客戶端都在配置檔案裡配置連線到該metastore服務。
2.hive配置
hive配置檔案位於解壓目錄下的conf裡 1.修改hive-env.sh
export JAVA_HOME=/opt/java ##Java路徑
export HADOOP_HOME=/opt/hadoop ##Hadoop安裝路徑
export HIVE_HOME=/opt/hive ##Hive安裝路徑
export HIVE_CONF_DIR=/opt/hive/conf ##Hive配置檔案路徑
2.建立hdfs目錄並賦予許可權
hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -mkdir -p /user/hive/tmp
hdfs dfs -mkdir -p /user/hive/log
hdfs dfs -chmod g+w /user/hive/warehouse
hdfs dfs -chmod g+w /usr/hive/tmp
hdfs dfs -chmod g+w /usr/hive/log
3.修改hive-site.xml 將 hive-site.xml 檔案中以下幾個配置項的值設定成上一步中建立的幾個路徑,同樣建議放於空間較大的盤上
<configuration>
<property>
<name>hive.exec.scratchdir</name>
<value>/user/hive/tmp</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/user/hive/log</value>
</property>
</configuration>
4.增加metastore使用到的資料庫相關連線資訊的配置,修改hive-site.xml
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&characterEncodig=UTF-8&useSSL=
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
</configuration>
執行Hive 在命令列執行 hive 命令時必須保證以下兩點: HDFS 已經啟動。可以使用 start-dfs.sh 指令碼來啟動 HDFS。MySQL jdbc jar包新增到 $HIVE_HOME/lib 目錄下。 然後在hive目錄下,執行
./bin/schematool-dbtype mysql-initSchema
執行成功後就可以執行hive看成功了嗎
./bin/hive
啟動hive服務則是
./bin hive –service hiveserver2 &
測試用beeline連線,如果出現類似
org.apache.hive.service.cli.HiveSQLException: Failed to open new session: java.lang.RuntimeException: org.apache
就是你這個使用者不允許偽裝為 anonymous(hive的預設使用者,預設配置可以檢視)。 修改hadoop的core-site.xml檔案增加
<configuration>
<property>
<name>hadoop.proxyuser.XXX.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.XXX.groups</name>
<value>*</value>
</property>
</configuration>
即可,XXX是你的使用者名稱,然後重啟hadoop. 至此,hadoop+hive測試環境就已經搭建完成。 額外的:
作死一:好奇使用jdk9
因為jdk9還不成熟,並且我直觀上對之前老版本編譯出的jar包有些不相容,比如
Exception in thread “main” java.lang.ClassCastException: java.base/jdk.internal.loader.ClassLoaders$AppClassLoa
這個還能搜到原因,是因為jdk9的 將URLClassLoader 作為系統的ClassLoaders的superclass導致,所以之前用到他兩轉化的都會出錯需要重寫程式碼。 又或者:
java.lang.Integer (jdbc-type=””, sql-type=””) cant be mapped for this datastore. No mapping is available.
在使用mysql作為metastore時候報錯,使用到的mysqljdbc為:mysql-connector-java-5.1.42.jar 這個錯誤完全搜不到原因,不過看報錯是java型別到sql對映出錯。所以猜測仍然是jdk9對之前版本的某些jar或者之前jdk的某些用法不支援。 後來更換mysqljdbc版本到6.06仍然這個錯誤。後來更換jdk版本就不再出錯。。。。。所以,現在先別作死生產環境用java9……
網易有數:企業級大資料視覺化分析平臺。面向業務人員的自助式敏捷分析平臺,採用PPT模式的報告製作,更加易學易用,具備強大的探索分析功能,真正幫助使用者洞察資料發現價值。可點選這裡免費試用。
瞭解 網易雲 :
網易雲官網:https://www.163yun.com/
新使用者大禮包:https://www.163yun.com/gift
網易雲社群:https://sq.163yun.com/