基于docker从零手动搭hadoop分布式集群(超详细亲测有效)

一、目的:仓库中现成的hadoop集群镜像都是一键部署,对于刚学习大数据的同学非常不友好,新手还是需要手动自己搭建集群,这样才能更深入的理解和学习hadoop。考虑到虚拟机太浪费资源,网上搜索到的都是一键式搭建集群的镜像,看好多博客都说registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop这个镜像是个纯净镜像但是我docker pull的时候报错找不到镜像,一番百度之后无果,所以无奈之下就只能自己动手基于docker搭建hadoop分布式集群

二、步骤(如果不想麻烦自己构建hadoop镜像可以直接跳到第4步)

  1. 环境准备
  • 本机下载并按照好docker环境
  • 拉取docker centos镜像
  • 下载liunx版本jdk压缩包,最好是1.8
  • 下载hadoop源码然后编译成源文件,也可以直接下载编译好的源文件(我下载的是hadoop-2.7.7.tar.gz)
#安装wget
apt-get install wget
#下载hadoop编译文件
wget http://mirrors.sonic.net/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz
#解压文件
tar -xvzf Hadoop-2.7.7.tar.gz
  1. 将下载好的jdk和hadoop源文件放在一个文件夹下,并在该文件夹下创建一个dockerfile文件(注意jdk和hadoop必须和dockerfile文件在一个文件夹下不然copy命令就会报错),vi加入如下内容:
#选择一个已有的os镜像作为基础:
FROM centos
#镜像作者
MAINTAINER 1919698075
#安装java
COPY jdk1.8.0_144  /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH
#安装hadoop
COPY hadoop-2.7.7 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
#安装相应的支持的软件包,openssh-server/clients 和 sudo
RUN yum install -y openssh-server sudo
RUN yum install which
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN yum install -y openssh-clients
#添加相应的镜像系统下的root用户,这个是必须的操作
RUN echo "root:root" | chpasswd
RUN echo "root ALL=(ALL)    ALL" >> /etc/sudoers
#给SSH生成密钥对
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
#启用sshd服务并且暴露相关的端口信息
RUN mkdir /var/run/sshd
EXPOSE 22
CMD [ "/usr/sbin/sshd","-D"]
  1. 基于以上dokcerfile构建自己的镜像文件,该镜像文件集成了ssh,jdk,hadoop环境,是一个纯净的镜像
# -t后面指定镜像名,可以自定义
docker bulid -t ruiclear/clean-hadoop
  1. 如果觉得上面的过程麻烦,也可以直接使用我已经推送到阿里云镜像库中的镜像
docker pull registry.cn-hangzhou.aliyuncs.com/ruiclear/clean-hadoop:1.0.0
  1. 现在已经构建好了镜像,是时候开始搭建我们的hadoop集群了
  • 启动master节点(–name指定容器名,-d表示是在后台运行,-h指定主机名,-P参数表明随机端口映射,-p 指定端口映射)
#master节点开通端点映射,便于通过web监控集群状态(slave节点不需要开通)
docker run --name master -d -h master -P -p 50070:50070 -p 8088:8088 ruiclear/clean-hadoop
  • 启动slave1节点
docker run --name slave1 -d -h slave1 -P ruiclear/clean-hadoop
  • 启动slave2节点
docker run --name slave2 -d -h slave2 -P ruiclear/clean-hadoop
  • 启动后可以使用docker ps命令查看刚刚启动的三个容器
  1. 接下来分别使用如下命令登录进容器,-it 表示使用交互式的方式登录容器,master指明需要登录的容器名,这里我们在启动容器的时候给容器起了个好记的别名,如果没有指定需要使用docker ps命令显示出来的容器id。
docker exec -it master bin/bash

docker exec -it slave1 bin/bash

docker exec -it slave2 bin/bash
  1. 由于hadoop集群之间通信时需要ssh免密操作,所以接下来配置三个集群之间两两免密操作
  • 在登录进去的master、slave1和slave2机器上分别执行如下命令查看ip地址(docker的ip一般都是以172开头的)
#地址一般在最后eth0的下两行
ip addr
  • 然后是配置域名映射,在每个机器上执行vi /etc/hosts,将如下内容粘贴进去
#我以我的ip为例,每个人的地址可能不一样需要进行相应的修改
172.17.0.2      master
172.17.0.3      slave1
172.17.0.4      slave2
  • 在登录进去的master、slave1和slave2机器上分别执行
ssh-keygen -t rsa
  • 接着按三次空格即可,此时在/root/.ssh文件夹下就生成了私钥和公钥
  • 然后在本机、slave1和slave2机器执行如下命令,注意需要输入密码root
ssh-copy-id master
  • 此时master上/root/.ssh目录下就生成了authorized_keys文件里面记录了master、slave1和slave2的公钥,此时在slave1和slave2上执行ssh master登录就不需要密码了
  • 然后vi master上生成的authorized_keys拷贝内容在slave1和slave2机器的/root/.ssh目录下生成一个authorized_keys文件并将内容粘贴到这个文件中,保存退出。至此三个机器实现了两两免密登录
  1. 接下来就开始要配置hadoop环境了,cd进入/usr/local/hadoop/etc/hadoop路径,这个目录都是hadoop的配置文件
  • 首先配置hadoop-env.sh,yarn-env.sh,mapred-env.sh文件,配置Java_HOME
    在每个文件中添加 export JAVA_HOME=/user/local/jdk1.8
  • 配置core-site.xml
 
        
            fs.defaultFS
            hdfs://master:9000
        

        
        
            hadoop.tmp.dir
            /opt/module/hadoop-2.7.2/data/tmp
        
  • 配置hdfs-site.xml
        
        
            dfs.replication
            3
        
        
        
              dfs.namenode.secondary.http-address
              slave2:50090
        
  • 配置yarn-site.xml
        
            yarn.nodemanager.resource.memory-mb
            20480
        
        
           yarn.scheduler.minimum-allocation-mb
           2048
        
        
            yarn.nodemanager.vmem-pmem-ratio
            2.1
        
        
        
        
                yarn.nodemanager.aux-services
                mapreduce_shuffle
        

        
        
            yarn.resourcemanager.hostname
            slave1
        
        
        
            yarn.log-aggregation-enable
            true
        

        
        
            yarn.log-aggregation.retain-seconds
            604800
        
  • 配置mapred-site.xml

        mapreduce.framework.name
        yarn
    
    
    
        mapreduce.jobhistory.address
        slave2:10020
    
    
    
        mapreduce.jobhistory.webapp.address
        slave2:19888
    
  • 配置slaves文件
master
slave1
slave2
  1. 至此配置文件就配置好了,接下来就是分发配置文件到slave1和slave2机器
scp hadoop-env.sh yarn-env.sh mapred-env.sh core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml slaves root@slave1:/usr/local/hadoop/etc/hadoop/
scp hadoop-env.sh yarn-env.sh mapred-env.sh core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml slaves root@slave2:/usr/local/hadoop/etc/hadoop/

注意:scp是全部覆盖的远程拷贝即不管文件相不相同都直接进行拷贝覆盖,也可以使用rsync进行差异拷贝即文件不同才拷贝文件相同则跳过,所以rsync效率要更高

  1. 至此恭喜你已经全部配置完成,接下来就是启动服务
  • 格式化hdfs文件系统,在namenode节点上(我这里是master机器)执行
hdfs namenode -format
  • 启动hdfs(需要在namenode节点上执行)
#在sbin路径下
start-dfs.sh
  • 启动yarn,需要在配置了Resourcemanager机器上执行
#在sbin路径下
start-yarn.sh
  • 启动历史服务器(用来记录执行任务的历史)
#在sbin路径下
mr-jobhistory-daemon.sh start historyserver
  • 都启动完成之后各个服务执行jps查看启动的程序状态如下:

master:

[root@master hadoop]# jps
5361 DataNode
5225 NameNode
6459 Jps

slave1:

[root@slave1 hadoop]# jps
3936 ResourceManager
4049 NodeManager
3798 DataNode
5084 Jps

slave2:

[root@slave2 hadoop]# jps
2962 Jps
2548 SecondaryNameNode
2437 DataNode
2647 NodeManager
  1. 至此,如果没有意外上面的命令执行成功就表明集群搭建成功。接下来执行wordcount例子来验证下是否集群启动成功
  • 创建文件并上传至hdfs
cd /usr/local/hadoop
mkdir input
#在文件随便输入一些单词,以空格分隔
vim input/input
#上传到hdfs的根目录
hadoop fs -put /input /

注:可以通过hdoop fs -ls / 命令查看目录

  • 执行实例job执行wordcount任务,如果没有报错执行完成就应该执行成功了,可以通过hadoop fs -cat /output/part-r-00000 查询执行结果
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /input /output
  1. 恭喜你,现在就可以在宿主机上通过浏览器访问hadoop 50070端口对集群状态进行查看了,由于我们已经在docker run的时候指定了端口映射所以可以直接通过 localhost:50070访问

你可能感兴趣的:(java,hdfs,hadoop)