1.安装docker
2.基础环境准备
下载centos7镜像
docker pull centos:7.9.2009
启动容器,以centos为基准镜像,构建我们的hadoop运行环境镜像
docker run -ti centos:7.9.2009
2.1 java安装
yum -y install wget
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz"
mkdir /opt/module
tar xzf jdk-8u141-linux-x64.tar.gz -C /opt/module
whoami 查看自己是不是root身份
cd /etc/profile.d 来到这个目录下配置文件
vi my_env.sh
里面内容如下
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_141
export PATH=$PATH:$JAVA_HOME/bin
使用
source /etc/profile
java
为了以后可以使用这个装好了java环境的镜像,将其保存为一个副本
docker ps -a
docker commit -m "java install" 91c19b31fd41 centos:java
docker images
2.2 hadoop 安装
使用刚刚安装可java环境的容器镜像
下载hadoop3.3.6到/opt/module/这个目录
docker run -ti centos:java
wget --no-check-certificate https://mirrors.sonic.net/apache/hadoop/common/stable/hadoop-3.3.6.tar.gz
tar xvzf hadoop-3.3.6.tar.gz
环境变更配置
vi ~/.bashrc
source ~/.bashrc
表明hadoop安装成功
Hadoop配置
mkdir tmp
mkdir namenode
mkdir datanode
cd etc/hadoop/
word单词计数测试
cd /opt/module/hadoop-3.3.6
mkdir wcinput #创建目录
cd wcinput/ #进入目录
vi word.txt #编写文件
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount wcinput/ ./wcoutput
安装ssh,搭建集群环境
我们把这个命令加入到~/.bashrc文件中。通过vi ~/.bashrc编辑.bashrc文件,在文件后追加下面内容:
#autorun
/usr/sbin/sshd
生成访问密钥
ssh-keygen -t rsa -P '' -f ~/.ssh/id_dsa
cd ~/.ssh/
cat id_dsa.pub >> authorized_key
#chmod 700 ~/.ssh/
#chmod 600 ~/.ssh/authorized_keys
生成密钥访问
ssh-keygen -A
配置文件
cd /opt/module/hadoop-3.3.6/etc/hadoop
1).core-site.xml配置
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!-- 指定hadoop数据存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.3.6/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<!-- 指定NameNode的地址 -->
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
<final>true</final>
<description>The name of the default file system. A URI whose
scheme and authority determine the FileSystem implementation. The
uri's scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class. The uri's authority is used to
determine the host, port, etc. for a filesystem.</description>
</property>
</configuration>
注意:
hadoop.tmp.dir配置项值即为此前命令中创建的临时目录路径。
fs.default.name配置为hdfs://master:9000,指向的是一个Master节点的主机(后续我们做集群配置的时候,自然会配置这个节点,先写在这里)
2).hdfs-site.xml配置
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
<final>true</final>
<description>Default block replication.
The actual number of replications can be specified when the file is created.
The default is used if replication is not specified in create time.
</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value> /opt/module/hadoop-3.3.6/namenode</value>
<final>true</final>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/module/hadoop-3.3.6/datanode</value>
<final>true</final>
</property>
</configuration>
注意:
我们后续搭建集群环境时,将配置一个Master节点和两个Slave节点。所以dfs.replication配置为2。
dfs.namenode.name.dir和dfs.datanode.data.dir分别配置为之前创建的NameNode和DataNode的目录路径
3).mapred-site.xml配置
#cp mapred-site.xml.template mapred-site.xml
vi mapred-site.xml
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
<description>The host and port that the MapReduce job tracker runs
at. If "local", then jobs are run in-process as a single map
and reduce task.
</description>
</property>
</configuration>
这里只有一个配置项mapred.job.tracker,我们指向master节点机器
4)指定JAVA_HOME环境变量
使用命令vi hadoop-env.sh,修改如下配置:
vi hadoop-env.sh
# The java implementation to use.
export JAVA_HOME=/opt/module/jdk1.8.0_141
5).格式化 namenode
这是很重要的一步,执行命令
hadoop namenode -format
hdfs namenode -format
保存镜像副本
这里我们将安装好Hadoop的镜像保存为一个副本。
docker commit -m "hadoop install" 38239abefb1a linux:hadoop
3.Hadoop分布式集群搭建
按照 hadoop 集群的基本要求,其 中一个是 master 结点,主要是用于运行 hadoop 程序中的 namenode、secondorynamenode 和 jobtracker任务。用外两个结点均为 slave 结点,其中一个是用于冗余目的,如果没有冗 余,就不能称之为 hadoop 了,所以模拟 hadoop 集群至少要有 3 个结点。
前面已经将Hadoop的镜像构建好了,下面就是使用这个镜像搭建Master节点和Slave节点了:
docker run -p 50070:50070 -p 19888:19888 -p 8088:8088 --name master -ti -h master linux:hadoop
docker run -it -h slave1 --name slave1 linux:hadoop /bin/bash
docker run -it -h slave2 --name slave2 linux:hadoop /bin/bash
配置hosts
通过ifconfig命令获取各节点ip。我本机获取的ip如下:
yum install net-tools
master:172.17.0.3
slave1:172.17.0.4
slave2:172.17.0.5
使用vi /etc/hosts命令将如下配置写入各节点的hosts文件,注意修改ip地址:
vi /etc/hosts
172.17.0.3 master
172.17.0.4 slave1
172.17.0.5 slave2
- 启动sshd /usr/sbin/sshd
配置slaves
在master节点容器中执行如下命令
vi /opt/module/hadoop-3.3.6/etc/hadoop/slaves
将如下slave节点的hostname信息写入该文件
master
slave1
slave2
启动Hadoop
在master节点上执行start-all.sh命令,启动Hadoop。
报错1
cd /opt/module/hadoop-3.3.6/etc/hadoop
vi hadoop-env.sh
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
报错2
报错3
解决办法
yum install openssh-clients
检查是否下载成功
在个节点上执行jps命令
下面,我们在master节点上通过命令hdfs dfsadmin -report 查看DataNode是否正常启动:
还可以通过Web页面看到查看DataNode和NameNode的状态
将workers配置好,在每一个节点上
vi /opt/module/hadoop-3.3.6/etc/hadoop/workers
master
slave1
slave2
集群搭建成功
docker inspect 15ef82fb98a1
(base) zhangyawei@zhangyaweideMacBook-Pro / % docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 15ef82fb98a1
172.17.0.3
监测是否有端口后 50070
netstat -tuln | grep 50070
启动hdfs
cd /opt/module/hadoop-3.3.6
sbin/start-dfs.sh
sbin/stop-dfs.sh
cd /opt/module/hadoop-3.3.6/etc/hadoop/
vi hdfs-site.xml
<property>
<name>dfs.namenode.http.address</name>
<value>slave1:50070</value>
</property>
感谢如下的帮助
https://blog.csdn.net/clypm/article/details/79351060