1. 程式人生 > >(centos7)搭建基於docker的hadoop叢集:二

(centos7)搭建基於docker的hadoop叢集:二

       在(centos7)搭建基於docker的hadoop叢集:一文中,形成了安裝有vim、jdk、ssh的centos映象,現在我們在這個的基礎上繼續搭建haoop。

在正式開始前,瞭解一些docker容器的操作命令

docker  ps:檢視活動的容器

docker ps -a:檢視所有的容器(包括終止狀態的)

docker images:檢視映象

docker run:基於映象新建一個容器

docker container start 容器id:啟動已經終止的容器,但不會進入容器,容器在後臺執行

docker container stop 容器id:終止容器

docker container rm 容器id:刪除終止狀態的容器

docker image rm 映象id:刪除映象

進入容器有兩個命令:attach和exec

docker attach 容器id:進入容器,使用exit退出時,容器會終止

docker exec -it 容器id  bash:進入容器,使用exit退出時,容器不會終止(推薦)

一、安裝Hadoop

    以之前儲存的centos/basic 映象新建一個名為master的容器,容器中是centos系統,主機名為 master。

命令為:docker run -it -v /home/hadoop/build:/root/build -h master  --name master  centos/basic  /bin/bash

命令 中-v: 表示容器中的centos系統/root/build目錄與本地/home/hadoop/build共享;方便包hadoop安裝檔案從本地上傳到Docker內部的centos系統。


開啟一個新的終端輸入命令docker ps檢視開啟的名為master的容器


開啟系統之後,我們把下載下來的Hadoop安裝檔案放到共享目錄/home/hadoop/build下面,然後在Docker內部centos系統的/root/build目錄即可獲取到Hadoop安裝檔案;在Docker內部的Ubuntu系統安裝Hadoop和本地安裝一樣

放好Hadoop的安裝檔案後,進入Docker內部centos系統的/root/build目錄


解壓到/usr/local目錄下:tar -zxvf hadoop-2.9.0.tar.gz -C /usr/local

進入/usr/local目錄下後,並將hadoop-2.9.0目錄名重新命名為hadoop:mv hadoop-2.9.0 hadoop

如果不是root使用者登入的,還要修改hadoop檔案許可權

chown -R 使用者名稱 hadoop

進入hadoop目錄下,使用命令./bin/hadoop version驗證是否安裝成功


二、配置Hadoop

配置的這些檔案都在/usr/local/hadoop/etc/hadoop/目錄下

1、修改core-site.xml

<configuration>
      <property>
          <name>hadoop.tmp.dir</name>
          <value>file:/usr/local/hadoop/tmp</value>
          <description>Abase for other temporary directories.</description>
      </property>
      <property>
          <name>fs.defaultFS</name>
          <value>hdfs://master:9000</value>
      </property>
</configuration>

2、修改hdfs-site.xml

再開啟hdfs-site.xml輸入以下內容:

<configuration>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/namenode_dir</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/datanode_dir</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
</configuration>

3、修改mapred-site.xml

一開始mapred-site.xml並不不存在,使用命令複製cp mapred-site.xml.template mapred-site.xml得到。然後修改內容

 <configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
  </configuration>

4、修改yarn-site.xml

 <configuration>
  <!-- Site specific YARN configuration properties -->
      <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
      </property>
      <property>
          <name>yarn.resourcemanager.hostname</name>
          <value>master</value>
      </property>
  </configuration>

5、開啟hadoop-env.sh

#假設現在/usr/local/hadoop目錄下
vim ./etc/hadoop/hadoop-env.sh
# 將export JAVA_HOME=${JAVA_HOME}替換成
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/

到此配置完成了,然後將此容器儲存為名為centos/hadoop映象。新開一個終端中如圖輸入命令:


三、搭建基於docekr的hadoop叢集

開啟三個新的終端。然後基於centos/hadoop映象,建立三個容器,容器名分別為master、slave01和slave02

命令: docker run -it -h master  --name  master  centos/hadoop  /bin/bash

            docker run -it -h slave01  --name slave01  centos/hadoop  /bin/bash

            docker run -it -h slave02  --name slave02  centos/hadoop  /bin/bash



在開啟基於centos/hadoop映象,名為master的容器前,可以先把之前基於centos/basic 映象,名字也為master的容器終止,  然後刪掉;

命令:docker container stop 容器id

          docekr container rm 容器id

然後建立基於centos/hadoop映象,名為master的容器:

docker run -it -h master  --name master centos/hadoop  /bin/bash

最終主機中共有三個容器,分別為maste、slave01和slave02

在每個容器主機中開啟ssh服務

/usr/sbin/sshd -D &

用ssh localhost 檢視ssh服務是否開啟成功

接著配置master,slave01和slave02的地址資訊,這樣他們才能找到彼此,分別開啟/etc/hosts可以檢視本機的ip和主機名資訊,最後得到三個ip和主機地址資訊如下:

172.17.0.2      master
172.17.0.3      slave01
172.17.0.4      slave02

最後把上述三個地址資訊分別複製到master,slave01和slave02的/etc/hosts即可,我們可以用如下命令來檢測下是否master是否可以連上slave01和slave02

ssh slave01
ssh slave02

如果出現ssh: connect to host localhost port 22: Connection refused,那麼可能是ssh服務沒開啟

開啟ssh服務:/usr/sbin/sshd -D &

ctrl+c可以退出命令。

最後開啟master上的slaves檔案,輸入兩個slave的主機名:

vim /usr/local/hadoop/etc/hadoop/slaves
# 將localhost替換成兩個slave的主機名
slave01
slave02

在master終端上,首先進入/usr/local/hadoop,然後執行如下命令

cd /usr/local/hadoop
bin/hdfs namenode -format
sbin/start-all.sh

這時Hadoop叢集就已經開啟,我們可以在master,slave01和slave02上分別執行命令jps檢視執行結果;

master節點:


slave01節點


slave02節點


問題1:

每次關機再開機後,執行start-all.sh後,namenode並沒有啟動。出現這個問題的主要原因是hadoop的臨時檔案 預設位置為${HADOOP_HOME}/tmp目錄,該目錄在系統開機時會自動清空,儲存在裡面的namenode資訊也就丟失了。解決辦法:

建立目錄比如${HADOOP_HOME}/hadoop.tmp,並修改core-site.xml

 <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/hadoop.tmp</value>
        <description>Abase for other temporary directories.</description>

    </property>

問題2(真的很坑):There are 0 datanode(s) running and no node(s) are excluded in this operation.

centos7的防火牆是firewall,不是iptables關閉防火牆:
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service