背景:本机mac搭建的单节点Hadoop集群非常难用,经常因为各种网络问题无法正常使用(主要是会因为网络限制无法访问到localhost,以及datanode的谜之进程退出),因此希望搭建一套基于docker的Hadoop集群,实现和本机环境的隔离以及更稳定的使用。
拉取Ubuntu16.04镜像,创建一个新的容器
docker pull ubuntu:16.04
docker run -it ubuntu:16.04 /bin/bash
下载java vim等
#可以先更换相应的ubuntu源
apt install openjdk-8-jdk
apt install scala
apt install vim
apt install net-tools
安装ssh
apt-get install openssh-server
apt-get install openssh-client
#进入根目录
cd ~
#生成密钥
ssh-keygen -t rsa -P ""
#将公钥追加到 authorized_keys 文件中
cat .ssh/id_rsa.pub >> .ssh/authorized_keys
#启动 SSH 服务
service ssh start
#测试免密登陆
ssh 127.0.0.1
#修改 .bashrc 文件,启动 shell 的时候,自动启动 SSH 服务
#最后一行添加service ssh start
vim ~/.bashrc
下载安装Hadoop
#下载二进制文件
wget https://archive.apache.org/dist/hadoop/core/hadoop-3.3.1/hadoop-3.3.1.tar.gz
解压到/usr/local 目录下面并重命名文件夹
tar -zxvf hadoop-3.2.0.tar.gz -C /usr/local/
cd /usr/local/
mv hadoop-3.2.0 hadoop
修改 /etc/profile 文件,添加以下环境变量到文件中
#java
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
#hadoop
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_LIBEXEC_DIR=$HADOOP_HOME/libexec
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
export HDFS_DATANODE_USER=root
export HDFS_DATANODE_SECURE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_NAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
最后更新一下
source /etc/profile
修改hadoop的相关配置文件
在目录/usr/local/hadoop/etc/hadoop下
修改 hadoop-env.sh 文件,在文件末尾添加一下信息
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
修改 core-site.xml,修改为
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://h01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop3/hadoop/tmp</value>
</property>
</configuration>
修改 hdfs-site.xml,修改为
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop3/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.namenode.data.dir</name>
<value>/home/hadoop3/hadoop/hdfs/data</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
<description>如果为"true",则在HDFS中启用权限检查;如果为"false",则关闭权限检查;默认值为"true"。这里关闭了权限检查。</description>
</property>
</configuration>
修改 mapred-site.xml,修改为
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>
/usr/local/hadoop/etc/hadoop,
/usr/local/hadoop/share/hadoop/common/*,
/usr/local/hadoop/share/hadoop/common/lib/*,
/usr/local/hadoop/share/hadoop/hdfs/*,
/usr/local/hadoop/share/hadoop/hdfs/lib/*,
/usr/local/hadoop/share/hadoop/mapreduce/*,
/usr/local/hadoop/share/hadoop/mapreduce/lib/*,
/usr/local/hadoop/share/hadoop/yarn/*,
/usr/local/hadoop/share/hadoop/yarn/lib/*
</value>
</property>
</configuration>
修改 yarn-site.xml,修改为
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>h01</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
修改 worker 为
h01
h02
h03
此时,hadoop已经配置好了
打包镜像和网络
创建一个桥接网络
docker network create --driver=bridge hadoop
将当前的容器打包为镜像
docker commit -m "haddop" -a "hadoop" <containerId> newhadoop
新镜像run三台机器
启动h01,h02,h03三台机器
#启动h01,暴露相应的接口,其中9000接口暴露可以允许用户在本地9000访问到docker内的hdfs
docker run -it --network hadoop -h h01 --name h01 -p 9870:9870 -p 8088:8088 -p 9000:9000 newhadoop /bin/bash
#启动h02,h03
docker run -it --network hadoop -h h02 --name h02 newhadoop /bin/bash
docker run -it --network hadoop -h h03 --name h03 newhadoop /bin/bash
接下来在h01内启动整个集群
#注意位置
root@h01:/usr/local/hadoop/bin# ./hadoop namenode -format
root@h01:/usr/local/hadoop/sbin# ./start-all.sh
使用命令./hadoop dfsadmin -report可查看分布式文件系统的状态
Hadoop集群此时已经构建完成
本地访问
9000接口已经暴露出来,因此可以在本地访问到hdfs文件 可以使用如下命令看到hdfs文件
hdfs dfs -ls hdfs://localhost:9000/