首頁 > 軟體

docker搭建Hadoop CDH高可用叢集實現

2022-07-12 18:01:21

首先我們為了之後繼續搭建軟體,這裡沒有使用docker-compose,而是通過構建四臺centos,再在裡面搭建我們所需要的元件

宿主機最好提供10 GB的RAM,硬碟佔用大概會在40G以上

本次採用的線上安裝方式,cdh為6.3.2版本,系統為centos7.4, docker節點可以為任意多個,下文將以3個docker容器為範例進行展示。此方法也可用在docker swarm上,docker容器能夠互連,網路互通即可

離線安裝包地址:

連結: https://pan.baidu.com/s/1vMm0yMYya2vhbEabeJMPHQ 提取碼: xbrx

0. docker安裝

解除安裝(可選)

如果之前安裝過舊版本的Docker,可以使用下面命令解除安裝:

yum remove docker 
                  docker-client 
                  docker-client-latest 
                  docker-common 	
                  docker-latest 
                  docker-latest-logrotate 
                  docker-logrotate 
                  docker-selinux 
                  docker-engine-selinux 
                  docker-engine 
                  docker-ce

安裝docker

首先需要大家虛擬機器器聯網,安裝yum工具

yum install -y yum-utils 
           device-mapper-persistent-data 
           lvm2 --skip-broken

然後更新本地映象源:

# 設定docker映象源
yum-config-manager 
    --add-repo 
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 第二步     
sed -i 's/download.docker.com/mirrors.aliyun.com/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
# 第三步
yum makecache fast

然後輸入命令:

yum install -y docker-ce

docker-ce為社群免費版本。稍等片刻,docker即可安裝成功。

1. 構建Centos-cdh映象

宿主機初始化

yum install -y wget   
&& mkdir -p /etc/yum.repos.d/repo_bak   
&& mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/repo_bak/  
&& wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo  
&& wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo    
&& yum clean all   
&& yum makecache   
&& yum update –y    

構建容器的Dockerfile檔案(建立這個檔案)

FROM docker.io/ansible/centos7-ansible
RUN yum -y install openssh-server
RUN yum -y install bind-utils
RUN yum -y install which
RUN yum -y install sudo

在Dockerfile同級目錄執行:

docker build -t centos7-cdh .

生成要用的基礎centos7的映象

接著我們給映象建立一個網橋

docker network create --subnet=172.10.0.0/16 hadoop_net && docker network ls

啟動容器

docker run -d  
--add-host cm.hadoop:172.10.0.2 
--net hadoop_net 
--ip 172.10.0.2 
-h cm.hadoop 
-p 10022:22 
-p 7180:7180 
--restart always 
--name cm.hadoop 
--privileged 
centos7-cdh 
/usr/sbin/init 
&& docker ps  

引數解釋:

  • run -d  # 後臺啟動
  • --add-host cm.hadoop:172.10.0.2  # 給容器分配一個固定的ip,主機名為:cm.hadoop
  • --net hadoop_net # 將容器加入到上一步建立的網橋中
  • -p # 埠對映
  • --restart always # docker重啟後會自動開啟此容器
  • --name cm.hadoop # 給容器起名字,在docker中可以用主機名代替ip映象存取
  • --privileged # 宣告此容器可以客製化化,例如使container內的root擁有真正的root許可權等

2. 容器安裝ClouderaManager

2.1 初始化環境

我們進入容器,設定一些東西

docker exec -it cm.hadoop bash

將root的登入密碼改為root

$ su root
$ passwd
$ root
$ root

安裝基礎環境

yum install -y kde-l10n-Chinese telnet reinstall glibc-common vim wget ntp net-tools && yum clean all

此步如果出錯,請嘗試容器是否可以正常聯網,檢查docker網橋設定

2.2 設定中文環境變數

vim ~/.bashrc ,在末尾新增

export LC_ALL=zh_CN.utf8   
export LANG=zh_CN.utf8    
export LANGUAGE=zh_CN.utf8  

執行

localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 
&& source ~/.bashrc 
&& echo $LANG

2.3 設定NTP時間同步服務

這一步是必須要做的,因為hadoop叢集如果時間不同步會出現通訊失敗的情況

安裝ntp

yum install ntp -y

同步時間

ntpdate -u ntp1.aliyun.com 

修改時區

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

再建立一個定時任務,用於定時同步時間(防止虛擬機器器停止後時間異常)

crontab  -e
# 新增
0 */2 * * * /usr/sbin/ntpdate ntp1.aliyun.com 

啟動ntp服務

systemctl start ntpd && 
systemctl enable ntpd &&  
date

2.4 安裝mysql

使用wget安裝(也可以單獨部署,單獨部署這裡不再贅述):

mkdir -p /root/hadoop__CHD/mysql 
&& wget -O /root/hadoop_CHD/mysql/mysql-5.7.27-1.el7.x86_64.rpm-bundle.tar 
https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.27-1.el7.x86_64.rpm-bundle.tar 
&& ls /root/hadoop_CHD/mysql

使用wget會非常的慢,我們可以上傳給宿主機,然後通過docker命令拷貝給centos-chd

# 前提是容器的/root/hadoop_CHD/mysql目錄必須事先建立。
docker cp mysql-5.7.27-1.el7.x86_64.rpm-bundle.tar {容器ID}:/root/hadoop_CHD/mysql

準備MySQL JDBC驅動

mkdir -p /root/hadoop_CHD/mysql-jdbc 
&& wget -O /root/hadoop_CHD/mysql-jdbc/mysql-connector-java-5.1.48.tar.gz 
https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.48.tar.gz  
&& ls /root/hadoop_CHD/mysql-jdbc

2.5 準備Cloudera-Manager安裝包

這樣下載很慢,建議用finalshell等工具直接從自己的電腦上上傳到虛擬機器器中,直接連線宿主機的10022埠即可

mkdir -p /root/hadoop_CHD/cloudera-repos 
&& wget -O /root/hadoop_CHD/cloudera-repos/allkeys.asc 
https://archive.cloudera.com/cm6/6.3.0/allkeys.asc 
&& wget -O /root/hadoop_CHD/cloudera-repos/cloudera-manager-agent-6.3.0-1281944.el7.x86_64.rpm 
https://archive.cloudera.com/cm6/6.3.0/redhat7/yum/RPMS/x86_64/cloudera-manager-agent-6.3.0-1281944.el7.x86_64.rpm 
&& wget -O /root/hadoop_CHD/cloudera-repos/cloudera-manager-daemons-6.3.0-1281944.el7.x86_64.rpm 
https://archive.cloudera.com/cm6/6.3.0/redhat7/yum/RPMS/x86_64/cloudera-manager-daemons-6.3.0-1281944.el7.x86_64.rpm 
&& wget -O /root/hadoop_CHD/cloudera-repos/cloudera-manager-server-6.3.0-1281944.el7.x86_64.rpm 
https://archive.cloudera.com/cm6/6.3.0/redhat7/yum/RPMS/x86_64/cloudera-manager-server-6.3.0-1281944.el7.x86_64.rpm 
&& wget -O /root/hadoop_CHD/cloudera-repos/cloudera-manager-server-db-2-6.3.0-1281944.el7.x86_64.rpm 
https://archive.cloudera.com/cm6/6.3.0/redhat7/yum/RPMS/x86_64/cloudera-manager-server-db-2-6.3.0-1281944.el7.x86_64.rpm 
&& wget -O /root/hadoop_CHD/cloudera-repos/enterprise-debuginfo-6.3.0-1281944.el7.x86_64.rpm 
https://archive.cloudera.com/cm6/6.3.0/redhat7/yum/RPMS/x86_64/enterprise-debuginfo-6.3.0-1281944.el7.x86_64.rpm 
&& wget -O /root/hadoop_CHD/cloudera-repos/oracle-j2sdk1.8-1.8.0+update181-1.x86_64.rpm 
https://archive.cloudera.com/cm6/6.3.0/redhat7/yum/RPMS/x86_64/oracle-j2sdk1.8-1.8.0+update181-1.x86_64.rpm 
&& ll /root/hadoop_CHD/cloudera-repos

準備Parcel包

mkdir -p /root/hadoop_CHD/parcel 
&& wget -O /root/hadoop_CHD/parcel/ CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel 
https://archive.cloudera.com/cdh6/6.3.2/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel 
&& wget -O /root/hadoop_CHD/parcel/manifest.json 
https://archive.cloudera.com/cdh6/6.3.2/parcels/manifest.json 
&& ll /root/hadoop_CHD/parcel

搭建本地yum源

 yum -y install httpd createrepo  
&& systemctl start httpd 
&& systemctl enable httpd 
&& cd /root/hadoop_CHD/cloudera-repos/ && createrepo . 
&& mv /root/hadoop_CHD/cloudera-repos /var/www/html/ 
&& yum clean all 
&& ll /var/www/html/cloudera-repos

2.6 安裝jdk

yum install -y java-1.8.0-openjdk-devel.x86_64

檢視一下:

java -version

jdk會預設安裝在/usr/lib/jvm目錄下:

這樣安裝沒有設定JAVA_HOME,我們需要進一步設定,不然後面安裝會報錯

(
cat <<EOF
#set java environment
JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME CLASSPATH PATH
EOF
) >> /etc/profile && source /etc/profile && java -version

2.7 啟動前準備

安裝設定MySQL資料庫(採用docker獨立安裝跳過此步)

cd /root/hadoop_CHD/mysql/ 
&& tar -xvf mysql-5.7.27-1.el7.x86_64.rpm-bundle.tar 
&& yum install -y libaio numactl 
&& rpm -ivh mysql-community-common-5.7.27-1.el7.x86_64.rpm 
&& rpm -ivh mysql-community-libs-5.7.27-1.el7.x86_64.rpm   
&& rpm -ivh mysql-community-client-5.7.27-1.el7.x86_64.rpm 
&& rpm -ivh mysql-community-server-5.7.27-1.el7.x86_64.rpm 
&& rpm -ivh mysql-community-libs-compat-5.7.27-1.el7.x86_64.rpm 
&& echo character-set-server=utf8 >> /etc/my.cnf 
&& rm -rf /root/hadoop_CHD/mysql/ 
&& yum clean all 
&& rpm -qa |grep mysql

建資料庫表

(
cat <<EOF
set password for root@localhost = password('123456Aa.');
grant all privileges on *.* to 'root'@'%' identified by '123456Aa.';
flush privileges;
CREATE DATABASE scm DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE amon DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE rman DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE hue DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE metastore DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE sentry DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE nav DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE navms DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE oozie DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON scm.* TO 'scm'@'%' IDENTIFIED BY '123456Aa.';
GRANT ALL ON amon.* TO 'amon'@'%' IDENTIFIED BY '123456Aa.';
GRANT ALL ON rman.* TO 'rman'@'%' IDENTIFIED BY '123456Aa.';
GRANT ALL ON hue.* TO 'hue'@'%' IDENTIFIED BY '123456Aa.';
GRANT ALL ON metastore.* TO 'hive'@'%' IDENTIFIED BY '123456Aa.';
GRANT ALL ON sentry.* TO 'sentry'@'%' IDENTIFIED BY '123456Aa.';
GRANT ALL ON nav.* TO 'nav'@'%' IDENTIFIED BY '123456Aa.';
GRANT ALL ON navms.* TO 'navms'@'%' IDENTIFIED BY '123456Aa.';
GRANT ALL ON oozie.* TO 'oozie'@'%' IDENTIFIED BY '123456Aa.';
SHOW DATABASES;
EOF
) >> /root/c.sql

儲存為:/root/c.sql

獲取MySQL初始密碼

systemctl start mysqld && grep password /var/log/mysqld.log | sed 's/.*(............)$/1/'

執行SQL指令碼

mysql -u root -p

輸入查詢出的預設密碼,然後執行:

source /root/c.sql 

設定mysql jdbc驅動

$ mkdir -p /usr/share/java/
$ cd /root/hadoop_CHD/mysql-jdbc/   
$ tar -zxvf mysql-connector-java-5.1.48.tar.gz 
$ cp  /root/hadoop_CHD/mysql-jdbc/mysql-connector-java-5.1.48/mysql-connector-java-5.1.48-bin.jar /usr/share/java/mysql-connector-java.jar 
$ rm -rf /root/hadoop_CHD/mysql-jdbc/ 
$ ls /usr/share/java/

這裡有坑,就是這個驅動版本不能太高,剛開始我的是5.1.47的驅動,然後就會報錯,換了5.1.6的就好了(手動上傳),還有就是驅動不能帶版本號

名字要為mysql-connector-java.jar

安裝Cloudera Manager

(
cat <<EOF
[cloudera-manager]
name=Cloudera Manager 6.3.0
baseurl=http://172.10.0.2/cloudera-repos/
gpgcheck=0
enabled=1
EOF
) >> /etc/yum.repos.d/cloudera-manager.repo 
&& yum clean all 
&& yum makecache 
&& yum install -y cloudera-manager-daemons cloudera-manager-agent cloudera-manager-server 
&& yum clean all 
&& rpm -qa | grep cloudera-manager

設定parcel庫

cd /opt/cloudera/parcel-repo/;mv /root/hadoop_CHD/parcel/* ./   
&& sha1sum CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel | awk '{ print $1 }' > CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel.sha 
&& rm -rf /root/hadoop_CHD/parcel/  
&& chown -R cloudera-scm:cloudera-scm /opt/cloudera/parcel-repo/*  
&& ll /opt/cloudera/parcel-repo/

初始化scm庫

/opt/cloudera/cm/schema/scm_prepare_database.sh mysql scm scm 123456Aa.

接著上面的,如果驅動沒有問題

啟動cloudera-server服務

systemctl start cloudera-scm-server.service 
&& sleep 2 
&& tail -f /var/log/cloudera-scm-server/cloudera-scm-server.log | grep "INFO WebServerImpl:com.cloudera.server.cmf.WebServerImpl: Started Jetty server"

這裡如果出錯,請多看錯誤紀錄檔,一般為驅動未找到,或者是bean構建失敗等等,如果失敗不要反覆重啟服務,因為scm資料庫裡面的資料很可能會出現問題,應該刪除該資料庫再重新啟動

到這裡如果沒有什麼問題,你可以在你的瀏覽器裡面看到頁面,http://IP:7180/cmf/login 賬號密碼:admin/admin

先別急著操作,先設定兩個slave結點

3. 設定CDH的worker節點

以下為worker容器的準備方式,若為多個時,重複執行以下步驟,建立多個worker節點

3.1 建立多個worker容器

建立2個work容器

Worker-1:

docker run -d  
--add-host cm.hadoop:172.10.0.2 
--add-host cdh01.hadoop:172.10.0.3 
--net hadoop_net 
--ip 172.10.0.3 
-h cdh01.hadoop 
-p 20022:22 
--restart always 
--name cdh01.hadoop 
--privileged 
centos7-cdh 
/usr/sbin/init 
&& docker ps

Worker-2:

docker run -d 
--add-host cm.hadoop:172.10.0.2 
--add-host cdh02.hadoop:172.10.0.4 
--net hadoop_net 
--ip 172.10.0.4 
-h cdh02.hadoop 
-p 30022:22 
--restart always 
--name cdh02.hadoop 
--privileged 
centos7-cdh 
/usr/sbin/init 
&& docker ps

到這裡正常的話我們就有三臺主機了

和之前的操作一樣,先安裝基本工具

上一步建立的所有容器均執行,修改root的登入密碼改為root

$ su root
$ passwd
$ root
$ root

然後執行

設定中文環境

yum install -y kde-l10n-Chinese telnet reinstall glibc-common vim wget ntp net-tools && yum clean all

3.2 環境設定

設定中文環境變數

(
cat <<EOF
export LC_ALL=zh_CN.utf8
export LANG=zh_CN.utf8
export LANGUAGE=zh_CN.utf8
EOF
) >> ~/.bashrc  
&& localedef -c -f UTF-8 -i zh_CN zh_CN.utf8   
&& source ~/.bashrc   
&& echo $LANG

這一步是必須要做的,因為hadoop叢集如果時間不同步會出現通訊失敗的情況

安裝ntp

yum install ntp -y

同步時間

ntpdate -u ntp1.aliyun.com 

修改時區

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

再建立一個定時任務,用於定時同步時間(防止虛擬機器器停止後時間異常)

crontab -e# 新增0 */2 * * * /usr/sbin/ntpdate ntp1.aliyun.com 

啟動ntp服務

systemctl start ntpd && 
systemctl enable ntpd &&  
date

設定MySQL JDBC

這裡為了防止出錯,建議設定和master結點一樣的驅動,且不要帶版本號

mkdir -p /usr/share/java/ 

上傳驅動即可

修改CM主機的host檔案

這樣我們可以很方便的使用後面的名字存取這些主機

echo "172.10.0.3      cdh01.hadoop cdh01" >> /etc/hosts
echo "172.10.0.4      cdh02.hadoop cdh02" >> /etc/hosts

這裡我們還可以設定一下免密碼登入

4. CM管理平臺建立CDH叢集

4.1 登陸CM管理平臺

http://IP:7180/cmf/login 賬號密碼:admin/admin

歡迎介面

此面一直點選繼續,需要同意條款的同意條款

然後就可以來到叢集安裝的歡迎介面

我們來安裝叢集

選擇繼續,並給叢集起一個名字

設定主機地址: 172.10.0.[2-4]

選擇儲存

自定義儲存庫:http://172.10.0.2/cloudera-repos

Jdk安裝

SSH憑據,密碼為容器root使用者的登入密碼,此處為root

安裝代理

安裝巨量資料元件

叢集狀態檢查

叢集設定

選擇你要安裝的元件

選擇好你要安裝的巨量資料元件,然後點繼續

這裡如果選擇了hive之類的元件,需要在cm結點上建立一個資料庫,可以用元件名命名

CREATE DATABASE scm DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE hive DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
grant all privileges on scm.* to scm@'localhost' identified by '密碼';
grant all privileges on scm.* to scm@'%' identified by '密碼';
grant all privileges on hive.* to hive@'localhost' identified by '密碼';
grant all privileges on hive.* to hive@'%' identified by '密碼';
CREATE DATABASE hue DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
grant all privileges on hue.* to hue@'%' identified by '密碼';
grant all privileges on hue.* to hue@'localhost' identified by '密碼2';
CREATE DATABASE rm DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
grant all privileges on rm.* to rm@'localhost' identified by '密碼';
grant all privileges on rm.* to rm@'%' identified by '密碼';
flush privileges;

紅色表示必填的專案

Datanode-> /dfs/datanode

Namenode-> /dfs/namenode

HDFS檢查點-> /dfs/checkpoint

NodeManager 本地目錄-> /dfs/nodemanager

然後就等待叢集構建完成!

到此這篇關於docker搭建Hadoop CDH高可用叢集實現的文章就介紹到這了,更多相關docker Hadoop CDH高可用叢集內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com