适用Hadoop版本:2.8.3,下载地址
JDK版本:jdk-8u144-linux-x64.rpm,官网地址
操作系统:CentOS 7
使用脚本前请先将hadoop,jdk下载至此项目中
将本目录下所有内容拷贝至将要部署hadoop-master节点的主机中.
并根据实际情况更改hadoop-install.sh文件中如下几项
hadoop_package_location="./" #Hadoop压缩包放置位置
hadoop_package_name="hadoop-2.8.3.tar.gz" #Hadoop压缩包名称
hadoop_dir_name="hadoop-2.8.3" #解压后Hadoop根文件夹名称
jdk_package_name="jdk-8u144-linux-x64.rpm" #jdk安装包名称
jdk_package_location="./" #jdk安装包路径
按照样例更改hosts-login.txt,ip地址,主机名,登录用户名,之间用空格分隔,namenode主节点必须位于文件第一行
192.168.0.104 hadoop.master root
根据实际情况更改hadoop-env.sh脚本中JAVA环境变量(rpm安装后默认为/usr/java/jdk1.8.0_144)
export JAVA_HOME=${JAVA_HOME}
core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml这四个配置文件参考Hadoop官网进行进一步配置
执行hadoop-install.sh 执行过程中需要输入ssh确认信息及其他slaves节点账户密码 安装完成后,启动Hadoop节点执行如下指令,hadoop_location默认值为/root/hadoop,hadoop_dir_name为步骤一中配置值
cd ${hadoop_location}/${hadoop_dir_name}
./bin/hadoop namenode -format #格式化文件系统
./sbin/start-all.sh #启动hdfs及yard
jps #查看节点已启动的服务
打开浏览器访问http://namenode:50070,namenode为主节点Ip
CentOS7添加防火墙规则
firewall-cmd --zone=dmz --add-port=50070/tcp #允许入站端口50070
firewall-cmd --reload #更新防火墙规则
若添加规则仍无效,可以关闭防火墙
systemctl stop firewalld.service #停止firewall
目前测试环境为CentOS 7.0, docker版本为1.13.1
docker安装参考这里.
构建镜像前请将hadoop-2.8.3.tar.gz下载至hadoop_base目录下.
确保服务器主机时间正确!
下述所有操作均在centos管理员账户root下执行
安装ntpdate同步时间
yum install -y ntpdate
ntpdate asia.pool.ntp.org
部署中需要构建四个镜像,java, base,slave 和 master,由于master镜像和slave镜像基于 base 构建,base 基于centos-java, 所以你需要从底到上进行构建.
我们提供了一个自动化脚本用以构建镜像,你可以将通过执行 chmod +x ./build.sh && ./build.sh
进行构建,
当然,你也可以通过以下几个步骤手动构建,以便了解流程
构建时间与机器性能及网络状态有关,若构建成功将会有 Successfully built cbdfb7666b10
,
其中 cbdfb7666b10
为镜像id,不同镜像构建之后该值会有所不同.
centos-java构建:
在centos_java8目录下执行 docker build -t licte/cent-java:latest .
.
hadoop-base构建:
若有必要,在此镜像构建前,你可以进入hadoop配置文件目录根据需要更改配置信息,我们提供了一些默认值,更改时请注意同步更改构建本镜像的Dockerfile中的ARG值,目前版本中与配置文件相关的参数包括: HADOOP_HDFS_NAMENODE, HADOOP_HDFS_DATANODE 和 HADOOP_TMP_DIR .
在hadoop_base目录下执行 docker build -t licte/hadoop-base:latest .
.
hadoop-master构建:
在hadoop_master目录中执行 docker build -t licte/hadoop-master:latest .
.
hadoop-slave构建:
公钥配置已废弃.注意:为方便Hadoop后续运行,我们将name节点公钥分发过程放在镜像构建中,所以在slave镜像构建前,你可以首先启动一个name节点: docker run -p 50070:50070 -p 8088:8088 --name=master --hostname=hadoop.master licte/hadoop-master
,启动之后将会打印出该节点的公钥信息,将该公钥复制到hadoop_slave下的id_rsa.pub文件中,再进行下面步骤.当然你也可以在镜像构建之后手动将公钥内容复制到slave节点的 /root/.ssh/authorized_keys
文件中,其作用是一样的
在hadoop_slave目录下执行 docker build -t licte/hadoop-slave:latest .
.
查看镜像:
执行 docker images
查看镜像列表,列表中应该包含以下内容:
REPOSITORY TAG IMAGE ID CREATED SIZE
licte/hadoop-slave latest 050011e9b4a8 10 seconds ago 1.83 GB
licte/hadoop-master latest 4e3bdb2f1aff About a minute ago 1.91 GB
licte/hadoop-base latest 9f4b4f0f8d5f 3 minutes ago 1.83 GB
licte/cent-java latest fd370190e217 13 minutes ago 783 MB
hub.c.163.com/public/centos 6.5 997f0ed97903 2 years ago 442 MB
由于hadoop以集群发挥其作用,将全部容器放置在一台主机内失去其分布式作用,所以容器间跨主机通信十分必要.
此案例中有三台主机,一台运行hadoop-master容器,称其HM,其余两台运行slave容器,分别称为HS1,HS2.
这三台主机均安装了docker,都有上述镜像,为便于测试,在此我们可以先将防火墙关闭 systemctl stop firewalld
.
在HM主机运行 docker swarm init
,运行之后将会有token口令,请记下该token用于其他主机加入该网络.
在HS1和HS2都执行 docker swarm join --token ${TOKEN} ${IP}:2377
,${TOKEN}为上一步生成的值,${IP}为HM主机的ip.加入成功之后将会有 This node joined a swarm as a worker.
的提示.
在HM主机运行 docker node ls
,应该类似所示
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
f3j741he8o6tkjv7vvue36t48 * HM Ready Active Leader
ux2mb9d1kpm0ldut65r3820og HS1 Ready Active
创建自定义docker网络:(在主机HM创建)
docker network create -d overlay --attachable hadoop-net
执行 docker network ls
,应该包含以下内容:
NETWORK ID NAME DRIVER SCOPE
c1c53e22e54b bridge bridge local
95dbfa451619 docker_gwbridge bridge local
xllhrzzj8dmq hadoop-net overlay swarm
e2291caef7c6 host host local
k15ytvl4yvj3 ingress overlay swarm
a112ae08ef4f none null local
根据需要,启动一个master节点及若干个slave节点.
启动 namenode:
docker run -itd \
--net=hadoop-net \
--name=master \
-p 50070:50070 \
-p 8088:8088 \
-p 9000:9000 \
-p 8042:8042 \
--hostname=hadoop.master \
licte/hadoop-master
启动 datanode,(根据需要更改name及hostname):
docker run -itd \
--name slave1 \
--hostname hadoop.slave1 \
-p 50075:50075 \
--net=hadoop-net \
licte/hadoop-slave
容器启动之后进入master容器( docker exec -it master bash
),执行 ls
,将会看到以下文件
anaconda-ks.cfg hdfs hosts ssh.sh hosts.example
你需要根据slave的节点信息参考 hosts.example修改 hosts 文件,
查看容器ip可以通过在宿主机执行 sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' ${?}
,将${?}替换为容器的name或者id即可
查看容器ip可以通过在宿主机执行 docker exec -it ${?} ip addr
,将${?}替换为容器的name或者id即可
修改之后执行 ./ssh.sh
进行ssh免密登陆配置,该脚本执行过程中需要按提示输入信息(yes/no).
执行之后,你就可以进入${HADOOP_HOME}下,执行 sbin/start-all.sh
启动hadoop集群. 第一次启动集群需要进行确认公钥,需按提示输入(yes/no)
启动之后,可以通过在${HADOOP_HOME}/bin目录下执行 ./hadoop dfsadmin -report
查看集群信息,
也可以通过浏览器访问 http://xx.xx.xx.xx:50070 查看集群信息,其中 xx.xx.xx.xx 为部署master容器的宿主机的ip.
mapreduce例子:
# 上传 ${HADOOP_HOME}/bin/hadoop 脚本到dfs系统的根目录下
${HADOOP_HOME}/bin/hadoop fs -put ${HADOOP_HOME}/bin/hadoop /
# 运行hadoop提供的wordcount例子
${HADOOP_HOME}/bin/hadoop jar /usr/local/hadoop-2.8.3/share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-2.8.3-sources.jar org.apache.hadoop.examples.WordCount /hadoop /out
# 查看wordcount的结果
${HADOOP_HOME}/bin/hdfs dfs -cat /out/part-r-00000
以下所有操作均在master容器中进行,即namenode容器
创建新节点容器后,根据主机名,ip,登陆名修改 /root/hosts
文件.
hadoop配置文件在 ${HADOOP_HOME}/ect/hadoop
目录下,主要配置文件包括 core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml这四个.
修改文件之后,在/root目录下执行 ./ssh.sh
,即可.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。