????????????????????????????????????????? CentOS7下安裝Hadoop集群
????????????????????????????????????????????????????????????????????????????????????????? ——CM,CDH集成環境
本次實驗主要參考文獻:
老師給的word幫助文檔;
博客https://blog.csdn.net/shawnhu007/article/details/52579204
一、實驗背景
我們是四臺電腦一起搭建Hadoop集群
A,B,C,D四個人個有一臺電腦,分別在各自的電腦上安裝虛擬機,虛擬機裝centOS7。(我們建議主機namenode內存大一點8g,硬盤最好100g以上,其余節點2g,50g即可,下文會闡述原因)
系統:VMware下的centOS7
jdk:1.8.0_171?? jdk-8u171-linux-x64.tar.gz(Oracle)
MySQL: mysql-5.7.18-1.el7.x86_64.rpm-bundle.tar以及mysql-connector-java-5.1.42-bin.jar(老師云盤給的)
CDH:?CDH-5.11.1-1.cdh5.11.1.p0.4-el7.parcel.sha1;
??????? ? CDH-5.11.1-1.cdh5.11.1.p0.4-el7.parcel;
????????? manifest.json;(手動新建的文件)
ClouderaManger:cloudera-manager-centos7-cm5.11.1_x86_64.tar.gz
所需要的資源下載地址:
parcels:http://archive.cloudera.com/cdh5/parcels
cloudera manager: https://archive.cloudera.com/cm5/cm/5/
java jdk:?Java SE - Downloads | Oracle Technology Network | Oracle
二、實驗步驟
??????????? 泳道圖
由于網上的教程眾多,所以在這里總結了一下詳細步驟
A.三臺主機的虛擬機建立連接(ip設置)
?最終達到效果
IP地址主機名說明
172.20.10.10node1主節點
172.20.10.2node2節點
172.20.10.12node3節點
172.20.10.14node4節點
??????????? 并且最后 互相的虛擬機能夠互相ping通
??????????? 在最開始的時候我們嘗試了使用了,來達到靜態ip的目的,這樣會使得后期維護集群,物理上的主機ip的改變并不會使得虛擬機需要重新配置。
??????????? 但是在嘗試的過程中,發現我們的ip地址雖然改變成了理想的靜態ip,并且 能夠上網,但是每臺虛擬機之間卻不能互相ping通,由于長期在這個問題拖慢了進度,而且沒有找到問題,所以我們采用了橋接模式。
???????? 在使用橋接模式的時候,開始的時候也遇到了一些問題,不過所幸都解決了。
??????????? 基本步驟:
??????????? 每臺電腦設置上網模式更改為橋接模式;
??????????? 重啟網絡;
????? systemctl restart network;
??????????? 遇到的問題:
??????????? ①虛擬機無法上網
???? 解決方法:更改網絡的配置文件。
???? 解決思路:發現無法上網之后,我們互相ping了一下,發現能夠ping通,但是卻ping不通百度,所以有可能是dns的問題,修改之后果然能夠上網了。同時要注意的一個坑是,之前靜態ip的時候吧下圖的BOOTPROTO設置為static,現在記得改回來dhcp,并且重啟網絡restart,ifconfig檢查一下網絡,如果和自己主機是一個網段下面就說明是正確的。
B、安裝jdk
????? ?1.卸載本身自帶的jdk
[root@localhost ~]# rpm -qa | grep java
[root@localhost ~]# rpm -qa | grep java
tzdata-java-2014i-1.el7.noarch
java-1.7.0-openjdk-headless-1.7.0.71 -2.5.3.1 .el7_0.x86_64
java-1.7.0-openjdk-1.7.0.71 -2.5.3.1 .el7_0.x86_64
java-1.8.0-openjdk-headless-1.7.0.71 -2.5.3.1 .el7_0.x86_64
java-1.8.0-openjdk-1.7.0.71 -2.5.3.1 .el7_0.x86_64
刪除上面的java包
# rpm -e --nodeps $PACKGENAME
????? ?2.去官網下載jdk,然后放到對應/usr/java/,解壓,最后修改配置文件即可。
??????????? 配置文件:
# vim /etc/profile
JAVA_HOME=/usr/java/jdk1.8.0_171
JRE_HOME=/usr/java/jdk1.8.0_171/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH
????? #source /etc/profile生效
????? #java –version
????? 遇到的問題:到運行到CM安裝界面的過程時候,發現了問題,他提示java版本不同。
??????????? 需要值得注意的是,大家都按下java –version,現實的版本號一致,但是卻被認為不同,這是由于,在官網下載的時候要么都下載為.rpm,要么都下載為.tar.gz格式,否則就會報這種錯誤,解決方法:刪掉這個jdk,之后重新安裝正確的版本。
C、修改主機節點名稱,以及修改hosts文件
# hostnamectl set-hostname node1
修改hosts
各個節點ifconfig,把對應的ip輸入到下方的節點文件中
# vim /etc/hosts
192.168.43.43 node1
192.168.43.29 node2
192.168.43.136 node3
192.168.43.39? node4
注意要添加一行:
127.0.0.1?localhost.node1(只需要node1設置這個)
否則在建立數據庫的時候發現報錯:
D、selinux關閉,防火墻關閉
[root@hadoop1~]# vim /etc/sysconfig/selinux
SELINUX=disabled
重啟才能生效
重啟后檢查
[root@hadoop1~]#sestatus -v
SELinux status: disabled
表示已經關閉了
[root@hadoop1~]# systemctl stop firewalld
[root@hadoop1~]# systemctl disable firewalld
rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
rm '/etc/systemd/system/basic.target.wants/firewalld.service'
[root@hadoop1~]# systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
?? Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled)
?? Active: inactive (dead)
E、NTP服務器設置(用于不同節點間實現時間同步)
這個在操作這個ntp服務,我們先把時區都選為上海時區,來達到時間同一的目的
NTP服務的安裝和配置
[root@hadoop1~]#yum -y install ntp
更改master的節點
[root@hadoop1~]## vi /etc/ntp.conf
注釋掉所有server *.*.*的指向,新添加一條可連接的ntp服務器(百度一下ntp服務器,我選的是上海交大的)
server ntp.sjtu.edu.cn iburst
在其他節點上把ntp指向master服務器地址即可(/etc/ntp.conf下)
server 192.168.160.130 iburst
所有節點
F、SSH無密碼登錄配置
每個節點執行ssh-keygen -t rsa;
????? 出現的選項就一路按回車就好
然后每個節點執行
ssh-copy-id node1;???????????? 然后輸入密碼
ssh-copy-id node2;???????????? 然后輸入密碼
ssh-copy-id node3;
ssh-copy-id node4;
驗證:輸入ssh node1或者其他節點,如果不要輸密碼的話,就說明成功了。
G、安裝mysql(主節點)
centos7自帶的是mariadb,需要先卸載掉
[root@hadoop1]# rpm -qa | grep mariadb
mariadb-libs-5.5.41-2.el7_0.x86_64
[root@hadoop1 huxin]# rpm -e --nodeps mariadb-libs-5.5.41-2.el7_0.x86_64
將下載好的mysql rpm包拷貝到服務器上然后解壓
cp mysql-mysql-5.7.18-1.el7.x86_64.rpm-bundle.tar /usr/mysql/
解壓后依次安裝這四個包:
有Mysql相應的rpm文件, 只需要依次安裝一下幾個rpm即可。
mysql-community-common-5.7.18-1.el7.x86_64.rpm
mysql-community-libs-5.7.18-1.el7.x86_64.rpm
mysql-community-client-5.7.18-1.el7.x86_64.rpm
mysql-community-server-5.7.18-1.el7.x86_64.rpm
命令格式 如rpm –ivh mysql-community-common-5.7.18-1.el7.x86_64.rpm
安裝完畢后啟用mysql服務。
# systemctl start mysqld
# systemctl status mysqld
這種方式完成安裝MySQL后,會自動隨機生成一個原始密碼。登錄并修改密碼,否則報密碼過期錯誤。
# cat /var/log/mysqld.log | grep password
2017-05-13T05:39:44.497086Z 1 [Note] A temporary password is generated for root@linuxvnode0: sjsO:Pin<5c_
使用上述密碼登錄MySQL
# mysql -uroot -p
Enter password:
登錄成功后:
mysql> SET PASSWORD = PASSWORD('Buct0000!');
Query OK, 0 rows affected, 1 warning (0.00 sec)
設置root授權訪問以上所有的數據庫,因為CM安裝時會創建數據庫,這里設置后安裝CM時可以設置數據庫的host為node1
mysql>grant all privileges on *.* to 'root'@'node1' identified by 'Buct0000!' with grant option;
mysql>flush privileges;
由于集群需要安裝hive做為數據倉庫,同時使用了Mysql作為Hive的存儲方式,所以這里單獨為hive建立一個庫。
#為hive建庫hive
mysql>create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
此處須新建一個庫與CM安裝時建立的庫分開,否則啟動Hive時可能會報角色無法啟動的錯誤。
設置開機后自動啟用mysql服務。
# systemctl enable mysqld
H、安裝cloudera manger
三、安裝Cloudera Manager
1.解壓相應的文件cloudera-manager-centos7-cm5.11.1_x86_64.tar.gz ?到/opt/目錄下。
# tar -zxvf cloudera-manager-centos7-cm5.11.1_x86_64.tar.gz -C /opt/
2.將mysql-connector-java-5.1.42-bin.jar放到/opt/cm-5.11.1/share/cmf/lib下并初始化數據庫
# cp mysql-connector-java-5.1.42-bin.jar /opt/cm-5.11.1/share/cmf/lib
/opt/cm-5.11.1/share/cmf/schema/scm_prepare_database.sh [-數據庫類型] [-創建的數據庫名] [-h主機名] [-u用戶名] [-p密碼]
# /opt/cm-5.11.1/share/cmf/schema/scm_prepare_database.sh mysql cm5111 -hnode1 -uroot -pBuct0000! --scm-host node1 root Buct0000! scm
3. 配置agent:
?? 修改/opt/cm-5.11.1/etc/cloudera-scm-agent/config.ini文件修改server_host為主節點主機名。
4. 每臺服務器上執行命令創建scm用戶
# useradd --system --home=/opt/cm-5.11.1/run/cloudera-scm-server/ --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm
5. 將Agent同步到其他節點(這一步由于scp過慢,所以采用了每個節點都下載cm,然后解壓到/opt/下的方法,這樣的話就不用執行scp了)
# scp -r /opt/cm-5.11.1 node2:/opt
# scp -r /opt/cm-5.11.1 node3:/opt
# scp -r /opt/cm-5.11.1 node4:/opt
# scp -r /opt/cm-5.11.1 node5:/opt
6. 將parcels安裝包,sha,manifest.json放置到主節點/opt/cloudera/parcel-repo目錄下。
7. 執行相應的腳本,啟動服務。
主節點啟動 :
# /opt/cm-5.11.1/etc/init.d/cloudera-scm-server start
所有節點啟動 :
# /opt/cm-5.11.1/etc/init.d/cloudera-scm-agent start
需要注意的是:server啟動之后,主節點會變得十分十分卡,這是正常現象,請耐心等待,之后再打開CM安裝頁面
8. 啟動成功后輸入node1:7180即可進入Cloudera Manager運維平臺界面,初始密碼為admin/admin.
(可能CM啟動較久,需要一點時間才能進入,大概3—5mins,多等待一會) 進入后按照提示即可安裝集群以及相應組件。
如若安裝hive組件且使用Mysql類型的數據倉庫,那么需要為hive增加MySQL connector
cp mysql-connector-java-5.1.42-bin.jar /opt/cloudera/parcels/CDH/lib/hive/lib/mysql-connector-java-5.1.42-bin.jar
四、CM界面配置集群
1.瀏覽器輸入node1:7180/之后進入到集群配置頁面。
2.選擇部署的版本
3.繼續下一步,選擇安裝的CM的版本
4.選擇需要部署的主機
5.選擇需要安裝的CM(跟自己下載的percel文件對應,我下載的是5.11.1p0.4)
6.percel文件分發激活
7.檢查器檢查集群中主機環境
8.選擇安裝的CDH 5服務,這個根據需求選擇,但是一些基本的服務必須選擇,也可以自定義安裝,這里選擇含HBase的內核。
9.集群角色分配
(這里一般情況下默認即可,但是如果集群中某臺電腦的配置嚴重不行的時候,建議少分配點任務)
10.數據庫設置,這個要與前面的mysql中建立hive,oozie,hue相對應,如果之前沒有建立的話,會報錯,至于用戶名,密碼都可以填寫。[if !vml]
通常hue會報這個錯:
解決方法: CM要求MySQL安裝對舊版本的庫文件的支持,回到之前的mysql安裝包解壓后的文件夾,發現包含compat的兩個.rpm包未安裝。
安裝兩個包之后成功解決問題
11.審核更改(這一頁默認即可,有需要的自己更改就行)
12.首次運行集群頁面
需要注意的是,其實這一步驟會遇到很多錯誤,最好的解決方法---我建議---先簡單閱讀日志,后百度,實在不行詳細閱讀日志+google。我把自己遇到的問題以及解決方法貼出來,希望能夠有綿薄幫助。
????? 錯誤經歷:
????? ①在第一次安裝的時候,卡在了第二步——正在部署客戶端配置,一直在轉圈。瀏覽器卡死
?? 問題:node1,也就是主節點配置太差
?? 解決方法:主節點嘗試把虛擬機內存提升到4G(第一次裝虛擬機的時候,默認配置導致1G內存,20G硬盤)
????? ②第二次安裝發現HBase啟動失敗,也就是HBase的第二步start失敗。
?? 解決方法:安裝失敗,重啟虛擬機,刪庫重新安裝。主要是重啟虛擬機,這個HBase啟動失敗,retry(點擊下方的重試鍵)是不能解決問題的
????? ③第三次重新安裝,發現第二步——zookeeper等等啟動超時,這個很好解決,點擊重試按鈕即可
??④然后發現HDFS格式化失敗。
?? 這個問題網上有很多說法,試了兩個都失敗了,自己看了看日志,結合網上的,去linux的根目錄下,ls 發現存在dfs文件夾,刪除即可,rm –rf dfs。之后點擊下方的重試按鈕,發現已經ok了。
?? ⑤不幸的是,第6步——hive失敗了。
?? 解決這個問題真的是醉了。
?? 剛開始讀日志發現是JDBC的問題,而本次安裝采用的JDBC,其實在mysql-connector-java.5.1.42.bin.jar里面。這意味這要把它放到某個地方。正確的做法很簡單,命令行進入這個jar的目錄下,cp 一份到/opt/cloudera/parcels/CDH/lib/hive/lib/
執行
cp mysql-connector-java-5.1.42-bin.jar /opt/cloudera/parcels/CDH/lib/hive/lib/mysql-connector-java-5.1.42-bin.jar
????? 解決方法如此簡單,為什么我還要說很難受呢,,這是因為嘗試了無數次這樣的操作都發現依然失敗,最后發現我linux目錄里的這個jar包居然是畫著?叉號的,也就是權限不夠,無法打開,所以嘗試chmod 777 文件 ,發現還是打著?的,意識到不對勁,想起自己的這個jar包是上一次由于重裝linux為了避免浪費時間下載各種包,使用VMtools先備份到windows下,之后又從windows拷回來的。然后又去官網下載了這個jar包,發現果然一切ok,真的是醉了。不想說話。VMtools在備份percel,cm等等包的時候不會出錯,但是jar包會導致權限出錯,請小心。而且使用VMtools,我不建議直接吧win下面的文件拖到linux下面,你會發現拖過去以后大小發生了很大的變化,建議在win下面右鍵復制,然后linux下面右鍵粘貼。VMtools安裝也花費了一些時間,有需要的話,具體的安裝請參考下文。
⑥然后發現oozie又出現了問題。
第一次oozie報的錯誤是關于JDBC的,發現它有一個步驟是,Copying JDBC jar
from /usr/share/java/mysql-connector-java.jar to /var/lib/oozie 。這個很好解決,把之前的那個mysql-connector-java-4.1.42.bin.jar
copy 一份到/usr/share/java/即可,命令就不給出了(注意沒有?叉號的)。
⑦當我們解決了oozie的JDBC的問題之后,又發現oozie又報錯,真的是醉了。好吧,查看日志,發現他提示:
Check DBschema does not exist
大概意思就是oozie在剛剛失敗了,但是它的初始化表 完成了,所以我們只需要
mysql –uroot –p?? 進入mysql
mysql>DROP DATABASE oozie;?? 刪除oozie即可;
如果這條命令執行失敗,那么試一下這個:
mysql>DROP schema oozie;
刪除完之后必須還有重新建立一個,這樣相當于把他清空,使得 初始化這個步驟 能夠成功。
mysql> create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql>quit;
再次重試,發現完完全全的好了,能夠初始化了。
⑧但是,不幸的是,oozie又雙叒出錯了。就是下面這個。這次的錯誤是
upload sharelib timeout
oozie上載共享庫超時。這個的解決方法,百度上好像都沒有,翻墻去外面查,大概的解決方法有挺多種的,都試了一下,發現不能解決問題,于是繼續讀日志:
發現了兩個值得關注的地方
Can't open /opt/cm-5.11.1/run/cloudera-scm-agent/process/42-oozie-OOZIE-SERVER-upload-sharelib/config.zip: 權限不夠.
Can't open /opt/cm-5.11.1/run/cloudera-scm-agent/process/42-oozie-OOZIE-SERVER-upload-sharelib/proc.json: 權限不夠.
SLF4J:?Class?path?contains?multiple?SLF4J?bindings.
SLF4J:?Found?binding?in?[jar:file:/opt/cloudera/parcels/CDH-5.11.1-1.cdh5.11.1.p0.4/jars/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J:?Found?binding?in?[jar:file:/opt/cloudera/parcels/CDH-5.11.1-1.cdh5.11.1.p0.4/jars/slf4j-simple-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J:?Seehttp://www.slf4j.org/codes.html#multiple_bindings?for?an?explanation.
SLF4J:?Actual?binding?is?of?type?[org.slf4j.impl.Log4jLoggerFactory]
然后開始的時候一直在糾結這個權限的事情,他確實會上鎖(畫著叉號,無法打開),但事實上,問題不在于這個,關鍵的問題在于下面的兩個包沖突,他們包含了相同的類,發生了沖突,解決方法很簡單,刪除掉一個即可。這也給我帶來了啟示,讀日志先讀最后的可能會好一點,這可能是問題最大的地方。
我發現再刪除完上面的一步中的文件后,還是報錯,這主要是由于,我們三臺虛擬機都連接的是手機的熱點(要是路由器的話,我覺得速度會很快), 所以導致傳輸速度很慢,嘗試著把oozie上傳共享庫的超時時間設置的長一點就ok了,他默認660s。改成1000,也在角色日志中發現,他確實是在不斷上傳,但是還是網絡太慢,low upload,所以有設置的大了點,改成1500,最后終于成功。 其實解決oozie的超時問題可能需要多個方法一起來操作,可能也需要提升一下Namenode的性能(下方的namenode的java堆棧大小)所以具體的操作請參照下面的圖片。
?? 新打開一個瀏覽器窗口,輸入如圖的地址:node1:7180/cmf/home
第九步:
cd /opt/cloudera/parcels/CDH-5.11.1-1.cdh5.11.1.p0.4/jars/
rm slf4j-simple-1.7.5.jar!
13.安裝完成
14.失敗重裝。
在安裝的過程中,可能會遇到失敗當你進入到CM安裝的界面,也就是瀏覽器的node1:7180的時候,如果中途安裝失敗(有哪一步一直錯誤,最后重啟電腦,或者關掉瀏覽器,都叫做 這一次安裝失敗),此時就需要刪除數據庫,重新安裝,不然你會直接進入CM的管理界面。
1.停止所有cloudera-scm-agent服務 和cloudera-scm-server服務
/opt/cm-5.11.1/etc/init.d/cloudera-scm-agent?stop
/opt/cm-5.11.1/etc/init.d/cloudera-scm-server?stop
2. 刪除cmf 數據庫,然后重新建立cmf數據庫
mysql –uroot –p
mysql>drop cm5112;?? (自己建立的數據庫)
mysql>drop hive;
mysql>drop hue;
mysql>drop oozie;
mysql>create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql>create database hue DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql>create database oozie DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql>quit
3. 每臺服務器上刪除數據:
rm?-rf?/opt/cm-5.11.1/lib/cloudera-scm-agent/*??
(每臺服務器上都執行)
如果刪除不了執行以下命令再刪除:
sudo?umount?/opt/cm-5.13.0/run/cloudera-scm-agent/process??
4. 執行數據庫初始化
/opt/cm-5.11.1/share/cmf/schema/scm_prepare_database.sh mysql cm5111 -node1 -uroot -pBuct0000! --scm-host node1 root Buct0000! scm??
(node1機器上執行)
[if !supportLineBreakNewLine]
[endif]
5. 重啟服務
/opt/cm-5.11.1/etc/init.d/cloudera-scm-server?start??
/opt/cm-5.11.1/etc/init.d/cloudera-scm-agent?start
6. 開始安裝
五、實驗驗證結果 word count試跑
????? CDH搭建好之后,其實它自帶wordcount的jar包,我們要做的其實只是把我們寫好的words.txt傳到hadoop系統上即可。
????? 步驟:
1、首先為當前用戶在HDFS 創建一個工作目錄,并賦予相應的權限。
??????????? 1.1由于我安裝的時候是用的root用戶,因此也就需要在hdfs中為root用戶創建工作目錄,并授予權限。
?? (1)首先在HDFS中,在用戶目錄/user/下創建一個root用戶文件夾,作為root用戶的工作目錄。執行如下代碼:
sudo -u hdfs?hadoop?fs –mkdir /user/root
(2)授予/user/root目錄相應的權限
1)先將該目錄的所有權賦給root用戶:
sudo -u hdfs hadoop fs –chown root /user/root
2)再將該目錄的組的權限賦給root用戶自己管理:
sudo -u hdfs hadoop fs –chgrp root /user/root
3)最后設置該目錄的權限:
sudo -u hdfs Hadoop fs –chmod 777 /user/root
(該權限是擁有者:可讀可寫可執行;組用戶:可讀可寫可執行;其他用戶:可讀可寫可執行)
1.2、給普通用戶創建HDFS工作目錄,并授予權限。普通用戶與root方法類似,只不過這個過程是需要在root用戶下執行的。
2、本地任意地方創建words文件,并把該文件上傳到hadoop中。
??? #vim words
??????? #hadoop fs –put words /user/root/input
3、測試WordCount例子。
執行測試用例
通過CDH自身的jar來測試,該jar是在/opt/cloudera/parcels/CDH/jars/hadoop-examples.jar包。然后通過在界面執行如下命令:
#hadoop jar /opt/cloudera/parcels/CDH/jars/Hadoop-examples.jar wordcount /user/root/input /user/root/output
4、查看結果
#hadoop fs –cat /user/root/output/part-r-00000
#hadoop fs –cat /user/root/output/part-r-00001
以上代碼需要注意的是/user/root/output必須是未存在的。mapreduce運行完之后,會自動創建。
[if !vml]
[endif]
運行程序
#hadoop jar /opt/cloudera/parcels/CDH/jars/Hadoop-examples.jar wordcount /user/root/input /user/root/output
這個輸入文件夾output不能提前存在,否則會報錯
結果正確: