本文由 網易雲 發佈。 作者:唐雕龍 本篇文章僅限內部分享,如需轉載,請聯繫網易獲取授權。 面向新手的hadoop+hive學習環境搭建,加對我走過的坑總結,避免大家踩坑。 對於hive相關docker,並沒有官方的docker,第三方維護經過測試各種不靠譜,所以才想到自己搭建一套,然後後期在整理成 ...
本文由 網易雲 發佈。
作者:唐雕龍
本篇文章僅限內部分享,如需轉載,請聯繫網易獲取授權。
面向新手的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/