(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