基于Ubuntu Server和Docker搭建Hadoop完全分布式集群

Ubuntu Server安装

在Ubuntu官网中下载Ubuntu Server 20.4.3 LTS版本,并在VMWare虚拟机中(其他虚拟机软件皆可)安装好。

选择Option2
由于Ubuntu Server在安装的过程中集成了多种预装软件可以勾选,大家在安装的时候直接将Docker勾选上就可以了,可以根据需要进行其他产品的安装。
在这里插入图片描述
其余的步骤可以自行搜索Ubuntu安装的教程进行安装,安装好以后开启虚拟机即可。

拉取Ubuntu镜像

我们需要将Hadoop部署在Ubuntu虚拟机中,但并不是在我们的宿主机当中。事实上,简单地开启多个虚拟机(3个以上)就满足了搭建Hadoop集群的条件,简单粗暴,但对内存的消耗巨大,我的16G内存机子也会瞬间飙到80%的内存占用率。因此我们需要在虚拟机中部署docker,将集群节点以容器的形式部署,这样可以减轻对内存的消耗。Docker Hub上面发布了数千种常用的镜像,包含Ubuntu。因此我们仅需要简单地执行一条指令即可拉取Ubuntu镜像至我们的虚拟机中。

sudo docker pull ubuntu-latest

拉取成功后可进行镜像查看:

sudo docker image 

在这里插入图片描述

创建容器

拉取好镜像之后,我们就可以创建容器了:

sudo docker run -it -d --name ubuntu1 ubuntu

ubuntu1可以自行修改为其他名字

接下来的操作均在Ubuntu1中完成

换源

将Ubuntu默认的Debian源换成国内的阿里源,提高下载速度:

apt-install vim //安装vim

cp /etc/apt/sources.list /etc/apt/sources_back.list //备份源文件

vim /etc/apt/sources.list //编辑源文件

将源文件中的内容全部删除,去阿里镜像站: 找到ubuntu 20.04(focal) 的源地址:

deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

将上段代码复制到sources.list中并保存。
更新源

apt-get update 
apt-get upgrade

安装ssh

ssh用来进行多节点通信,可以使用公钥私钥来进行数据传输的加密解密。并且我们后期需要进行免密访问节点也需要用到。

apt install ssh
apt install net-tools//安装网络工具
apt install rsync//集群脚本分发命令
//将ssh启动写入bashrc中,可以随着镜像开启而开启
vim ~/.bashrc
//在最后加入该代码
/etc/init.d/ssh start
//使bashrc生效
source ~/.bashrc

安装jdk

apt-get install default-jdk
//添加jdk环境变量
update-alternatives --config java//查看jdk路径,复制/bin/java之前的路径
vim ./~bashrc//编辑环境变量
//在底部添加
export JAVA_HOME=jdk路径
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=.:${JAVA_HOME}/bin:$PATH

source ~/.bashrc //使bashrc文件生效

安装Hadoop

1、在hadoop官网下载好对应版本的包并解压,本例使用2.10.1版本

wget https://mirrors.bfsu.edu.cn/apache/hadoop/common/hadoop-2.10.1/hadoop-2.10.1.tar.gz
mv hadoop-2.10.1.tar.gz /usr/local
tar -zxvf hadoop-2.10.1.tar.gz

2、添加环境变量,这样使用hadoop命令时就不用再跑到对应命令文件夹了

vim ~/.bashrc
//在底部添加
export HADOOP_HOME=$hadoop路径
export PATH=.:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH

3、保存当前的镜像环境

docker login
docker commit ubuntu1 ubuntu/jdk_ssh_hadoop

创建集群结点容器

1、创建指定数目结点(eg. 3)

//将创建命令写入脚本,减少重复写入量
mkdir hadoop_bash
cd hadoop_bash
vim create_hadoopNodes.sh
#!/bin/bash

#创建多节点
numNodes=$1
image=ubuntu/jdk_ssh_hadoop

for((node=1; node <=$numNodes; node++))
        do
                docker run -it -d -h node$node --name node$node $image
        done
//增加执行权限
chmod +x ./create_hadoopNodes.sh
//执行
./create_hadoopNodes.sh 3
//查看运行容器状态
docker ps -l

在这里插入图片描述

2、修改配置文件

完全分布式配置hadoop需要修改一些配置文件。为了减少单个结点的负载压力,我们将namenode、secondary namenode还有resourcemanager分别配置到三个结点上。
在这里插入图片描述

//进入node1结点中
docker exec -it node1 bash

//修改hadoop对应配置文件,使其满足上图配置
cd /usr/local/hadoop-2.10.1/etc/hadoop

//修改core-site.xml默认配置
vim core-site.xml
<configuration>
        <property>
          <name>hadoop.tmp.dir</name>
          <value>file:/usr/local/hadoop-2.10.1/tmp</value>
          <description>Abase for other temporary directories.</description>
      </property>
      <property>
          <name>fs.defaultFS</name>
          <value>hdfs://node1:9000</value>
      </property>
</configuration>

//修改hdfs默认设置
vim hadoop-env.sh
//将默认的Java路径改成自己的
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/

vim hdfs-site.xml
<configuration>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop-2.10.1/namenode_dir</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop-2.10.1/datanode_dir</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>node3:50090</value>
    </property>

</configuration>

//修改mapred-site.xml.template和mapred-env.sh
cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

vim mapred-env.sh
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/


//修改yarn-site.xml,设置ResourceManager的位置
vim yarn-site.xml
<configuration>

<!-- Site specific YARN configuration properties -->
      <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
      </property>
      
      <property>
          <name>yarn.resourcemanager.hostname</name>
          <value>node2</value>
      </property>
</configuration>

//修改yarn-env.sh,将java路径修改成自己的
# some Java parameters
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/

群起集群

1、配置集群ssh

在每个结点修改hosts文件,将node2和node3的ip地址添加进去
注:可以在xshell中多开几个窗口进去获取其余两个结点的ip地址,也可以直接将node1的最后一位地址加1即可

172.17.0.2      node1
172.17.0.3      node2
172.17.0.4      node3

在node1中生成公钥私钥,以便于后期将公钥写入到其他节点当中

ssh-keygen -t rsa//生成公钥私钥
ssh-copy-id node2
ssh-copy-id node3

ssh免密登陆测试

ssh node2
ssh node3

能免密登陆访问即可

2、修改slaves文件

vim /usr/local/hadoop-2.10.1/etc/hadoop/slaves
//删除其中的localhost,加入node1 node2 node3
node1
node2
node3

注:这三行必须这样写,不能留任何其他字符如空格等。

3、将之前在node2中修改的hadoop文件分发到其他结点中

rsync -rvl /usr/local/hadoop-2.10.1 root@node2:/usr/local/hadoop-2.10.1
rsync -rvl /usr/local/hadoop-2.10.1 root@node3:/usr/local/hadoop-2.10.1

4、群起集群

在node1中格式化namenode结点

hdfs namenode -format

(1)启动hdfs

start-dfs.sh

在不同的node中使用jps命令查看进程开启情况
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(2)启动yarn

启动yarn的时候要在配置resourcemanager的结点上启动,否则会报错

ssh node2
start-yarn.sh

查看各结点进程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总之能够与之前我们设定的分配设置对应就行。至此,群起集群成功

测试

跑一下官方经典的wordcount
1、在hdfs中创建一个输入目录input

hdfs dfs -mkdir /input

2、在本地创建一个输入目录input

mkdir input

//在input中创建两个文件,随便写一些单词和数字
cd input
vim test1
vim test2

//将本地input目录上传至hdfs input目录中
cd ..
hdfs dfs -put input /input

3、运行官方实例

cd /usr/local/hadoop-2.10.1
hadoop jar share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-2.10.1-sources.jar org.apache.hadoop.examples.WordCount /input/input /output //output目录不能事先存在

4、查看结果

hdfs dfs -cat /output/part-r-00000

在这里插入图片描述

Bingo!

注意事项

1、在其中一个节点上修改完文件后一定要scp或rsync到其他节点上,不然启动会一直报错

2、slaves文件要写上全部的节点,包括主节点,不然主节点会缺少datanode进程

3、namenode进程是用hdfs namenode -format初始化出来的,datanode进程是脚本读取配置文件生成出来的,在出错后重新启动集群前务必删除之前错误启动时的所有文件,包括namenode_dir, datanode_dir以及日志文件logs。每个节点都是。

4、尽量不要用start-all.sh和stop-all.sh命令启动和关闭集群,使用start-dfs和start-yarn的脚本来开启和停止集群。

5、namenode、secondary namenode、resourcemanager这三个进程不要部署到同一个节点上,会占用多余内存和硬盘资源,将其分配在三个节点上,但要注意resourcemanager启动时要在其配置文件中部署的那个节点上启动,不然会报错。

参考

ubuntu虚拟机+docker+hadoop完全分布式环境搭建.
尚硅谷大数据教程 hadoop2.x框架入门

欢迎批评与指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值