hadoop安装教程
基于Docker搭建Hadoop环境及配置
Hadoop简介
Hadoop 是一个开源的分布式计算和存储框架,由 Apache 基金会开发和维护。
Hadoop 为庞大的计算机集群提供可靠的、可伸缩的应用层计算和存储支持,它允许使用简单的编程模型跨计算机群集分布式处理大型数据集,并且支持在单台计算机到几千台计算机之间进行扩展。
Hadoop 使用 Java 开发,所以可以在多种不同硬件平台的计算机上部署和使用。其核心部件包括分布式文件系统 (Hadoop DFS,HDFS) 和 MapReduce。
Docker简介
Docker 是一个容器管理系统,它可以向虚拟机一样运行多个”虚拟机”(容器),并构成一个集群。因为虚拟机会完整的虚拟出一个计算机来,所以会消耗大量的硬件资源且效率低下
而 Docker 仅提供一个独立的、可复制的运行环境,实际上容器中所有进程依然在主机上的内核中被执行,因此它的效率几乎和主机上的进程一样(接近100%)。
Hadoop运行环境
Docker部署
拉取CentOS镜像作为Hadoop运行的环境
docker pull centos:8
创建容器
创建一个包含java和SSH的环境
docker run -d --name=java_ssh_proto --privileged centos:8 /usr/sbin/init
进入容器
docker exec -it java_ssh_proto bash
配置镜像
2022年centos8源已停止更新,为了接下来yum命令正常运行改源Centos8改源
安装JDK和SSH服务
yum install -y java-1.8.0-openjdk-devel openssh-clients openssh-server
启用SSH服务
systemctl enable sshd && systemctl start sshd
至此,包含java和SSH环境的原型容器已然创建完毕,退出并停止容器,保存为java_SSH镜像
docker stop java_ssh_proto
docker commit java_ssh_proto java_ssh
Hadoop安装
下载Hadoop百度网盘
或到Hadoop官网下载.tar.gz压缩包文件
本教程使用3.3.2版本
使用保存的java_SSH容器创建单机容器hadoop_single
docker run -d --name=hadoop_single --privileged java_ssh /usr/sbin/init
将.tar.gz安装包复制到容器的/root目录下
docker cp <你存放hadoop压缩包的路径> hadoop_single:/root/
进入容器
docker exec -it hadoop_single bash
进入/root目录
cd /root
解压压缩包
tar -zxf hadoop-3.3.2.tar.gz
拷贝解压后的文件到常用目录下
tar -zxf hadoop-3.3.2.tar.gz
配置环境变量
echo "export HADOOP_HOME=/usr/local/hadoop" >> /etc/bashrc
echo "export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin" >> /etc/bashrc
echo $HADOOP_HOME 命令行应输出 /usr/local/hadoop
echo "export JAVA_HOME=/usr" >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh
echo "export HADOOP_HOME=/usr/local/hadoop" >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh
执行以下命令判断是否成功
hadoop version
HDFS 配置与使用
新建hadoop用户
adduser hadoop
下载用户密码和权限管理工具
yum install -y passwd sudo
设置 hadoop 用户密码
passwd hadoop
修改 hadoop 安装目录所有人为 hadoop 用户:
chown -R hadoop /usr/local/hadoop
然后用文本编辑器修改 /etc/sudoers 文件,在
root ALL=(ALL) ALL
之后添加一行
hadoop ALL=(ALL) ALL
然后退出容器。
关闭并提交容器 hadoop_single 到镜像 hadoop_proto:
docker stop hadoop_single
docker commit hadoop_single hadoop_proto
创建新容器 hdfs_single :
docker run -d --name=hdfs_single --privileged hadoop_proto /usr/sbin/init
这样新用户就被创建了。
启动 HDFS
现在进入刚建立的容器:
docker exec -it hdfs_single su hadoop
现在应该是 hadoop 用户:
whoami
应该显示 “hadoop”
生成 SSH 密钥:
ssh-keygen -t rsa
这里可以一直按回车直到生成结束。
然后将生成的密钥添加到信任列表:
ssh-copy-id hadoop@172.17.0.2
查看容器 IP 地址:
ip addr | grep 172
cd $HADOOP_HOME/etc/hadoop
这里我们修改两个文件:core-site.xml 和 hdfs-site.xml
在 core-site.xml 中,我们在 标签下添加属性:
<property>
<name>fs.defaultFS</name>
<value>hdfs://<你的IP>:9000</value>
</property>
在 hdfs-site.xml 中的 标签下添加属性:
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
格式化文件结构:
hdfs namenode -format
然后启动 HDFS:
start-dfs.sh
HDFS集群
配置原型
首先,我们将使用之前准备的 hadoop_proto 镜像启动为容器:
docker run -d --name=hadoop_temp --privileged hadoop_proto /usr/sbin/init
进入 Hadoop 的配置文件目录:
cd $HADOOP_HOME/etc/hadoop
首先编辑 workers ,更改文件内容为:
dn1
dn2
然后编辑 core-site.xml,在 中添加以下配置项:
<!-- 配置 HDFS 主机地址与端口号 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://nn:9000</value>
</property>
<!-- 配置 Hadoop 的临时文件目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:///home/hadoop/tmp</value>
</property>
配置 hdfs-site.xml,在 中添加以下配置项:
<!-- 每个数据块复制 2 份存储 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 设置储存命名信息的目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///home/hadoop/hdfs/name</value>
</property>
最后需要配置一下 SSH :
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
ssh-copy-id -i ~/.ssh/id_rsa hadoop@localhost
到此为止,集群的原型就配置完毕了,可以退出容器并上传容器到新镜像 cluster_proto :
docker stop hadoop_temp
docker commit hadoop_temp cluster_proto
此处如果有必要可以删除临时镜像 hadoop_temp 。
部署集群
接下来部署集群。
首先,要为 Hadoop 集群建立专用网络 hnet :
docker network create --subnet=172.20.0.0/16 hnet
接下来创建集群容器:
docker run -d --name=nn --hostname=nn --network=hnet --ip=172.20.1.0 --add-host=dn1:172.20.1.1 --add-host=dn2:172.20.1.2 --privileged cluster_proto /usr/sbin/init
docker run -d --name=dn1 --hostname=dn1 --network=hnet --ip=172.20.1.1 --add-host=nn:172.20.1.0 --add-host=dn2:172.20.1.2 --privileged cluster_proto /usr/sbin/init
docker run -d --name=dn2 --hostname=dn2 --network=hnet --ip=172.20.1.2 --add-host=nn:172.20.1.0 --add-host=dn1:172.20.1.1 --privileged cluster_proto /usr/sbin/init
进入命名节点:
docker exec -it nn su hadoop
格式化 HDFS:
hdfs namenode -format
如果没有出错,那么下一步就可以启动 HDFS:
start-dfs.sh
成功启动之后,jps 命令应该能查到 NameNode 和 SecondaryNameNode 的存在。命名节点不存在 DataNode 进程,因为这个进程在 dn1 和 dn2 中运行。