Docker搭建HDFS+Spark集群


准備

啟動一個centos容器

docker run -i -t --name hadoop centos /bin/bash

下載好需要的包

[root@CyzLearnCloud sparklearn]# wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie"  https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz
[root@CyzLearnCloud sparklearn]# wget http://distfiles.macports.org/scala2.12/scala-2.12.12.tgz
[root@CyzLearnCloud sparklearn]# wget https://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz
[root@CyzLearnCloud sparklearn]# wget https://mirror.bit.edu.cn/apache/spark/spark-3.0.1/spark-3.0.1-bin-hadoop3.2.tgz

解壓 上傳

image-20200926211528543

[root@CyzLearnCloud sparklearn]# docker cp hadoop-3.2.1 e9d7c:/opt
[root@CyzLearnCloud sparklearn]# docker cp jdk1.8.0_131  e9d7c:/opt
[root@CyzLearnCloud sparklearn]# docker cp scala-2.12.12  e9d7c:/opt
[root@CyzLearnCloud sparklearn]# docker cp spark-3.0.1-bin-hadoop3.2 e9d7c:/opt

配置jdk

設置java 環境變量,配置profile

vi /etc/profile

在文件末尾加上

JAVA_HOME=/opt/jdk1.8.0_131/
JAVA_BIN=/opt/jdk1.8.0_131/bin
JRE_HOME=/opt/jdk1.8.0_131/jre
CLASSPATH=/opt/jdk1.8.0_131/jre/lib:/opt/jdk1.8.0_131/lib:/opt/jdk1.8.0_131/jre/lib/charsets.jar
export  JAVA_HOME  JAVA_BIN JRE_HOME  PATH  CLASSPATH

使得配置立馬有效

source /etc/profile

配置 bashrc

vi ~/.bashrc

在文件末尾加上

export JAVA_HOME=/opt/jdk1.8.0_131
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

使得配置立馬有效

source ~/.bashrc

查看成功: java -version

配置scala

配置環境變量

vim /etc/profile
export SCALA_HOME=/opt/scala-2.12.12
export PATH=$PATH:$SCALA_HOME/bin

環境變量生效

source /etc/profile

查看scala版本

scala -version

配置Hadoop

在hadoop目錄下

 vi etc/hadoop/hadoop-env.sh

在文件末尾添加jdk目錄(這里=后面添加的是你的jdk目錄)

export JAVA_HOME=/opt/jdk1.8.0_131

檢查安裝的hadoop是否可用 ./bin/hadoop version (注意要在hadoop的安裝目錄下執行)

image-20200926214220911

  • 配置hadoop環境變量

前面在驗證hadoop命令的時候需要在hadoop的安裝目錄下執行./bin/hadoop,為了方便在任意地方執行hadoop命令,配置hadoop的全局環境變量,與java一樣,修改~/.bashrc文件

執行vi ~/.bashrc

添加內容

export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin

image-20200926214419909

source ~/.bashrc 使環境變量生效

hadoop version 驗證變量生效

image-20200926214502123

安裝ssh

yum install openssh-clients
yum install openssh-server

驗證ssh安裝

/usr/sbin/sshd
ssh localhost

可能會出現

Unable to load host key: /etc/ssh/ssh_host_rsa_key
Unable to load host key: /etc/ssh/ssh_host_ecdsa_key
Unable to load host key: /etc/ssh/ssh_host_ed25519_key

的錯誤,運行以下即可

#RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
#RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
#RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
#RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key

commit

docker commit -m "centos7 with hadoop and ssh" e9d7 centos7-hadoop-sshtest

image-20200927130121708

編寫Dockerfile

這一步的主要目的是,讓容器啟動的時候自動運行ssh

mkdir centos7-hadoop-ssh
cd centos7-hadoop-ssh
vi Dockerfile

加入以下內容

# 選擇一個已有的os鏡像作為基礎r
FROM centos7-hadoop-sshtest

# 鏡像的作者
MAINTAINER cyz

# 啟動sshd服務並且暴露22端口
RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
~                             

構建鏡像

docker build -t centos7-hadoop-ssh .

image-20200927130206199

插曲

docker容器無法ping?因為沒有DNS

以下配置

我們可以在宿主機的 /etc/docker/daemon.json 文件中增加以下內容來設置全部容器的 DNS:

{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

設置后,啟動容器的 DNS 會自動配置為 114.114.114.114 和 8.8.8.8。

配置完,需要重啟 docker 才能生效。

/etc/init.d/docker restart

然后啟動容器 ping www.badiu.com就正常了

搭建hadoop分布式集群

集群規划

准備搭建一個具有三個節點的集群,一主兩從
主節點:hadoop0 ip:192.168.2.10
從節點1:hadoop1 ip:192.168.2.11
從節點2:hadoop2 ip:192.168.2.12

啟動容器

docker run --name hadoop0 --hostname hadoop0 --net hadoop --ip 192.168.2.10 -dit --privileged=true -P -p  50070:50070 -p 8088:8088 -p 9870:9870 centos7-hadoop-ssh 

docker run --name hadoop1 --hostname hadoop1 --net hadoop --ip 192.168.2.11 -dit -P --privileged=true centos7-hadoop-ssh 

docker run --name hadoop2 --hostname hadoop2 --net hadoop --ip 192.168.2.12 -dit -P --privileged=true centos7-hadoop-ssh

注意!后面不要跟/bin/bash,不然Dockerfile文件中的CMD會被覆蓋,導致ssh沒有啟動

image-20200927130339809

網上的教程使用的50070,我查了一下資料,50070是hadoop2的webUI端口,hadoop3的webUI端口是9870,我做到最后才發現的,在啟動的時候使用的是老命令

docker run --name hadoop0 --hostname hadoop0 --net hadoop --ip 192.168.2.10 -dit --privileged=true -P -p 50070:50070 -p 8088:8088 centos7-hadoop-ssh

但是正確的應該是正文寫的

固定IP

在宿主機上下載pipework

git clone https://github.com/jpetazzo/pipework.git
cp -rp pipework/pipework /usr/local/bin/ 

安裝bridge-utils

yum -y install bridge-utils

創建網絡

brctl addbr br0
ip link set dev br0 up
ip addr add 192.168.2.1/24 dev br0

給容器設置固定ip

pipework br0 hadoop0 192.168.2.10/24
pipework br0 hadoop1 192.168.2.11/24
pipework br0 hadoop2 192.168.2.12/24

三台docker主機互ping一下,沒問題

image-20200926233409159

但是這時候我兩個容器之間ping成功了,ssh卻提示no route to host

嘗試用docker network解決

docker network create --subnet=192.168.2.0/24 hadoop

配置hadoop集群

我們的目的只是為了搭建HDFS

對三台容器都進行設置

  1. 設置主機名與ip的映射,修改vi /etc/hosts

添加下面配置

192.168.2.10    hadoop0
192.168.2.11    hadoop1
192.168.2.12    hadoop2
  1. 設置ssh免密碼登錄
cd  ~
mkdir .ssh
cd .ssh
ssh-keygen -t rsa(一直按回車即可)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop0
ssh-copy-id -i hadoop1
ssh-copy-id -i hadoop2

hadoop0上配置hadoop

進入到/opt/hadoop-3.2.1/etc/hadoop

HDFS的配置文件:大多數默認是XML和TXT格式存在。配置文件默認存放在/etc/hadoop目錄下。

HDFS中6個重要的配置文件:

  1. core-site.xml:Hadoop全局的配置文件,也包含一些HDFS的宏觀配置。
  2. dfs-site.xml:HDFS配置文件。
  3. yarn-site.xml:YARN配置文件。
  4. mapred-sie.xml:MapReduce配置文件。
  5. slaves:從節點列表。
  6. hadoop-env.sh:與運行腳本的環境變量相關的配置文件。
  1. core-site.xml

    <configuration>
            <property><!--指定namenode的地址-->
                    <name>fs.defaultFS</name>
                    <value>hdfs://hadoop0:9000</value>
            </property>
            <property><!--用來指定使用hadoop時產生文件的存放目錄-->
                    <name>hadoop.tmp.dir</name>
                    <value>/opt/hadoop-3.2.1/tmp</value>
            </property>
             <property>
                     <name>fs.trash.interval</name>
                     <value>1440</value>
            </property>
    </configuration>
    
  2. hdfs-site.xml

    dfs-site.xml:HDFS的重要配置文件,其Namenode節點和Datanode節點相關的配置項不同。

    Namenode主要有3個配置項:dfs.namenode.name.dir、dfs.blocksize、dfs.replication。

    Datanode主要有1個配置項:dfs.datanode.data.dir。

    <configuration>
        <property>
          <name>dfs.http.address</name>
          <value>hadoop0:9870</value>
        </property>
    	<property> 
            <name>dfs.namenode.name.dir</name>                 
            <value>/opt/dfs/name</value> 
             <description>namenode的目錄位置,對應的目錄需要存在value里面的路徑</description> 
        </property>
    
        <property> 
            <name>dfs.datanode.data.dir</name>         
            <value>/opt/dfs/data</value>
            <!--datanode的目錄位置,對應的目錄需要存在value里面的路徑,可以是一個或多個用逗號分隔的本地路徑-->         
        </property> 
        <property> 
             <name>dfs.replication</name> 
             <value>1/value> 
            <!--s系統的副本數量-->
        </property> 
    </configuration>
    
  3. yarn-site.xml

    <configuration>
        	<property>
                <description>The hostname of the RM.</description>
                <name>yarn.resourcemanager.hostname</name>
                <value>hadoop0</value>
          </property>
            <property>
                    <name>yarn.nodemanager.aux-services</name>
                    <value>mapreduce_shuffle</value>
            </property>
            <property> 
                    <name>yarn.log-aggregation-enable</name> 
                    <value>true</value> 
            </property>
    </configuration>
    
  4. mapred-site.xml

    <configuration>
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
        </property>
    </configuration>
    
  5. 對於start-dfs.sh和stop-dfs.sh文件,添加下列參數:

    #!/usr/bin/env bash
    HDFS_DATANODE_USER=root
    HADOOP_SECURE_DN_USER=hdfs
    HDFS_NAMENODE_USER=root
    HDFS_SECONDARYNAMENODE_USER=root
    

    對於start-yarn.sh和stop-yarn.sh文件,添加下列參數:

    #!/usr/bin/env bash
    YARN_RESOURCEMANAGER_USER=root
    HADOOP_SECURE_DN_USER=yarn
    YARN_NODEMANAGER_USER=root
    

    重新開始start...就可以了。

    image-20200927144216420

  6. 修改hadoop0中hadoop的一個配置文件etc/hadoop/slaves
    刪除原來的所有內容,修改為如下

hadoop1
hadoop2
  1. 在hadoop0中執行命令
  scp  -rq /opt/hadoop-3.2.1   hadoop1:/opt
  scp  -rq /opt/hadoop-3.2.1   hadoop2:/opt
  1. 格式化
    進入到/usr/local/hadoop目錄下
bin/hdfs namenode -format
注意:在執行的時候會報錯,是因為缺少which命令,安裝即可

執行下面命令安裝
yum install -y which

啟動成功

image-20200927142739671

啟動HDFS

在所有 NameNode 上啟動:

$HADOOP_HOME/bin/hdfs --daemon start namenode

在所有 DataNode 上啟動:

$HADOOP_HOME/bin/hdfs --daemon start datanode

jps命令查看如下

NameNode(hadoop0):

image-20200927155251920

DataNode(hadoop1/2):

image-20200927155308723

驗證

VNC連接到宿主機,登錄到http://192.168.2.10:9870/,查看成功

image-20200927155339451

使用驗證

創建目錄

$ ./bin/hdfs dfs -mkdir -p /hello

上傳文件到HDFS

首先先新建一個本地文件,

$ vim ~/test.txt
hello world
fuck world

然后使用下面命令進行上傳,

$ ./bin/hdfs dfs -put ~/test.txt /hello

查看目錄和文件內容

$ ./bin/hdfs dfs -ls /hello
/hello/test.txt
$ ./bin/hdfs dfs -cat /hello/test.txt
hello world
fuck world

image-20200927162015794

當然,在webUI中也可以看到

image-20200927162117585

啟動Spark

先啟動好HDFS(如上)

master節點

在master節點(192.168.2.10)上,直接進入到spark目錄下,運行./sbin/start-master.sh

image-20200927160929041

啟動成功后通過8080端口進行查看

image-20200927160948941

記住這個URL

worker節點

在 worker 上啟動 worker 並連接(注冊)到 master 上:./sbin/start-slave.sh <url> 成功啟動 worker 后,在 master 上刷新 localhost:8080 頁面,可以看到添加的 worker 信息。

以hadoop2為例,進入到spark目錄下,sbin/start-slave.sh spark://hadoop0:7077

這邊就有了

image-20200927161133784

驗證

在worker節點(hadoop1)上跑一個spark給的demo程序

./bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://hadoop0:7077 examples/jars/spark-examples_2.12-3.0.1.jar 100

image-20200927164243974

參考

https://www.cnblogs.com/shiyiwen/p/5076561.html

https://blog.csdn.net/shenzhen_zsw/article/details/73927848

https://blog.csdn.net/chongchen1581/article/details/100862753

https://blog.51cto.com/13670314/2341236

https://www.cnblogs.com/Jing-Wang/p/10672609.html

https://blog.csdn.net/xu470438000/article/details/50512442

https://www.cnblogs.com/rmxd/p/12051866.html#_label1

http://dockone.io/article/944

https://www.cnblogs.com/Fordestiny/p/9401161.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM