基于docker的hadoop HA 集群搭建

基于docker的hadoop HA 集群搭建

摘要
docker中一个容器最好运行一个服务,所以我们将会为每个服务都启动一个容器;hadoop中namenode我们启动两个容器分别为hadoop1、hadoop2,yarn框架生成的的进程resourcemanager我们也启动两个容器hadoop3、hadoop4。datanode我们也用三个(hadoop默认副本为3个)分别为hadoop5、hadoop6、hadoop7。 由于建议zookeeper数量最好是奇数(方便选举)我们启动三个容器hadoop8、hadoop9、hadoop10。其次我们把editfile交由journalnode集群来管理,而不是由namenode host,我们再启动3个容器运行journalnode集群负责管理namenode的日志,分别为hadoop11,hadoop12,hadoop13

配置流程
- 配置hadoop HA
- 配置使得容器互联:(1) 创建自定义网络;(2) 利用k8s管理容器集群
- 利用Dockerfile创建hadoop、zookeeper镜像
- 启动

1、配置hadoop HA

  • 修改hadoop-env.sh JAVA_HOME环境变量
# The java implementation to use.
export JAVA_HOME=/usr/local/jdk1.8
  • 配置core-site.xml
<configuration>
  <property>
            <name>fs.defaultFS</name>
            <value>hdfs://ns1</value>
        </property>
        <!-- 指定hadoop运行时产生文件的存储目录 -->
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/usr/local/hadoop/tmp</value>
    </property>
        <!-- 指定zookeeper地址-->
       <property>
          <name>ha.zookeeper.quorum</name>
          <value>hadoop8:2181,hadoop9:2181,hadoop10:2181</value>
        </property>

</configuration>
~

-配置hdfs-site.xml

<configuration>
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
        <property>
                <name>dfs.nameservices</name>
                <value>ns1</value>
        </property>
<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
        <property>
                <name>dfs.ha.namenodes.ns1</name>
                <value>nn1,nn2</value>
        </property>
<!-- nn1的RPC通信地址 -->
        <property>
                <name>dfs.namenode.rpc-address.ns1.nn1</name>
                <value>hadoop2:9000</value>
        </property>
<!-- nn1的http通信地址 -->
        <property>
                <name>dfs.namenode.http-address.ns1.nn1</name>
                <value>hadoop2:50070</value>
        </property>
<!-- nn2的RPC通信地址 -->
        <property>
                <name>dfs.namenode.rpc-address.ns1.nn2</name>
                <value>hadoop1:9000</value>
        </property>
<!-- nn2的http通信地址 -->
        <property>
                <name>dfs.namenode.http-address.ns1.nn2</name>
                <value>hadoop1:50070</value>
        </property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>qjournal://hadoop11:8485;hadoop12:8485;hadoop13:8485/ns1</value>
        </property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
        <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/usr/local/hadoop/journaldata</value>
        </property>
<!-- 开启NameNode失败自动切换 -->
        <property>
                <name>dfs.ha.automatic-failover.enabled</name>
                <value>true</value>
        </property>
        <!-- 配置失败自动切换实现方式 -->
        <property>
                <name>dfs.client.failover.proxy.provider.ns1</name>
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行 -->
        <property>
                <name>dfs.ha.fencing.methods</name>
                <value>
                        sshfence
                        shell(/bin/true)
                </value>
        </property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
        <property>
                <name>dfs.ha.fencing.ssh.private-key-files</name>
                <value>/home/root/.ssh/id_rsa</value>
        </property>
<!-- 配置sshfence隔离机制超时时间 -->
        <property>
                <name>dfs.ha.fencing.ssh.connect-timeout</name>
                <value>30000</value>
        </property>

</configuration>
  • 配置mapred-site.xml
   <!-- 指定mr运行在yarn上 -->
    <property>
           <name>mapreduce.framework.name</name>
            <value>yarn</value>
    </property>
  • 配置yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
        <!-- reducer获取数据的方式 -->
    <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
     </property>
  <!-- 开启RM高可用 -->
     <property>
           <name>yarn.resourcemanager.ha.enabled</name>
           <value>true</value>
     </property>
  <!-- 指定RM的cluster id -->
     <property>
           <name>yarn.resourcemanager.cluster-id</name>
           <value>yrc</value>
     </property>
 <!-- 指定RM的名字 -->
     <property>
           <name>yarn.resourcemanager.ha.rm-ids</name>
           <value>rm1,rm2</value>
     </property>
 <!-- 分别指定RM的地址 -->
     <property>
           <name>yarn.resourcemanager.hostname.rm1</name>
           <value>hadoop3</value>
     </property>
     <property>
           <name>yarn.resourcemanager.hostname.rm2</name>
           <value>hadoop4</value>
     </property>
 <!-- 指定zk集群地址 -->
     <property>
           <name>yarn.resourcemanager.zk-address</name>
          <value>hadoop8:2181,hadoop9:2181,hadoop10:2181</value>
     </property>
</configuration>
  • 修改slaves 添加datanode节点
hadoop5
hadoop6
hadoop7

配置zookeeper

-修改zoo.cfg
解压zookeeper后,进入conf文件夹,执行命令 mv zoo_sample.cfg zoo.cfg
修改内容,在末尾添加

#设置数据路径和日志路径
dataLogDir=/usr/local/zookeeper/logs
dataDir=/usr/local/zookeeper/data
...............................
server.1=hadoop8:2888:3888
server.2=hadoop9:2888:3888
server.3=hadoop10:2888:3888

利用Dokcerfile构建hadoop镜像文件

下载hadoop-2.7.3、jdk1.8到宿机

#选择centos镜像,如果想用其他版本在centos:version 注明版本号,默认为最新版本
FROM centos 
MAINTAINER cumt zhupc
#配置jdk
ADD jdk-8u131-linux-x64.tar.gz  /usr/local/
RUN mv /usr/local/jdk1.8.0_131 /usr/local/jdk1.8
#添加jdk环境变量
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH
#配置hadoop
ADD hadoop-2.7.3 /usr/local/
RUN mv /usr/local/hadoop-2.7.3 /usr/local/hadoop
#添加hadoop环境变量
ENV HADOOP_HOME /usr/local/hadoop
ENV HADOOP_CONFIG_HOME /usr/local/hadoop/etc/hadoop
ENV HADOOP_LIBEXEC_DIR /usr/local/hadoop/libexec
ENV HADOOP_COMMON_HOME $HADOOP_HOME
ENV HADOOP_HDFS_HOME $HADOOP_HOME
ENV HADOOP_CONF_DIR  /usr/local/hadoop/etc/hadoop
ENV PATH $HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
#安装which,否则在运行hadoop命令时会出错
RUN yum install which -y
#配置zookeeper
ADD zookeeper-3.4.6 /usr/local/
RUN mv /usr/local/zookeeper-3.4.6 /usr/local/zookeeper
#配置zookeeper环境变量
ENV ZK_HOME /usr/local/zookeeper
ENV PATH $ZK_HOME/bin:$PATH
#安装ssh并设置开机自启
RUN yum install -y openssh-server
RUN yum -y install openssh-clients
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
RUN ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""  
#把sshd_config 配置文件中的UsePAM改为no,这步省略也可以
#RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config    
#给root用户添加密码,如果passwd不能用,就安装一个
RUN echo "root:123" | chpasswd 
EXPOSE 22  
ENTRYPOINT  /usr/sbin/sshd -D  




#创建镜像
[zhupc@hadoop-standalone hadoop]$ sudo docker   build -t="hadoop:1.0" .

创建自定义网络

#创建网络
sudo docker network create backend
#查看创建网络
[zhupc@hadoop-standalone hadoop]$ sudo docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f98742410ca2        backend             bridge              local               
94081c44f73b        bridge              bridge              local               
32c81d691f00        host                host                local               
97a754380079        none                null                local 

启动容器集群

#查看构建镜像
[zhupc@hadoop-standalone hadoop]$ sudo docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
hadoop                1.0                 e3124f7dd25c        12 hours ago        1.637 GB

sudo docker run -d  -p 50070:50070 --net=backend --name=hadoop1 --hostname hadoop1 hadoop:1.0
sudo docker run -d --net=backend --name=hadoop2  --hostname hadoop2 hadoop:1.0
...............................................
sudo docker run -d --net=backend --name=hadoop13  --hostname hasoop13 hadoop:1.0
启动zookeeper集群
#分别进入容器
sudo docker exec -it hadoop8
sudo docker exec -it hadoop9
sudo docker exec -it hadoop10

#进入到zookeeper的data文件夹里,创建myid文件 把相应的序号添加进去(这里不再详细说明,如需则去查阅配置zookeeper相关教程)
[root@hadoop9 /]# zkServer.sh start
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

[root@hadoop9 /]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
启动hadoop集群
配置免密码登陆
#在hadoop1上生产一对钥匙
ssh-keygen -t rsa
#将公钥拷贝到其他节点,包括自己
#两个namenode,hadoop1、 hadoop2
ssh-coyp-id hadoop1
ssh-coyp-id hadoop2
#两个resourcemanager, hadoop3 、hadoop4
ssh-coyp-id hadoop3
ssh-coyp-id hadoop4
#三个datanode, hadoop5、 hadoop6、 hadoop7
ssh-coyp-id hadoop5
ssh-coyp-id hadoop6
ssh-coyp-id hadoop7
#三个日志管理节点 hadoop11、hadoop12、hadoop13
ssh-coyp-id hadoop11
ssh-coyp-id hadoop12
ssh-coyp-id hadoop13
#此外需要在hadoop2上生产一对钥匙,并把公钥发到hadoop1上
ssh-keygen -t rsa
ssh-coyp-id hadoop1
#在hadoop3上生产一对秘钥,把公钥拷贝到三个datanode节点上,
ssh-coyp-id hadoop5
ssh-coyp-id hadoop6
ssh-coyp-id hadoop7
#并在hadoop4上也生产一对,把公钥拷贝到hadoop3
ssh-coyp-id hadoop3
#格式化HDFS
#在hadoop上执行     
hdfs namenode -format
#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/usr/local/hadoop/tmp,然后将/usr/local/hadoop/tmp拷贝到hadoop2的/usr/local/hadoop/tmp下。
scp -r tmp/ hadoop2:/usr/local/hadoop/tmp
#格式化ZKFC(在weekend01上执行即可)
hdfs zkfc -formatZK
#启动HDFS(在hadoop1上执行)
 start-dfs.sh

到此配置完毕,访问连接查看情况
http://192.168.1.201:50070

这里写图片描述

搞了3天各种错误,终于搞定,用docker就是爽啊,开了13个容器运行起来完全没压力,不像用vmware的时候,开了三台,就是跑不动

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值