1. 程式人生 > >使用docker部署hadoop叢集

使用docker部署hadoop叢集

> 最近要在公司裡搭建一個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.