天天看點

使用docker-19.03.14搭建hadoop-2.9.2完全分布式叢集-之二-部署和運作.md安裝 Docker建立 hadoop 容器運作容器複制檔案配置 hadoop配置 hive配置 spark生成模闆鏡像啟動 hadoop啟動 hive啟動 spark

安裝 Docker

# 安裝 yum-utils
[[email protected] ~]# yum install -y yum-utils

# 添加Docker CE的yum源
[[email protected] ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[[email protected] ~]# yum makecache fast

# 看一下倉庫裡的最新版本
[[email protected] ~]# yum list docker-ce
[[email protected] ~]# yum -y install docker-ce

[[email protected] ~]# systemctl start docker
[[email protected] ~]# systemctl enable docker

           

建立 hadoop 容器

hadoop 及其元件,放在 docker 中運作,是以先要建立一個基于 centos 鏡像的 hadoop 容器。

這個hadoop 容器,最後會生成鏡像,最終成為所有 hadoop 節點的模闆。

# 搜尋鏡像
[[email protected] ~]# docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   6300                [OK]
## 在搜尋結果清單中OFFICIAL列中有[OK]的表示是官方的鏡像。我們看到第一個就是官方的。

# 拉取
[[email protected] ~]# docker pull centos

# 檢視鏡像
[[email protected] ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0d120b6ccaa8        3 months ago        215MB

docker network create --driver bridge --subnet 192.168.1.0/16 --gateway 192.168.1.0 mynet
解析:
--driver bridge 表示使用橋接模式
--subnet 192.168.1.0/16 表示子網ip 可以配置設定 192.168.1.2 到 192.168.255.255
--gateway 192.168.1.0 表示網關
mynet 表示網絡名


# 建立 docker 網絡
[[email protected] ~]# docker network create --driver bridge --subnet=172.18.0.0/16 --gateway 172.18.0.1 hadoop_nw
# --driver bridge 表示使用橋接模式
# --subnet 172.18.0.0/16 表示子網ip 可以配置設定 172.18.0.2 到 172.18.255.255
# --gateway 172.18.0.1 表示網關

[[email protected] ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
a30056cd8ca2        bridge              bridge              local
c77cddcd1cd9        hadoop_nw           bridge              local
32aadb56edcd        host                host                local
72550a0f5547        none                null                local
[[email protected] ~]# docker network inspect hadoop_nw
...
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
...
## 記住上面的網絡掩碼,本例是 172.18.0.0/16, 這表明了網絡的ip 位址範圍


# 建立并運作容器
[[email protected] ~]# docker run -it -h hadoop --name hadoop centos
## 說明:
## run     表示建立一個容器并運作。
## -it     表示容器運作後直接進入容器内部的指令行。此時就可以像操作虛拟機一樣操作這個容器了。
## -h      表示容器的主機名hostname,和虛拟機的hostname一樣。如果不指定,Docker 會用 CONTAINER ID 來作為 hostname。
## --name  表示容器的名稱。這個前面已經提到了,如果自己不指定,Docker 會自動配置設定一個名稱。不過還是自己指定的更有意義。
## 其中主機名和容器名一不一樣都行,我這裡是給了一樣的,都是 hadoop。
## 最後一個參數centos是鏡像名稱,表示該容器用哪個鏡像建立。
## 這個過程類似于用ISO檔案裝系統。

# 退出并停止目前容器運作
[[email protected] ~]# exit


           

運作容器

# 檢視本機的所有容器(正在進行或停止運作)
[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
5e1930be0f53        centos              "/bin/bash"         5 minutes ago       Exited (0) 3 seconds ago                       hadoop

# 啟動并進入剛才建立的容器
[[email protected] ~]# docker start -i hadoop

           

注意,以下内容在 hadoop 容器内執行

# 修改時區
[[email protected] /]# rm -f /etc/localtime
[[email protected] /]# ln -s /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
[[email protected] /]# echo Asia/Shanghai > /etc/timezone

# 安裝語言包
[[email protected] /]# yum -y install glibc-langpack-en
[[email protected] /]# echo "export LC_ALL=en_US.UTF-8" >> /etc/profile
[[email protected] /]# echo "export LC_CTYPE=en_US.UTF-8" >> /etc/profile
[[email protected] /]# source /etc/profile
## 這個操作完,可能要退出 hadoop 視窗,再進入才生效

# 安裝 SSH
[[email protected] /]# yum -y install openssh-server.x86_64 openssh-clients.x86_64


# 生成三個主機的 key 檔案
## 均不需做鍵盤輸入内容,一路回車即可
[[email protected] /]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
[[email protected] /]# ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
[[email protected] /]# ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

# 運作 SSH
[[email protected] /]# /usr/sbin/sshd

# 設定 root 密碼
[[email protected] /]# yum -y install passwd cracklib-dicts   
[[email protected] /]# passwd
Changing password for user root.
New password: 1qt5!QT%

# 生成使用者的 key 檔案
[[email protected] /]# ssh-keygen

# 設定ssh免密登入到本機
[[email protected] /]# vi /etc/pam.d/sshd
## 注釋下一行
#account    required     pam_nologin.so
[[email protected] /]# ssh-copy-id localhost
[[email protected] /]# ssh localhost
[[email protected] /]# exit

# 運作hadoop需要which指令,同樣容器沒有自帶,需要我們安裝。
[[email protected] /]# yum -y install which

# 退出目前容器并保持其繼續運作
# 快捷鍵 Ctrl+p+q
           

複制檔案

注意,以下内容在主控端執行

[[email protected] ~]# docker cp /root/jdk-8u251-linux-x64.tar.gz hadoop:/root/
[[email protected] ~]# docker cp /root/apache-hive-2.3.7-bin.tar.gz hadoop:/root/
[[email protected] ~]# docker cp /root/hadoop-2.9.2.tar.gz hadoop:/root/
[[email protected] ~]# docker cp /root/scala-2.11.8.tgz hadoop:/root/
[[email protected] ~]# docker cp /root/spark-2.2.0-bin-hadoop2.7.tgz hadoop:/root/
[[email protected] ~]# docker cp /root/mysql-connector-java-5.1.49.tar.gz hadoop:/root/

# 進入容器
[[email protected] ~]# docker attach hadoop

           

注意,以下内容在 hadoop 容器内執行

[[email protected] /]# cd /root
[[email protected] ~]# tar xzf jdk-8u251-linux-x64.tar.gz
[[email protected] ~]# tar xzf hadoop-2.9.2.tar.gz
[[email protected] ~]# tar xzf apache-hive-2.3.7-bin.tar.gz
[[email protected] ~]# tar xzf scala-2.11.8.tgz
[[email protected] ~]# tar xzf spark-2.2.0-bin-hadoop2.7.tgz
[[email protected] ~]# tar xzf mysql-connector-java-5.1.49.tar.gz

[[email protected] ~]# mkdir /root/hadoop-2.9.2/data
[[email protected] ~]# mv apache-hive-2.3.7-bin hive-2.3.7
[[email protected] ~]# cp mysql-connector-java-5.1.49/mysql-connector-java-5.1.49.jar ./hive-2.3.7/lib/
[[email protected] ~]# mv spark-2.2.0-bin-hadoop2.7 spark-2.2.0


[[email protected] ~]# vi /etc/profile.d/run.sh
export JAVA_HOME=/root/jdk1.8.0_251
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/root/hadoop-2.9.2
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HIVE_HOME=/root/hive-2.3.7
export PATH=$PATH:$HIVE_HOME/bin
/usr/sbin/sshd

[[email protected] ~]# source /etc/profile

           

hadoop-2.9.2

apache-hive-2.3.7-bin

scala-2.11.8

spark-2.2.0-bin-hadoop2.7

mysql-connector-java-5.1.49

配置 hadoop

注意,以下内容在 hadoop 容器内執行

[[email protected] ~]# cd /root/hadoop-2.9.2/etc/hadoop
[[email protected] hadoop]# vi hadoop-env.sh
## 修改如下鍵值
export JAVA_HOME=/root/jdk1.8.0_251

[[email protected] hadoop]# vi core-site.xml
# 增加如下内容
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop11:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/root/hadoop-2.9.2/data</value>
    </property>
	<property>
		<name>hadoop.proxyuser.root.hosts</name>
		<value>*</value>
	</property>
	<property>
		<name>hadoop.proxyuser.root.groups</name>
		<value>*</value>
	</property>

[[email protected] hadoop]# vi hdfs-site.xml
# 增加如下内容
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop11:50090</value>
    </property>

[[email protected] hadoop]# vi mapred-site.xml
# 增加如下内容
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop11:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop11:19888</value>
    </property>
</configuration>


[[email protected] hadoop]# vi yarn-site.xml
# 增加如下内容
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop11</value>
    </property>
    <property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>1</value>
    </property>
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>1536</value>
    </property>	
	<property>
		<name>yarn.nodemanager.pmem-check-enabled</name>
		<value>false</value>
	</property>
	<property>
		<name>yarn.nodemanager.vmem-check-enabled</name>
		<value>false</value>
	</property>

</configuration>

[[email protected] hadoop]# vi slaves
hadoop11
hadoop12
hadoop13

           

配置 hive

注意,以下内容在 hadoop 容器内執行

[[email protected] hadoop]# cd /root/hive-2.3.7/conf/
[[email protected] hadoop]# cp hive-default.xml.template hive-site.xml
[[email protected] hadoop]# vi hive-site.xml
# 最前面添加
  <property>
    <name>system:java.io.tmpdir</name>
    <value>/tmp/hive/java</value>
  </property>
  <property>
    <name>system:user.name</name>
    <value>${user.name}</value>
  </property>
# 逐項修改如下鍵值
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>1qt5!QT%</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>mysql
        <value>jdbc:mysql://172.18.0.1:3306/hive?useSSL=false&amp;allowPublicKeyRetrieval=true</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>
	
[[email protected] conf]# cp hive-env.sh.template hive-env.sh
[[email protected] conf]# vi hive-env.sh
export HADOOP_HOME=/root/hadoop-2.9.2
export HIVE_CONF_DIR=/root/hive-2.3.7/conf
export HIVE_AUX_JARS_PATH=/root/hive-2.3.7/lib


           

配置 spark

注意,以下内容在 hadoop 容器内執行

[[email protected] ~]# cd /root/spark-2.2.0/conf
[[email protected] ~]# cp spark-env.sh.template spark-env.sh
[[email protected] ~]# vi spark-env.sh
# 添加如下内容
# 配置各種軟體的HOME,一般來說不配置也可以,但是可能會出現問題,還是配上
export JAVA_HOME=/root/jdk1.8.0_251
export HADOOP_HOME=/root/hadoop-2.9.2
export HADOOP_CONF_DIR=/root/hadoop-2.9.2/etc/hadoop
export SCALA_HOME=/root/scala-2.11.8
export SPARK_HOME=/root/spark-2.2.0
# 設定Master的IP
export SPARK_MASTER_IP=172.18.0.11
# 設定Master的主機名
export SPARK_MASTER_HOST=hadoop11
# 設定本節點的IP
export SPARK_LOCAL_IP=172.18.0.11
# 每一個Worker最多可以使用的記憶體
export SPARK_WORKER_MEMORY=1g
# 每一個Worker最多可以使用的cpu core的個數
export SPARK_WORKER_CORES=1
# 送出Application的端口,預設就是這個,萬一要改呢,改這裡
export SPARK_MASTER_WEBUI_PORT=8080
export SPARK_DIST_CLASSPATH=$(/root/hadoop-2.9.2/bin/hadoop classpath)
## 注意,上面 SPARK_LOCAL_IP 這個配置項的值,等會生成各節點容器後要改成各自節點的ip位址

[[email protected] ~]# cp slaves.template slaves
[[email protected] ~]# vi slaves
hadoop11
hadoop12
hadoop13

           

生成模闆鏡像

注意,以下内容在主控端執行

将上面的 hadoop 容器打包成鏡像

[[email protected] ~]# docker commit -a "luchunyu" -m "Hadoop在centos上搭建的分布模式" hadoop hadoop-centos:v1
sha256:8e9f85b18c9392ec4e2561b72e0ba225f5a91ab9a8d0cb2b45278e6ec258536d
[[email protected] ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hadoop-centos       v1                  8e9f85b18c93        53 seconds ago      3.11GB
centos              latest              0d120b6ccaa8        3 months ago        215MB

           

-a 表示作者。

-m 表示對該鏡像的說明。

pseudo-distributed 被打包容器的名稱

hadoop-centos:v1 生成鏡像的名稱及版本

需要知道的是,因為這個被打包的容器是通過centos鏡像建立的,是以由該容器打包成的新鏡像也包含了centos鏡像。

用新生成的鏡像建立 4 個容器

[[email protected] ~]# docker run -itd -h hadoop11 --name hadoop11 --network=hadoop_nw --ip 172.18.0.11 -p 50070:50070 -p 8088:8088 -p 19888:19888 -p 10000:10000 hadoop-centos:v1
[[email protected] ~]# docker run -itd -h hadoop12 --name hadoop12 --network=hadoop_nw --ip 172.18.0.12 hadoop-centos:v1
[[email protected] ~]# docker run -itd -h hadoop13 --name hadoop13 --network=hadoop_nw --ip 172.18.0.13 hadoop-centos:v1
[[email protected] ~]# docker run -itd -h client --name client --network=hadoop_nw --ip 172.18.0.10 hadoop-centos:v1

[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS                                                                                                  NAMES
f3a4357b7b4a        hadoop-centos:v1    "/bin/bash"         4 seconds ago       Up 3 seconds                                                                                                                     client
8bea9c87b37d        hadoop-centos:v1    "/bin/bash"         17 seconds ago      Up 16 seconds                                                                                                                    hadoop13
e0b2121b5ccc        hadoop-centos:v1    "/bin/bash"         22 seconds ago      Up 21 seconds                                                                                                                    hadoop12
5f5ffa81a6fd        hadoop-centos:v1    "/bin/bash"         32 seconds ago      Up 30 seconds             0.0.0.0:8088->8088/tcp, 0.0.0.0:10000->10000/tcp, 0.0.0.0:19888->19888/tcp, 0.0.0.0:50070->50070/tcp   hadoop11
5e1930be0f53        centos              "/bin/bash"         5 days ago          Exited (130) 2 days ago                                                                                                          hadoop
[[email protected] ~]# 


           

啟動 hadoop

在 client 節點執行

配置節點間SSH免密登入

[[email protected] ~]# docker attach client
# 這一步貌似可以不執行,因為在制作 hadoop 容器時,已經生成了 key 檔案,并實作了免密登入,
# 是以現在複制的三台,key都是一樣的,就可以自動登入了。
[[email protected] /]# ssh-copy-id hadoop11
[[email protected] /]# ssh-copy-id hadoop12
[[email protected] /]# ssh-copy-id hadoop13

# 從 client ssh 登入到 hadoop11,然後再分别執行一下到 hadoop11,hadoop12,hadoop13伺服器的 ssh 登入指令
# 以便在 hadoop11 上生成 known_hosts 清單

           

啟動

[[email protected] /]# ssh hadoop11 "hdfs namenode -format"
[[email protected] /]# ssh hadoop11 "start-dfs.sh"

[[email protected] /]# ssh hadoop11 "start-yarn.sh"
[[email protected] /]# ssh hadoop11 "mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR start historyserver"

           

在浏覽器中檢視叢集資訊

HDFS http://192.168.109.128:50070/

YARN http://192.168.109.128:8088/

jobhistory http://192.168.109.128:19888/

運作wordcount示例程式

# 準備資料
[[email protected] /]# mkdir /root/input
[[email protected] /]# ls --help > /root/input/ls.txt
[[email protected] /]# df --help > /root/input/df.txt
[[email protected] /]# fdisk --help > /root/input/fdisk.txt
[[email protected] /]# hadoop fs -put /root/input /

# 運作
[[email protected] /]# hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /input /output

[[email protected] /]# hadoop fs -cat /output/*

           

啟動 hive

在 client 節點執行

[[email protected] /]# rm -f /root/hive-2.3.7/conf/hive-site.xml
[[email protected] /]# vi /root/hive-2.3.7/conf/hive-site.xml
# 添加如下内容
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<property>
  <name>hive.metastore.warehouse.dir</name>
  <value>/user/hive/warehouse</value>
</property>

<property>
  <name>hive.metastore.local</name>
  <value>false</value>
</property>
<property>
  <name>hive.metastore.uris</name>
  <value>thrift://hadoop11:9083</value>
</property>
</configuration>

# 初始化
[[email protected] /]# ssh hadoop11 "schematool -dbType mysql -initSchema --verbose"
# 啟動 hive server 端
[[email protected] /]# ssh hadoop11 "nohup hive --service metastore 1>/dev/null 2>&1 &"
# 啟動 hiveserver2
[[email protected] /]# ssh hadoop11 "nohup hiveserver2 1>/dev/null 2>&1 &"

# 測試一下
[[email protected] /]# beeline -u 'jdbc:hive2://hadoop11:10000' -n root

           

啟動 spark

在 client 節點執行

# 修改所有節點 spark-env.sh 中的 SPARK_LOCAL_IP 為對應的 IP
[[email protected] /]# vi /root/spark-2.2.0/conf/spark-env.sh
[[email protected] /]# ssh hadoop11
[[email protected] /]# ssh hadoop12
[[email protected] /]# ssh hadoop13
[[email protected] /]# ssh client

# 啟動 spark 叢集
[[email protected] /]# ssh hadoop11 "/root/spark-2.2.0/sbin/start-all.sh"
# 停止 spark 叢集
[[email protected] /]# ssh hadoop11 "/root/spark-2.2.0/sbin/stop-all.sh"

# 測試一下
[[email protected] /]# /root/spark-2.2.0/bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client --driver-memory 1G --executor-memory 1G --executor-cores 1 /root/spark-2.2.0/examples/jars/spark-examples_2.11-2.2.0.jar 40

           

繼續閱讀