使用docker部署hadoop集群
最近要在公司里搭建一个hadoop测试集群,于是采用docker来快速部署hadoop集群。
0. 写在前面
网上也已经有很多教程了,但是其中都有不少坑,在此记录一下自己安装的过程。
目标:使用docker搭建一个一主两从三台机器的hadoop2.7.7版本的集群
准备:
首先要有一台内存8G以上的centos7机器,我用的是阿里云主机。
其次将jdk和hadoop包上传到服务器中。
我安装的是hadoop2.7.7。包给大家准备好了,链接:https://pan.baidu.com/s/15n_W-1rqOd2cUzhfvbkH4g 提取码:vmzw。
1. 步骤
大致分以下几步:
- 安装docker
- 基础环境准备
- 配置网络,并启动docker容器
- 配置host及ssh免密登录
- 安装配置hadoop
- 测试使用hadoop
1.1 安装docker
依次执行如下步骤安装docker。如果有docker环境的可以跳过。
yum update
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce
systemctl start docker
docker -v
1.2 基础环境准备
1.2.1 创建基础的centos7镜像
- 拉取官方centos7镜像
docker pull centos
- 通过build Dockfile生成带ssh功能的centos镜像
创建Dockerfile文件
vi Dockerfile将如下内容写入Dockerfile
FROM centos
MAINTAINER mwf RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN yum install -y openssh-clients RUN echo "root:qwe123" | chpasswd
RUN echo "root ALL=(ALL) ALL" >> /etc/sudoers
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
上述内容大概意思是:以centos镜像为基础,设置密码为wqe123,安装ssh服务并启动
构建Dockerfile
docker build -t="centos7-ssh" .
将生成一个名为
centos7-ssh的镜像,可以通过docker images查看
1.2.2 生成有hadoop和jdk环境的镜像
将准备好的包放在当前目录下。
hadoop-2.7.7.tar.gz和jdk-8u202-linux-x64.tar.gz通过build Dockfile生成带hadoop和jdk环境的centos镜像
刚才已经创建了一个Dockerfile了,先将他移开。
mv Dockerfile Dockerfile.bak
创建Dockerfile
vi Dockerfile将以下内容写入:
FROM centos7-ssh
ADD jdk-8u202-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_202 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH ADD hadoop-2.7.7.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.7.7 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH RUN yum install -y which sudo
上述内容大概意思是:以上面生成的centos7-ssh为基础,将hadoop和jdk包放进去,然后配好环境变量。
构建Dockerfile
docker build -t="hadoop" .
将生成一个名为hadoop的镜像
1.3 配置网络,并启动docker容器
因为集群间必须要能网络连通,所以要先配置好网络。
创建网络
docker network create --driver bridge hadoop-br
以上命令创建了一个名为
hadoop-br的bridge类型的网络启动docker时指定网络
docker run -itd --network hadoop-br --name hadoop1 -p 50070:50070 -p 8088:8088 hadoop
docker run -itd --network hadoop-br --name hadoop2 hadoop
docker run -itd --network hadoop-br --name hadoop3 hadoop
以上命令启动了3台机器,网络都指定为
hadoop-br,hadoop1还开启了端口映射。查看网络情况
docker network inspect hadoop-br
执行以上命令就可以看到对应的网络信息:
[
{
"Name": "hadoop-br",
"Id": "88b7839f412a140462b87a353769e8091e92b5451c47b5c6e7b44a1879bc7c9a",
"Containers": {
"86e52eb15351114d45fdad4462cc2050c05202554849bedb8702822945268631": {
"Name": "hadoop1",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
},
"9baa1ff183f557f180da2b7af8366759a0d70834f43d6b60fba2e64f340e0558": {
"Name": "hadoop2",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
}, "e18a3166e965a81d28b4fe5168d1f0c3df1cb9f7e0cbe0673864779b224c8a7f": {
"Name": "hadoop3",
"IPv4Address": "172.18.0.4/16",
"IPv6Address": ""
}
},
}
]我们可以得知3台机器对应的ip:
172.18.0.2 hadoop1
172.18.0.3 hadoop2
172.18.0.4 hadoop3
登录docker容器,互相之间就可以ping通了。
docker exec -it hadoop1 bash
docker exec -it hadoop2 bash
docker exec -it hadoop3 bash
1.4 配置host及ssh免密登录
1.4.1 配置host
分别在每台修改每台机器的host
vi /etc/hosts
将以下内容写入(注:docker分出来的ip对于每个人可能不一样,填你自己的):
172.18.0.2 hadoop1
172.18.0.3 hadoop2
172.18.0.4 hadoop3
1.4.2 ssh免密登录
因为上面在镜像中已经安装了ssh服务,所以直接分别在每台机器上执行以下命令:
ssh-keygen
一路回车
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop1
输入密码,如果按我的来得话就是qwe123
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop2
输入密码,如果按我的来得话就是qwe123
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop3
输入密码,如果按我的来得话就是qwe123
1.4.3 测试是否配置成功
ping hadoop1
ping hadoop2
ping hadoop3
ssh hadoop1
ssh hadoop2
ssh hadoop3
1.5 安装配置hadoop
1.5.1 在hadoop1上操作
进入hadoop1
docker exec -it hadoop1 bash
创建一些文件夹,一会在配置中要用到
mkdir /home/hadoop
mkdir /home/hadoop/tmp /home/hadoop/hdfs_name /home/hadoop/hdfs_data
切换到hadoop配置的目录
cd $HADOOP_HOME/etc/hadoop/
编辑core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131702</value>
</property>
编辑hdfs-site.xml
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/hdfs_name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/hdfs_data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop1:9001</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
编辑mapred-site.xml
mapred-site.xml默认不存在,要执行
cp mapred-site.xml.template mapred-site.xml<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop1:19888</value>
</property>
编辑yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoop1:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hadoop1:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoop1:8088</value>
</property>
编辑slaves
我这里把hadoop1当成主节点,hadoop2、3作为从节点
hadoop2
hadoop3
把文件拷贝到hadoop2和hadoop3上
依次执行以下命令:
scp -r $HADOOP_HOME/ hadoop2:/usr/local/
scp -r $HADOOP_HOME/ hadoop3:/usr/local/ scp -r /home/hadoop hadoop2:/
scp -r /home/hadoop hadoop3:/
1.5.2 在每台机器上操作
分别连接每台机器
docker exec -it hadoop1 bash
docker exec -it hadoop2 bash
docker exec -it hadoop3 bash
配置hadoop sbin目录的环境变量
因为hadoop bin目录在之前创建镜像时就配好了,但是sbin目录没有配,所以要单独配置。分配为每台机器配置:
vi ~/.bashrc追加如下内容:
export PATH=$PATH:$HADOOP_HOME/sbin执行:
source ~/.bashrc
1.5.3 启动hadoop
在hadoop1上执行以下命令:
格式化hdfs
hdfs namenode -format
一键启动
start-all.sh
不出错的话,就可以庆祝一下了。出错的话,加油。
1.6 测试使用hadoop
- jps
# hadoop1
1748 Jps
490 NameNode
846 ResourceManager
686 SecondaryNameNode
# hadoop2
400 DataNode
721 Jps
509 NodeManager
# hadoop3
425 NodeManager
316 DataNode
591 Jps
- 上传文件
hdfs dfs -mkdir /mwf
echo hello > a.txt
hdfs dfs -put a.txt /mwf
hdfs dfs -ls /mwf
Found 1 items
drwxr-xr-x - root supergroup 0 2020-09-04 11:14 /mwf
由于是云服务器,不想配端口,就不看ui界面了。
2. 最后
以上是我安装成功之后总结的过程,应该没有问题,也可能有遗漏。
大家安装过程中遇到什么问题欢迎交流。有写错的地方也欢迎指正。
3. 参考
https://cloud.tencent.com/developer/article/1084166
https://cloud.tencent.com/developer/article/1084157?from=10680
https://blog.csdn.net/ifenggege/article/details/108396249
使用docker部署hadoop集群的更多相关文章
- Docker部署Hadoop集群
Docker部署Hadoop集群 2016-09-27 杜亦舒 前几天写了文章"Hadoop 集群搭建"之后,一个朋友留言说希望介绍下如何使用Docker部署,这个建议很好,Doc ...
- docker安装hadoop集群
docker安装hadoop集群?图啥呢?不图啥,就是图好玩.本篇博客主要是来教大家如何搭建一个docker的hadoop集群.不要问 为什么我要做这么无聊的事情,答案你也许知道,因为没有女票.... ...
- Docker部署Elasticsearch集群
http://blog.sina.com.cn/s/blog_8ea8e9d50102wwik.html Docker部署Elasticsearch集群 参考文档: https://hub.docke ...
- 如何部署hadoop集群
假设我们有三台服务器,他们的角色我们做如下划分: 10.96.21.120 master 10.96.21.119 slave1 10.96.21.121 slave2 接下来我们按照这个配置来部署h ...
- 批量部署Hadoop集群环境(1)
批量部署Hadoop集群环境(1) 1. 项目简介: 前言:云火的一塌糊涂,加上自大二就跟随一位教授做大数据项目,所以很早就产生了兴趣,随着知识的积累,虚拟机已经不能满足了,这次在服务器上以生产环境来 ...
- 阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建
准备: 两台配置CentOS 7.3的阿里云ECS服务器: hadoop-2.7.3.tar.gz安装包: jdk-8u77-linux-x64.tar.gz安装包: hostname及IP的配置: ...
- 阿里云ECS服务器部署HADOOP集群(二):HBase完全分布式集群搭建(使用外置ZooKeeper)
本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建,多添加了一个 datanode 节点 . 1 节点环境介绍: 1.1 环境介绍: 服务器:三台阿里 ...
- 阿里云ECS服务器部署HADOOP集群(三):ZooKeeper 完全分布式集群搭建
本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建,多添加了一个 datanode 节点 . 1 节点环境介绍: 1.1 环境介绍: 服务器:三台阿里 ...
- 阿里云ECS服务器部署HADOOP集群(六):Flume 安装
本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建. 1 环境介绍 一台阿里云ECS服务器:master 操作系统:CentOS 7.3 Hadoop ...
随机推荐
- Hibernate配置文件和映射文件详解
Hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 我们先看一下官方文档所给出的,Hibernate 体系结构的高层视图: 其中PO=P ...
- 8、Builder 建造者模式 组装复杂的实例 创造型模式
1.什么是Builder模式 定义: 将一个复杂对象的构建与表示相分离,使得同样的构建过程可以创建不同的表示.大白话就是,你不需要知道这个类的内部是什么样的,只用把想使用的参数传进去就可以了,达到了解 ...
- 机器学习经典算法(进阶篇)——8.KNN
KNN是通过测量不同特征值之间的距离进行分类.它的的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.K通常是不大于20的整数. ...
- java 网络通信协议、UDP与TCP
一 网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定 的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通 ...
- java Iterator迭代器
一 Iterator迭代器概述 java中提供了很多个集合,它们在存储元素时,采用的存储方式不同.我们要取出这些集合 中的元素,可通过一种通用的获取方式来完成. Collection集合元素的通用获取 ...
- P1616疯狂的采药 完全背包
题目背景 此题为纪念 LiYuxiang 而生. 题目描述 LiYuxiang 是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了 ...
- C#设计模式之15-解释器模式
解释器模式(Interpreter Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/415 访问. 解释 ...
- FCIS:Fully Convolutional Instance-aware Semantic Segmentation
论文:Fully Convolutional Instance-aware Semantic Segmentation 目录 0.简介 1.Position-sensitive Score Map ...
- 火题大战Vol.0 B 计数DP
火题大战Vol.0 B 题目描述 \(n\) 个沙茶,被编号 \(1\)~$ n$.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 \(1\)(\(+1\) 或\(-1 ...
- nvm -- node 多版本管理器
Node.js 越来越热,应用的场景也越来越多. 在开发中,我们可能同时在进行多个 node 项目,而这些不同的项目所使用的 node 版本又是不一样的,或者是要用更新的 node 版本进行试验和学习 ...