1 軟件准備
安裝環境:系統是CentOS7,64位,安裝過程中的所有軟件需適應這個系統。本文是使用root用戶安裝。
使用linux命令可查看自己的操作系統:
注意:如果在虛擬機上安裝CentOS7,使用了最小安裝,在啟動CM的時候可能可能會報pstree找不到的錯誤。
1 [root@master ~]# uname -a 2 Linux master 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
注意:本文中的linux命令如果直接復制執行容易導致不可用。
整體把握:對所有節點:解壓cm到/opt目錄下,解壓后會生成兩個目錄
1、cloudera
2、cm-5.8.2
其中cloudera目錄下有兩個空目錄csd 和 parcel-repo ,其中parcel-repo是用來存放parcels(三個)文件的
或者也可以僅在master上解壓,然后scp到其它節點。
所以,master需要手動安裝的是CM和parels(三個文件), 而slave只需要安裝CM, 在CDH初始化的過程中會自動把parces等文件復制到slave節點上。
集群節點設定:
master,slave01 ,slave02,slave03
1.1 離線下載CDH和CM軟件包
以下軟件最好先離線下載好:
(1)到官網下載CDH的parcels,包括三個文件(每個版本都需要對應的以下三個文件),這三個文件是CDH主程序運行包,所有hadoop框架就在這些包中,僅需要在hadoop集群上的master節點上安裝的:
CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel
CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha1
manifest.json
(2)在官網下載CDH管理包CM,這個是在hadoop集群的所有節點上都需要安裝的管理集群的軟件包。
cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz
(3) CDH依賴jdk,需要下載比較新的版本的jdk,本安裝使用1.8版本:需要在hadoop集群的所有節點上安裝jdk。
jdk-8u45-linux-x64.tar.gz
(4)安裝mysql數據庫服務,至少需要一個節點安裝mysql數據庫,為了平衡集群壓力,可以在所有節點安裝msyql服務,把有些服務分散放在其它節點上。 mysql服務的安裝可能有多種方式。本教程通過rpm和yum結合的方式。需要注意:mysql數據庫需要和(5)中的java驅動版本匹配。(可以參考博文:https://www.cnblogs.com/junzi/p/6893122.html )
(5)在安裝了mysql服務的節點上安裝mysql數據庫的java驅動程序:
mysql-connector-java-5.1.46.tar.gz
2 基礎環境搭建
2.1 創建一台linux虛擬主機,我的是CentOS7系統
(1)在VMware中新建一台虛擬linux電腦。建立過程中一定要記錄下來IP,子網掩碼,網關,DNS 。推薦虛擬機配置如下
(2)開機后使用ip add命令查看ip等信息
(3)更新yum源。執行命令:yum -y update 。如果更新或下載的網速較慢,可以更換為阿里的yum源或網易的yum源,這些國內的源。阿里雲的yum源地址:
文件下載地址: http://mirrors.aliyun.com/repo/Centos-7.repo
備份並替換系統的repo文件
cp Centos-7.repo /etc/yum.repos.d/ cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo.bak mv Centos-7.repo CentOS-Base.repo #更新 yum clean all #服務器的包信息下載到本地電腦緩存起來 yum makecache yum update -y
(4) 修改hostname為master 。使用命令:
hostnamectl set-hostname master #使用hostname命令查看生效 master
(5)修改靜態IP。(省略)
(6)關閉防火牆
#查看防火牆狀態: firewall-cmd --state #關閉防火牆: systemctl stop firewalld.service #禁止防火牆開機啟動: systemctl disable firewalld.service #查看服務是否開機啟動: systemctl is-enabled firewalld.service
(7)關閉SELINUX
#查看關閉狀態 /usr/sbin/sestatus -v #關閉方法 vi /etc/selinux/config #修改文件里的SELINUX=disabled
(8)打開句柄限制,使用進入編輯配置文件命令:
vi /etc/security/limits.conf #根據當前用戶名,添加 root soft nproc 20470 root hard nproc 163840 root soft nofile 10240 root hard nofile 655360 root soft stack 10240 #執行命令,編輯login配置文件 vi /etc/pam.d/login #添加 session required pam_limits.so
(9)修改hosts文件。此步驟需要最好提前安排好其它節點的ip和hostname,提前添加到hosts配置文件中。在后面的步驟中能省略
示例:
#執行命令: vi /etc/hosts #添加信息: 192.168.30.136 master 192.168.30.137 slave01 192.168.30.138 slave02 192.168.30.139 slave03
(10)如果是root用戶,需要各節點的root用戶的ssh。則需要額外修改一下配置:允許root用戶ssh,且不需要密碼。
#執行命令: vi /etc/ssh/sshd_config #調整PermitRootLogin參數值為yes
①調整PermitRootLogin參數值為yes,並打開選項
②將PermitEmptyPasswords選項打開,並修改值為yes
需要重啟ssh服務:
service sshd restart # 或者 /etc/initd.d/sshd restart
2.2 克隆集群所需的機器
將以上2.1操作的主機作為master主機,完整克隆機器master, 克隆出來3台節點機器。三台節點機的hostname分別設定為:slave01 , slave02 , slave03。對所有節點機器,slave01 , slave02 , slave03。分別設置靜態ip,執行命令。
#修改主機名 hostnamectl set-hostname slave0x #修改靜態IP,修改ip分別為137,138,139等指定ip vi /etc/sysconfig/network-scripts/ifcfg-ens33
2.3 打通master到其它節點的root用戶的ssh
ssh可以使用root用戶,也可以使用非root用戶。本教程使用root用戶安裝,執行root的ssh配置。CDH的ssh配置,僅需要master的單向ssh即可。即:master可以免密訪問其它slave節點。以下所有操作都是使用root用戶。感覺建立一個hadoop用戶,使用hadoop用戶安裝比較好。但是如果使用非root用戶,需要配置非root用戶和root用戶的免密切換。使用root用戶安裝會更順利,不會有權限問題。但即使是root用戶,在CDH中使用命令行的時候,也需要非root用戶,比如hdfs用戶,yarn用戶。
- 登陸master節點
執行命令,產生密鑰
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
- 登陸其它slave節點
#在當前節點的當前用戶下生成.ssh目錄 ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
- 再登陸master節點
#執行遠程復制命令,將master的公鑰放在其它slave節點上 scp ~/.ssh/authorized_keys root@slave0X:~/.ssh/
- 再登陸所有節點(包括master和slaves)
#修改目錄權限 chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh
最后,驗證ssh命令是否生效。在master上分別免密登陸所有節點,包括自己。
2.4下載安裝所需輔助軟件或有用工具
所有集群的節點創建好后,並且分配了靜態ip后,開始執行安裝。【注意:軟件安裝需要在所有節點上分別獨立執行。如果是先安裝再克隆的話可能在后續中會報各種驚喜的錯誤】。這些軟件不一定全部會使用到,感興趣可以仔細研究。為了方便,我把這些軟件作為大數據應用上linux的常用軟件。總之,軟件有冗余,也是為了防止在安裝和使用CDH的時候不報錯。自定義安裝某些常用工具,執行命令:
yum install -y openssh-server vim gcc gcc-c++ glibc-headers bzip2-devel lzo-devel curl wget openssh-clients zlib-devel autoconf automake cmake libtool openssl-devel fuse-devel snappy-devel telnet unzip zip net-tools.x86_64 firewalld systemd lrzsz bzip2 #安裝第二批依賴包(即使與前面有重復也不影響) yum -y install chkconfig python bind-utils psmisc libxslt zlib sqlite cyrus-sasl-plain cyrus-sasl-gssapi fuse fuse-libs redhat-lsb
2.5 在所有節點上安裝jdk
需要在集群的所有節點上安裝jdk,【登錄所有節點】在所有節點上操作:
#查看是否自帶OpenJDK: rpm -qa | grep java #如果有,卸載自帶的JDK rpm -e --nodeps 包名
開始安裝jdk:
- 情況1:可以使用rpm安裝包安裝:
先離線下載rpm安裝包 jdk-8u45-linux-x64.rpm到 /usr/local/src中。執行命令:
rpm -ivh jdk-8u145-linux-x64.rpm #-ivh:安裝時顯示安裝進度 #安裝目錄默認在 /usr/java, 配置環境變量在 /etc/profile 文件中,在文件尾部追加環境變量 export JAVA_HOME=/usr/java/jdk1.8.0_145 export JRE_HOME=$JAVA_HOME/jre export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
-
情況2: 使用離線安裝包jdk-8u45-linux-x64.tar.gz
cd /usr/local/src #上傳安裝包 rz #解壓 tar –xzf /usr/local/src/jdk-8u45-linux-x64.tar.gz –C /usr/java/ #配置環境變量 vim /etc/profile #在文件末尾添加配置信息: export JAVA_HOME=/usr/java/jdk1.8.0_145 export JRE_HOME=$JAVA_HOME/jre export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
以上兩種情況保存后刷新,執行命令:
source /etc/profile
完成后,在所有節點上驗證jdk是否安裝成功:執行命令:
java -version
2.6 安裝MySQL服務
只需要在master節點上安裝mysql服務。CDH的配置依賴mysql數據庫,當然也可以使用Oracle數據庫。
注意:最好在每個節點上都安裝mysql服務,因為有些hadoop的組件的服務依賴數據庫,這樣可以把這個組件的服務安裝到任何一個節點上,分擔master節點的壓力。
【登陸所有節點,本次在所有節點上都安裝mysql】
#進入資源目錄 cd /usr/local/src #獲取mysql源安裝包 wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm #安裝mysql源 rpm -ivh mysql57-community-release-el7-11.noarch.rpm #檢查mysql源是否安裝成功 yum repolist enabled | grep "mysql.*-community.*" #用yum命令安裝mysql yum install mysql-community-server #配置mysql的文件目錄,查看MYSQL配置文件加載順序: mysqld --help --verbose | grep -A1 -B1 cnf
修改/etc/my.cnf 配置文件內的文件目錄
datadir=/data/mysql/data sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION log-error=/data/mysql/log/mysqld.log

創建mysql文件目錄
[root@localhost jar]# mkdir -p /data/mysql/data [root@localhost jar]# mkdir -p /data/mysql/log
生成首次登錄隨機密碼
mysqld --initialize

修改mysql 文件目錄所有者為 mysql 用戶
chown -R mysql:mysql /data/mysql
啟動mysql
systemctl start mysqld.service
在使用啟動命令后如果報錯: Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
可能是沒有關閉SELinux。 解決辦法:vim /etc/selinux/config 修改SELINUX=disabled 。然后重啟即可
關閉並重啟mysql
systemctl stop mysqld.service
systemctl start mysqld.service
如果再次啟動報錯,就重啟Linux 系統。
用生成的隨機密碼登錄mysql
mysql -uroot -p'ujkq0>4*/yMD'
登錄后進入mysql 命令行
卸載mysql
rpm -qa | grep -i mysql
用yum -y remove 卸載所有mysql
rm -rf /data/mysql
可參考: http://www.cnblogs.com/wy123/archive/2017/06/02/6932166.html
修改ROOT用戶密碼
SHOW VARIABLES LIKE 'validate_password%';
如果不為空,在重置時不想密碼設置得那么復雜。需要設置validate_password_policy 參數:
set global validate_password_policy=0;
set password=PASSWORD('12345678');
設置完密碼后,需要用新密碼重新登錄
修改user表,把Host表內容修改為%
進入mysql
use mysql; update user set host='%' where host='localhost'; -- 刪除root用戶的其他host
創建CDH相關數據庫
create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci; create database amon DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
create database oozie DEFAULT CHARSET utf8 COLLATE utf8_general_ci; create database hue default charset utf8 collate utf8_general_ci; -- 授權: grant all privileges on *.* to 'root'@'%' identified by '12345678' with grant option; flush privileges;
2.7 ntp時鍾同步(必須root用戶)
集群設置:master是管理機,所有其它slave節點不能連網同步時間,僅通過與master主機連接實現與master的時間同步。在所有節點上安裝ntp服務。在master節點上開通ntp服務器功能,提供同步時間。參考博文:https://www.cnblogs.com/harrymore/p/9566229.html
【登錄所有節點,包括master和slaves】
(1)檢查ntp是否安裝
rpm -qa|grep ntp
(2)如果沒有安裝,進行安裝
yum -y install ntp
(3)修改ntp配置文件
【登錄master節點】
vi /etc/ntp.conf
修改內容如下:
a) 修改1(授權192.168.1.0網段上的所有機器可以從這台機器上查詢和同步時間)
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap 修改為 restrict 192.168.30.0 mask 255.255.255.0 nomodify notrap #ip地址根據自己的網段進行配置
b) 修改2(集群在局域網中,不使用其他的網絡時間)
server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst 為 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst
c) 添加3 (當該節點丟失網絡連接,依然可以作為時間服務器為集群中的其他節點提供時間同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
d) 修改/etc/sysconfig/ntpd 文件
vim /etc/sysconfig/ntpd #增加內容如下(讓硬件時間與系統時間一起同步) SYNC_HWCLOCK=yes
e) 重新啟動ntpd服務
service ntpd status service ntpd start #在master上設置ntpd服務開機啟動: chkconfig ntpd on
【登錄其它所有slaves節點上】
a) 在slave節點上設置ntpd服務關閉,且關閉開機啟動
#在slave節點上設置ntpd服務關閉,且關閉開機啟動 service ntpd stop chkconfig ntpd off
b) 其它slave節點的同步設置,同步master的時間 【必須root用戶操作】
#配置10分鍾與時間服務器同步一次 crontab –e #編寫定時任務如下: */10 * * * * /usr/sbin/ntpdate master #修改任意機器的時間,驗證同步功能 date -s "2017-9-11 11:11:11" #十分鍾后查看機器是否與時間服務器同步 date
遇到的問題:以上ntp服務配置完成后,可能在CM管理界面會出現slaves節點的 “時鍾偏差” 報錯提示。雖然設定了定時同步時間,但是CM會檢查每個節點上的ntp服務是否使用,因為以上的配置中我們關閉了。之所以關閉也是因為,如果開啟了ntp服務,那么在從節點上執行ntpdate master的命令時會報錯:
[root@slave01 ~]# ntpdate master 19 Dec 22:07:14 ntpdate[9787]: the NTP socket is in use, exiting
可能是ntp的端口沖突問題。解決辦法:
#step1: 將定時任務的命令修改為 */10 * * * * /usr/sbin/ntpdate -u master #step2:開啟slaves所有節點的ntp服務並開機啟動 service ntpd start chkconfig ntpd on
以上兩步操作完稍等片刻,CM界面就不報錯了。
參考:https://blog.csdn.net/qq_28351465/article/details/82995616
3 Cloudera Manager的安裝
CM用於管理集群,需要將cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz 上傳到所有節點。
3.1 上傳並解壓CM安裝包
【登錄所有節點,包括master和slaves】,所有集群中的機器都需要安裝。
解壓cm到/opt目錄下,生成兩個目錄
1、cloudera 2、cm-5.8.2 。
其中cloudera目錄下有兩個空目錄csd 和 parcel-repo ,其中parcel-repo是用來存放CDH主程序的,即parcels(三個)文件。也可以僅上傳到master后再解壓,然后scp到其它節點的 /opt目錄下
#先上傳到master節點的/usr/local/src目錄下 #切換目錄 cd /usr/local/src #上傳 rz #scp到其它所有機器上的/usr/local/src目錄下 #復制到slave01節點 scp /usr/local/src/cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz root@slave01:/usr/local/src/ #復制到slave02節點 scp /usr/local/src/cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz root@slave02:/usr/local/src/ #復制到slave03節點 scp /usr/local/src/cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz root@slave03:/usr/local/src/ #解壓所有的CM包在各自節點的/opt目錄下,在所有節點上執行 tar -xzf /usr/local/src/cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz -C /opt
3.2 創建cloudera-scm用戶
【登錄所有節點】,在所有節點上創建cloudera-scm用戶
useradd --system --home=/opt/module/cloudera-manager/cm-5.12.1/run/cloudera-scm-server --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm
--system 創建一個系統賬戶
--home 指定用戶登入時的主目錄,替換系統默認值/home/<用戶名>
--no-create-home 不要創建用戶的主目錄
--shell 用戶的登錄 shell 名
--comment 用戶的描述信息
注意:
Cloudera Manager默認用戶為cloudera-scm,創建具有此名稱的用戶是最簡單的方法。 安裝完成后,將自動使用此用戶
3.3 配置CM-agent
【登錄所有節點】
vim /opt/cm-5.8.2/etc/cloudera-scm-agent/config.ini #修改server_host為master server_host=master
3.4 配置CM的數據庫
【登錄所有安裝mysql的節點】
添加mysql connector包
#先登錄master cd /usr/local/src rz #上傳mysql-connector-java-5.1.46.tar.gz #分發到其它節點 scp /usr/local/src/mysql-connector-java-5.1.46.tar.gz root@slave01:/usr/local/src scp /usr/local/src/mysql-connector-java-5.1.46.tar.gz root@slave02:/usr/local/src scp /usr/local/src/mysql-connector-java-5.1.46.tar.gz root@slave03:/usr/local/src #對所有節點解壓 tar -xzf mysql-connector-java-5.1.46.tar.gz #移動jar包 mkdir /usr/share/java cd /usr/local/src/mysql-connector-java-5.1.46 cp mysql-connector-java-5.1.46-bin.jar /usr/share/java cd /usr/share/java #必須修改為名稱為mysql-connector-java.jar的包名,否則找不到 ln -s mysql-connector-java-5.1.46-bin.jar mysql-connector-java.jar
【只登錄master】,集群中cm庫只能有一個。所以只在一個節點上操作
在mysql中創建cm庫
執行命令:
/opt/cm-5.8.2/share/cmf/schema/scm_prepare_database.sh mysql cm -hmaster -uroot -p12345678 --scm-host master scm scm scm
參數解釋依次是:
mysql:數據庫用的是mysql,如果安裝過程中用的oracle,那么該參數就應該改為oracle
cm:表示在mysql數據庫中創建cm database
-h:Database host 表示安裝數據庫的主機名 (我是在在master上安裝的MySQL數據庫,所以我指定了master)
-u: mysql數據庫用戶名
-p: mysql數據庫登錄密碼
--scm-host master :CMS的主機,一般是和mysql安裝的主機是在同一個主機上
最后三個scm參數是:數據庫名,數據庫用戶名,數據庫密碼
執行完創建cm庫的命令后,只有當看到All done, your SCM database is configured correctly!這句話時,表明命令操作是成功的.在執行這行命令后,會遇到很多問題,最常見到的是用戶權限問題,這個自行百度吧,或者查看我的另一篇博客:安裝CDH過程中所遇到的問題整理。
3.5 將cdh三個安裝文件上傳到master的parcel-repo目錄下
【登錄master節點】
cd /opt/cloudera/parcel-repo/ rz #上傳CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel #上傳CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha1 #上傳manifest.json #修改CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha1的文件名為CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha mv CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha1 CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha
3.6 啟動CM:
【在master節點上】啟動cm-server
[root@master parcel-repo]# /opt/cm-5.8.2/etc/init.d/cloudera-scm-server start Starting cloudera-scm-server: [ 確定 ] [root@master parcel-repo]#
【在所有節點上,包括master和slaves】啟動cm-agent
/opt/cm-5.8.2/etc/init.d/cloudera-scm-agent start
注意:啟動過程非常慢,Manager 啟動成功需要等待一段時間,過程中會在數據庫中創建對應的表需要耗費一些時間。
一段時間過后,可以使用下列命令在master上查看7180端口是否已經啟動: netstat -anp | grep 7180 如果查看被占用則表示安裝成功了!!!
進入瀏覽器輸入地址,例如:http://192.168.30.136:7180 可以登錄cm管理集群,安裝cdh子功能。