使用docker部署hadoop叢集
阿新 • • 發佈:2020-09-04
> 最近要在公司裡搭建一個hadoop測試叢集,於是採用docker來快速部署hadoop叢集。
## 0. 寫在前面
網上也已經有很多教程了,但是其中都有不少坑,在此記錄一下自己安裝的過程。
**目標**:使用docker搭建一個一主兩從三臺機器的hadoop2.7.7版本的叢集
**準備**:
- 首先要有一臺記憶體8G以上的centos7機器,我用的是阿里雲主機。
- 其次將jdk和hadoop包上傳到伺服器中。
我安裝的是hadoop2.7.7。包給大家準備好了,連結:https://pan.baidu.com/s/15n_W-1rqOd2cUzhfvbkH4g 提取碼:vmzw。
## 1. 步驟
大致分以下幾步:
1. 安裝docker
2. 基礎環境準備
3. 配置網路,並啟動docker容器
4. 配置host及ssh免密登入
5. 安裝配置hadoop
6. 測試使用hadoop
### 1.1 安裝docker
依次執行如下步驟安裝docker。如果有docker環境的可以跳過。
```
yum update
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce
systemctl start docker
docker -v
```
### 1.2 基礎環境準備
#### 1.2.1 建立基礎的centos7映象
1. 拉取官方centos7映象
```
docker pull centos
```
1. 通過build Dockfile生成帶ssh功能的centos映象
- 建立Dockerfile檔案
`vi Dockerfile`
將如下內容寫入Dockerfile
```
FROM centos
MAINTAINER mwf
RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN yum install -y openssh-clients
RUN echo "root:qwe123" | chpasswd
RUN echo "root ALL=(ALL) ALL" >> /etc/sudoers
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 mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
```
上述內容大概意思是:以centos映象為基礎,設定密碼為wqe123,安裝ssh服務並啟動
- 構建Dockerfile
```
docker build -t="centos7-ssh" .
```
將生成一個名為`centos7-ssh`的映象,可以通過`docker images`檢視
### 1.2.2 生成有hadoop和jdk環境的映象
1. 將準備好的包放在當前目錄下。`hadoop-2.7.7.tar.gz`和`jdk-8u202-linux-x64.tar.gz`
2. 通過build Dockfile生成帶hadoop和jdk環境的centos映象
剛才已經建立了一個Dockerfile了,先將他移開。`mv Dockerfile Dockerfile.bak`
- 建立Dockerfile
`vi Dockerfile`
將以下內容寫入:
```
FROM centos7-ssh
ADD jdk-8u202-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_202 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH
ADD hadoop-2.7.7.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.7.7 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH
RUN yum install -y which sudo
```
上述內容大概意思是:以上面生成的centos7-ssh為基礎,將hadoop和jdk包放進去,然後配好環境變數。
- 構建Dockerfile
```
docker build -t="hadoop" .
```
將生成一個名為hadoop的映象
### 1.3 配置網路,並啟動docker容器
因為叢集間必須要能網路連通,所以要先配置好網路。
1. 建立網路
```
docker network create --driver bridge hadoop-br
```
以上命令建立了一個名為`hadoop-br`的bridge型別的網路
1. 啟動docker時指定網路
```
docker run -itd --network hadoop-br --name hadoop1 -p 50070:50070 -p 8088:8088 hadoop
docker run -itd --network hadoop-br --name hadoop2 hadoop
docker run -itd --network hadoop-br --name hadoop3 hadoop
```
以上命令啟動了3臺機器,網路都指定為`hadoop-br`,hadoop1還開啟了埠對映。
2. 檢視網路情況
```
docker network inspect hadoop-br
```
執行以上命令就可以看到對應的網路資訊:
```
[
{
"Name": "hadoop-br",
"Id": "88b7839f412a140462b87a353769e8091e92b5451c47b5c6e7b44a1879bc7c9a",
"Containers": {
"86e52eb15351114d45fdad4462cc2050c05202554849bedb8702822945268631": {
"Name": "hadoop1",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
},
"9baa1ff183f557f180da2b7af8366759a0d70834f43d6b60fba2e64f340e0558": {
"Name": "hadoop2",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
}, "e18a3166e965a81d28b4fe5168d1f0c3df1cb9f7e0cbe0673864779b224c8a7f": {
"Name": "hadoop3",
"IPv4Address": "172.18.0.4/16",
"IPv6Address": ""
}
},
}
]
```
我們可以得知3臺機器對應的ip:
```
172.18.0.2 hadoop1
172.18.0.3 hadoop2
172.18.0.4 hadoop3
```
3. 登入docker容器,互相之間就可以ping通了。
```
docker exec -it hadoop1 bash
docker exec -it hadoop2 bash
docker exec -it hadoop3 bash
```
### 1.4 配置host及ssh免密登入
#### 1.4.1 配置host
分別在每臺修改每臺機器的host
`vi /etc/hosts`
將以下內容寫入(注:docker分出來的ip對於每個人可能不一樣,填你自己的):
```
172.18.0.2 hadoop1
172.18.0.3 hadoop2
172.18.0.4 hadoop3
```
#### 1.4.2 ssh免密登入
因為上面在映象中已經安裝了ssh服務,所以直接分別在每臺機器上執行以下命令:
```
ssh-keygen
一路回車
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop1
輸入密碼,如果按我的來得話就是qwe123
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop2
輸入密碼,如果按我的來得話就是qwe123
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop3
輸入密碼,如果按我的來得話就是qwe123
```
#### 1.4.3 測試是否配置成功
```
ping hadoop1
ping hadoop2
ping hadoop3
ssh hadoop1
ssh hadoop2
ssh hadoop3
```
### 1.5 安裝配置hadoop
#### 1.5.1 在hadoop1上操作
1. 進入hadoop1
```
docker exec -it hadoop1 bash
```
2. 建立一些資料夾,一會在配置中要用到
```
mkdir /home/hadoop
mkdir /home/hadoop/tmp /home/hadoop/hdfs_name /home/hadoop/hdfs_data
```
3. 切換到hadoop配置的目錄
```
cd $HADOOP_HOME/etc/hadoop/
```
4. 編輯core-site.xml
```
```
5. 編輯hdfs-site.xml
```
```
6. 編輯mapred-site.xml
mapred-site.xml預設不存在,要執行`cp mapred-site.xml.template mapred-site.xml`
```
```
7. 編輯yarn-site.xml
```
```
8. 編輯slaves
我這裡把hadoop1當成主節點,hadoop2、3作為從節點
```
hadoop2
hadoop3
```
9. 把檔案拷貝到hadoop2和hadoop3上
依次執行以下命令:
```
scp -r $HADOOP_HOME/ hadoop2:/usr/local/
scp -r $HADOOP_HOME/ hadoop3:/usr/local/
scp -r /home/hadoop hadoop2:/
scp -r /home/hadoop hadoop3:/
```
#### 1.5.2 在每臺機器上操作
1. 分別連線每臺機器
```
docker exec -it hadoop1 bash
docker exec -it hadoop2 bash
docker exec -it hadoop3 bash
```
2. 配置hadoop sbin目錄的環境變數
因為hadoop bin目錄在之前建立映象時就配好了,但是sbin目錄沒有配,所以要單獨配置。分配為每臺機器配置:
`vi ~/.bashrc`
追加如下內容:
`export PATH=$PATH:$HADOOP_HOME/sbin`
執行:
`source ~/.bashrc`
#### 1.5.3 啟動hadoop
在hadoop1上執行以下命令:
1. 格式化hdfs
```
hdfs namenode -format
```
2. 一鍵啟動
```
start-all.sh
```
不出錯的話,就可以慶祝一下了。出錯的話,加油。
### 1.6 測試使用hadoop
- jps
```
# hadoop1
1748 Jps
490 NameNode
846 ResourceManager
686 SecondaryNameNode
# hadoop2
400 DataNode
721 Jps
509 NodeManager
# hadoop3
425 NodeManager
316 DataNode
591 Jps
```
- 上傳檔案
```
hdfs dfs -mkdir /mwf
echo hello > a.txt
hdfs dfs -put a.txt /mwf
hdfs dfs -ls /mwf
Found 1 items
drwxr-xr-x - root supergroup 0 2020-09-04 11:14 /mwf
```
由於是雲伺服器,不想配埠,就不看ui介面了。
## 2. 最後
以上是我安裝成功之後總結的過程,應該沒有問題,也可能有遺漏。
大家安裝過程中遇到什麼問題歡迎交流。有寫錯的地方也歡迎指正。
## 3.