基於Docker的Hadoop完全分佈式安裝

前情回顧

之前在搭建大數據集羣的時候,一直使用的是VMware虛擬機中直接搭建集羣,這樣的操作需要考慮到硬件設備的綜合性能。今天爲大家介紹一下如何使用Docker容器中安裝Hadoop集羣,接下來將會爲大家詳細的介紹搭建的方法以及需要注意的事項。

一、準備環境
1. 安裝Docker
sudo apt-get install docker
2.準備Hadoop的壓縮包

在這裏直接將我之前使用的tar包提供給大家:
鏈接:https://pan.baidu.com/s/1-S6ln7KLiYytY8qUtKYKcw 提取碼:9rw9
同樣的大家也可以去官網下載,這裏給大家提供了所有的Hadoop版本的下載地址:
下載鏈接:https://archive.apache.org/dist/hadoop/common/

3.Docker去sudo

在Ubuntu下,在執行Docker時,每次都要輸入sudo,解決方法就是把當前用戶執行權限添加到相應的docker用戶組裏面。

sudo groupadd docker;// 添加一個新的docker用戶組
sudo gpasswd -a username docker	//添加當前用戶到docker用戶組裏
sudo service docker restart //重啓Docker後臺監護進程
docker ps 試試,如果沒有實現當前運行的容器,則系統重啓,則生效
sudo reboot
4.下拉鏡像並運行

因爲國內網絡環境,鏡像的獲取會非常慢,儘管docker在大陸建立的鏡像,但還是慢,這裏可以用國內的鏡像,分別有網易的蜂巢,阿里雲,daocloud,其實如果你不提交鏡像的話,用docker官方在境內的服務器也是可以的,我這裏用了docker官方的鏡像
這裏永久性保留更改,修改 /etc/docker/daemon.json 文件並添加上 registry-mirrors 鍵值。
{
“registry-mirrors”: [“https://registry.docker-cn.com”]
}
修改保存後重啓 Docker 以使配置生效。
然後執行

docker pull ubuntu:16.04

如果不加冒號後面的tag的話,會默然下拉lastest版本.
運行鏡像(就變成的容器)

docker run -it ubuntu 
5.安裝Java

此時容器已經啓動,在容器中安裝java

sudo add-apt-repository ppa:webupd8team/java
sodu apt-get update
apt-get install oracle-java8-installer

這裏安裝的是java8,當然你可以安裝其他版本的java,就把oracle-java8-installer中的數字改成你所需要的安裝版本型號即可。

6.安裝wget,ifconfig,ping,vim

ubuntu的鏡像默認只有最簡單的系統,所以這些工具要自己安裝,這三個工具後面都要用到.

apt-get install wget			#wget
apt-get install net-tools		#ifconfig
apt-get install iputils-ping    #ping
apt-get install vim			#你可以下載自己喜歡的編輯器,不一定是vim
二、開始構建
1.安裝Hadoop

首先創建Hadoop安裝目錄

mkdir hadoop
2.配置環境變量

修改~/.bashrc文件。在文件末尾加入下面配置信息

export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HADOOP_HOME=/root/hadoop/hadoop-2.7.3
export HADOOP_CONFIG_HOME=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
3.配置Hadoop

這裏創建了三個目錄,後續配置的時候會用到:

  • tmp:作爲Hadoop的臨時目錄
  • namenode:作爲NameNode的存放目錄
  • datanode:作爲DataNode的存放目錄
root@admin:~# cd $HADOOP_HOME/
root@admin:~/hadoop/hadoop-2.7.3# mkdir tmp
root@admin:~/hadoop/hadoop-2.7.3# mkdir namenode
root@admin:~/hadoop/hadoop-2.7.3# mkdir datanode

我們開始修改Hadoop的配置文件。主要配置core-site.xml、hdfs-site.xml、mapred-site.xml這三個文件。

root@admin:~/hadoop/hadoop-2.7.3# cd $HADOOP_CONFIG_HOME/
root@admin :~/hadoop/hadoop-2.7.3/etc/hadoop# cp mapred-site.xml.template mapred-site.xml
1. vim core-site.xml
<configuration>
    <property>
            <name>hadoop.tmp.dir</name>
            <value>/root/hadoop/hadoop-2.7.3/tmp</value>
    </property>

    <property>
            <name>fs.default.name</name>
            <value>hdfs://master:9000</value>
            <final>true</final>
    </property>
</configuration>
2.vim hdfs-site.xml配置
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
        <final>true</final>
    </property>

    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/root/hadoop/hadoop-2.8.0/namenode</value>
        <final>true</final>
    </property>

    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/root/hadoop/hadoop-2.7.3/datanode</value>
        <final>true</final>
    </property>
</configuration>

注意:
我們後續搭建集羣環境時,將配置一個Master節點和兩個Slave節點。所以dfs.replication配置爲2。
dfs.namenode.name.dir和dfs.datanode.data.dir分別配置爲之前創建的NameNode和DataNode的目錄路徑

3. vim mapred-site.xml配置

Hadoop安裝文件中提供了一個mapred-site.xml.template,所以我們之前使用了命令cp mapred-site.xml.template mapred-site.xml,創建了一個mapred-site.xml文件。

<configuration>
    <property>
        <name>mapred.job.tracker</name>
        <value>master:9001</value>
    </property>
</configuration>

這裏只有一個配置項mapred.job.tracker,我們指向master節點機器。

4.修改JAVA_HOME環境變量

使用命令vim hadoop-env.sh,修改如下配置:

export JAVA_HOME=/usr/lib/jvm/java-8-oracle
5.格式化 namenode

這是很重要的一步,執行命令hadoop namenode -format

6.安裝SSH

搭建集羣環境,自然少不了使用SSH。這可以實現無密碼訪問,訪問集羣機器的時候很方便。

sudo apt-get install ssh

SSH裝好了以後,由於我們是Docker容器中運行,所以SSH服務不會自動啓動。需要我們在容器啓動以後,手動打開SSH服務。

service ssh start

注意,可能許多人會在後面的啓動master時出現下面的問題.因爲我在安裝時參考的博客就出現了這種問題,網上各種解決方案,基本上都是安裝openssh-server,和 openssh-client但是還是不行,有的還有改端口,因爲ssh默認是22端口,我試了也不行.其實我上面這個命令就解決了這個問題,因爲docker不會自動啓動你後面安裝的服務程序的,執行service ssh start就是手動打開這個服務.啓動後就沒有問題了.
connect to host 172.17.0.1 port 22:connection refused

7.生成密鑰
cd ~/
ssh-keygen -t rsa -P '' -f ~/.ssh/id_dsa
cd .ssh
cat id_dsa.pub >> authorized_keys

注意: 這裏,我的思路是直接將密鑰生成後寫入鏡像,免得在買個容器裏面再單獨生成一次,還要相互拷貝公鑰,比較麻煩。當然這只是學習使用,實際操作時,應該不會這麼搞,因爲這樣所有容器的密鑰都是一樣的!

8.保存鏡像副本

這裏我們將安裝好Hadoop的鏡像保存爲一個副本。

root@admin:~# exit
root@lacalhost:~$ docker commit -m "hadoop install" 2c241377ccdf ubuntu:hadoop

這裏注意docker commit -m “註釋” 容器id 鏡像名:tag名

到目前爲止,hadoop的安裝已經結束了,下面就是完全分佈式的搭建了.

三、Hadoop分佈式環境搭建

因爲分佈式是三個或者以上的機器之間通訊,所以必須知道對方的ip地址和從屬關係.但是docker容器每次結束後是不會保留之前的記錄的,除非提交爲鏡像,所以需要每次啓動容器後檢查ip地址,配置hosts文件和master節點的slaves文件來確定從屬關係,這裏建議第一次先查看各個子節點的ip地址,以後基本上是不會變的,除非你用動態ip,或者啓動順序有變.一些博客上是手動改配置文件的,這裏我寫了shell文件來解決此時,只需要早啓動每個容器後執行這個腳本即可,並且建議把這個腳本就寫入鏡像中,作爲一個node鏡像,下次只需要啓動就行

1.vim set.sh
if [ $(hostname) == "master" ]
then
	if [ `grep "slave1" $HADOOP_CONFIG_HOME/slaves` ]
	then
		echo "slave1 has exist"
	else
		echo "slave1" >> $HADOOP_CONFIG_HOME/slaves
	fi

	if [ `grep "slave2" $HADOOP_CONFIG_HOME/slaves` ]
	then
		echo "slave2 has exist"
	else	
		echo "slave2" >> $HADOOP_CONFIG_HOME/slaves
	fi
fi

cp /etc/hosts /etc/hosts.tmp
sed -i '$d' /etc/hosts.tmp
cat /etc/hosts.tmp > /etc/hosts
rm /etc/hosts.tmp

echo -e "172.17.0.2\\tmaster\\n172.17.0.3\\tslave1\\n172.17.0.4\\tslave2" >> /etc/hosts
#這裏的ip地址用你自己的,用ifconfig查看

保存後給文件加執行權限,chmod +x set.sh

2.寫入鏡像中
docker commit -m “add set file” f5ce7cff868d ubuntu:node
啓動三個容器(相當三個虛擬機)
啓動master容器, -h 是給容器設置的主機名
docker run -ti -h master ubuntu:node
啓動slave1容器
docker run -ti -h slave1 ubuntu:node
啓動slave2容器
docker run -ti -h slave2 ubuntu:node

在每個容器中運行./set.sh文件,

3.啓動Hadoop

在master節點上執行$HADOOP_CONFIG_HOME/sbin/start-all.sh命令,啓動Hadoop

master

發佈了122 篇原創文章 · 獲贊 65 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章