前情提要:因?yàn)閙ac上docker ping不通容器,后裝了一個(gè)docker-mac-network進(jìn)行轉(zhuǎn)發(fā),但是速度太慢,web界面都沒(méi)辦法打開(kāi),所以就沒(méi)辦法使用hdfs客戶端,最后還是轉(zhuǎn)投了parallel裝虛擬機(jī)進(jìn)行學(xué)習(xí),大部分內(nèi)容還是可以用的。
1.以centos7為基礎(chǔ)創(chuàng)建centos7-ssh鏡像
創(chuàng)建Dockerfile文件
vi Dockerfile
將如下內(nèi)容寫(xiě)入Dockerfile
FROM centos:centos7
MAINTAINER wr
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:123456" | 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"]
上述內(nèi)容大概意思是:以centos鏡像為基礎(chǔ),設(shè)置密碼為123456,安裝ssh服務(wù)并啟動(dòng)
構(gòu)建Dockerfile(注意有個(gè)“點(diǎn)”)
docker build -t="centos7-ssh" .
將生成一個(gè)名為centos7-ssh的鏡像,可以通過(guò)docker images查看'
2.準(zhǔn)備好hadoop和jdk,以centos7-ssh為基礎(chǔ)構(gòu)建centos7-hadoop鏡像
hadoop-2.10.1.tar.gz
jdk-8u281-linux-x64.tar.gz
創(chuàng)建新的Dockerfile
vi Dockerfile
將以下內(nèi)容寫(xiě)入:
FROM centos7-ssh
ADD jdk-8u281-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_281 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH
ADD hadoop-2.10.1.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.10.1 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH
RUN yum install -y which sudo
上述內(nèi)容大概意思是:以上面生成的centos7-ssh為基礎(chǔ),將hadoop和jdk包放進(jìn)去,然后配好環(huán)境變量。
構(gòu)建Dockerfile
將生成一個(gè)名為hadoop的鏡像
3.配置docker網(wǎng)橋,啟動(dòng)鏡像
1.創(chuàng)建網(wǎng)絡(luò)
docker network create --driver bridge bridge_hadoop
以上命令創(chuàng)建了一個(gè)名為hadoop-br的bridge類(lèi)型的網(wǎng)絡(luò)
2.啟動(dòng)docker時(shí)指定網(wǎng)絡(luò)
docker run -itd --network bridge_hadoop --name hadoop1 -p 50070:50070 -p 8088:8088 hadoop
docker run -itd --network bridge_hadoop --name hadoop2 hadoop
docker run -itd --network bridge_hadoop --name hadoop3 hadoop
以上命令啟動(dòng)了3臺(tái)機(jī)器,網(wǎng)絡(luò)都指定為bridge_hadoop,hadoop1還開(kāi)啟了端口映射。
3.查看網(wǎng)絡(luò)情況
docker network inspect bridge_hadoop
4.登錄docker容器,互相之間就可以ping通了。
docker exec -it hadoop1 /bin/bash
docker exec -it hadoop2 /bin/bash
docker exec -it hadoop3 /bin/bash
4.配置host及ssh免密登錄
1.分別在每臺(tái)修改每臺(tái)機(jī)器的host
vi /etc/hosts
將以下內(nèi)容寫(xiě)入(注:docker分出來(lái)的ip對(duì)于每個(gè)人可能不一樣,填你自己的):
${ip1} hadoop1
${ip1} hadoop2
${ip1} hadoop3
2.因?yàn)樯厦嬖阽R像中已經(jīng)安裝了ssh服務(wù),所以直接分別在每臺(tái)機(jī)器上執(zhí)行以下命令:
ssh-keygen
一路回車(chē)
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop1
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop2
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop3
3.測(cè)試是否配置成功
ping hadoop1
ping hadoop2
ping hadoop3
ssh hadoop1
ssh hadoop2
ssh hadoop3
5.配置hadoop
1.創(chuàng)建一些文件夾,一會(huì)在配置中要用到
mkdir /home/hadoop
mkdir /home/hadoop/tmp /home/hadoop/hdfs_name /home/hadoop/hdfs_data
2.切換到hadoop配置的目錄
cd $HADOOP_HOME/etc/hadoop/
3.編輯core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131702</value>
</property>
4.編輯hdfs-site.xml
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/hdfs_name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/hdfs_data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop1:9001</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
5.編輯mapred-site.xml
mapred-site.xml默認(rèn)不存在,要執(zhí)行
cp mapred-site.xml.template mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop1:19888</value>
</property>
6.編輯yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoop1:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hadoop1:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoop1:8088</value>
</property>
7.編輯slaves
我這里把hadoop1當(dāng)成主節(jié)點(diǎn),hadoop2、3作為從節(jié)點(diǎn)
hadoop2
hadoop3
8.把文件拷貝到hadoop2和hadoop3上
依次執(zhí)行以下命令:
scp -r $HADOOP_HOME/ hadoop2:/usr/local/
scp -r $HADOOP_HOME/ hadoop3:/usr/local/
scp -r /home/hadoop hadoop2:/
scp -r /home/hadoop hadoop3:/
9.分別連接每臺(tái)機(jī)器,配置hadoop sbin目錄的環(huán)境變量
docker exec -it hadoop1 bash
docker exec -it hadoop2 bash
docker exec -it hadoop3 bash
因?yàn)閔adoop bin目錄在之前創(chuàng)建鏡像時(shí)就配好了,但是sbin目錄沒(méi)有配,所以要單獨(dú)配置。分配為每臺(tái)機(jī)器配置:
vi ~/.bashrc
追加如下內(nèi)容:
export PATH=$PATH:$HADOOP_HOME/sbin
執(zhí)行:
source ~/.bashrc
6.啟動(dòng)
在hadoop1上執(zhí)行以下命令:
格式化hdfs
hdfs namenode -format
一鍵啟動(dòng)
start-all.sh
不出錯(cuò)的話,就可以慶祝一下了。
Hadoop啟動(dòng)報(bào)Error: JAVA_HOME is not set and could not be found解決辦法
修改/etc/hadoop/hadoop-env.sh中設(shè)JAVA_HOME。
應(yīng)當(dāng)使用絕對(duì)路徑。
export JAVA_HOME=$JAVA_HOME //錯(cuò)誤,不能這么改
export JAVA_HOME=/usr/java/jdk1.6.0_45 //正確,應(yīng)該這么改
測(cè)試使用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
7.運(yùn)行wordcount
把license作為需要統(tǒng)計(jì)的文件
root@h01:/usr/local/hadoop# cat LICENSE.txt > file1.txt
root@h01:/usr/local/hadoop# ls
在 HDFS 中創(chuàng)建 input 文件夾
root@h01:/usr/local/hadoop/bin# ./hadoop fs -mkdir /input
root@h01:/usr/local/hadoop/bin#
上傳 file1.txt 文件到 HDFS 中
root@h01:/usr/local/hadoop/bin# ./hadoop fs -put ../file1.txt /input
root@h01:/usr/local/hadoop/bin#
查看 HDFS 中 input 文件夾里的內(nèi)容
root@h01:/usr/local/hadoop/bin# ./hadoop fs -ls /input
Found 1 items
-rw-r--r-- 2 root supergroup 150569 2019-03-19 11:13 /input/file1.txt
root@h01:/usr/local/hadoop/bin#
運(yùn)作 wordcount 例子程序
root@h01:/usr/local/hadoop/bin# ./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.0.jar wordcount /input /output
使用http://0.0.0.0:50070/dfshealth.html#tab-overview訪問(wèn)UI界面