基于Ubuntu Server和Docker搭建Hadoop完全分布式集群
Ubuntu Server安装
在Ubuntu官网中下载Ubuntu Server 20.4.3 LTS版本,并在VMWare虚拟机中(其他虚拟机软件皆可)安装好。
由于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框架入门
欢迎批评与指正!