本地docker搭建Hadoop集群

745 阅读3分钟

背景:本机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/