美文网首页
docker安装Hadoop

docker安装Hadoop

作者: ac619467fef3 | 来源:发表于2018-11-04 23:40 被阅读410次

    学习Hadoop首先要安装环境,可以在笔记本或台式机上安装虚拟机搭建分布式测试环境。VM虚拟机占用资源多,而docker可以像VM一样创建虚拟机,但占用资源少,单机也能实现多机分布式环境。
    之前,写过一篇docker实现HDFS,包括创建docker image、Volume、entry_point.sh等细节。但随着对HDFS的理解,发现那篇文章中有关docker持久化、免密码登录等设置都是多余的,而这篇文章尽力简化docker配置,内容还包括搭建HDFS系统、演示求pi的MapReduce程序、YARN web演示和mapred收集日志。

    1. build docker 镜像

    (1)在mac 系统下,安装Docker Toolbox,参考以下官方网址。

    https://docs.docker.com/toolbox/toolbox_install_mac/
    安装好Toolbox后,同时会安装Kitematic软件,这是一个轻量级的docker管理工具。
    抱歉没有安装过程,安装成功后启动,界面如图。

    Kitematic
    在Kitematic界面中,点击左下角的'Docker CLI'按钮,可以打开一个命令行工具(我的电脑安装了Iterm,默认打开Iterm),在打开的iterm中可以执行docker命令。
    docker shell

    通过Dockfile构建虚拟机

    在一个空的目录下创建Dockerfile文件,构造一个Ubuntu 16.04系统镜像。 cd到这个目录,执行下面的命令。命令执行完毕可以在Kitematic中查看结果,如上图在MyImages中多出一个wsn/base镜像。
    注:先启动DockerCLI,在这个CLI中才能执行docker命令。

    ## DockerCLI
    docker build -t wsn/base .
    

    保存文件名为Dockerfile(在这里粘源码,大家可以拿过去用):

    FROM       ubuntu:16.04
    MAINTAINER wsn
    
    RUN apt-get update
    
    RUN apt-get install -y openjdk-8-jdk
    RUN apt-get install -y vim
    RUN apt install -y net-tools
    RUN apt install -y iputils-ping 
    RUN echo 'root:root' |chpasswd
    ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
    ENV JRE_HOME /usr/lib/jvm/java-8-openjdk-amd64/jre
    ENV PATH /usr/lib/jvm/java-8-openjdk-amd64/bin:$PATH
    ENV CLASSPATH ./:/usr/lib/jvm/java-8-openjdk-amd64/lib:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib
    

    2.为docker虚拟机创建网络

    ## docker cli
    docker network create --subnet=172.18.0.0/16 hadoopnet
    

    如果mac系统版本在10.13 以上,还会遇到创建网卡失败的问题,要注意关闭系统安全特性设置。sudo spctl --master-disable
    感谢作者@ 仰望神的光,《macOS 10.13 安装Virtualbox失败,https://blog.csdn.net/u013247765/article/details/78176079
    在主机中添加路由(不用DockerCli,mac的shell命令)

    ## mac shell
    sudo route -n add 172.18.0.0/24 192.168.99.100
    

    3. 创建第一个docker虚拟机

    设置主机名为master、域名也为master。

    ## DockerCLI
    docker run --name master --hostname master --network  hadoopnet --ip 172.18.0.81 -d  -it wsn/base /bin/bash
    

    可以在Kitematic中看到,多出一个虚拟机(重启一下Kitematic)。也可以在dockerCLI中运行docker ps查看虚拟机。
    docker 操作虚拟机的命令有启动、停止、重启docker start/stop/restart。也可以直接在Kitematic中对操作虚拟机。docker stop和VM中关机的效果是一样的。

    Kitematic管理虚拟机

    4.拷贝hadoop安装文件到虚拟机

    docker cp /Users/wangsen/hadoop/hadoop-2.7.3.tar.gz master:/opt
    

    将宿主机的tar包防在master虚拟机的/opt目录。

    5. 获取虚拟机Shell

    获取master虚拟机的shell,在docker CLI 中运行下面的命令,获取master的shell。后面的shell操作都是虚拟机中的操作,如果需要拷贝文件到虚拟机中,可以参考4拷贝文件。

    ## docker cli
    docker exec -it master /bin/bash
    

    6. 配置HDFS系统

    (1) core-site.xml(/opt/hadoop-2.7.3/etc/hadoop/core-site.xml),配置默认文件系统。
    <configuration>
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://master:9000</value>
        </property>
    </configuration>
    
    (2) hdfs-site.xml(/opt/hadoop-2.7.3/etc/hadoop/hdfs-site.xml),配置hdfs。
    <configuration>
        <property>
            <name>dfs.replication</name>
            <value>3</value>
        </property>
        <property>
            <name>dfs.namenode.name.dir</name>
            <value>/data/namedir</value>
        </property>
        <property>
            <name>dfs.datanode.data.dir</name>
            <value>/data/datadir</value>
        </property>
    </configuration>
    

    name.dir:namenode节点存放文件的位置。(包括fsimage和editlog,fsimage包含命名空间文件目录树,节点和block对应的关系。在namenode内存中,还包含了block和节点对应信息,但这部分不会持久化到内存。
    data.dir:datanode保存block的路径。

    (3) 格式化namenode节点
    ## 创建name.dir data.dir的根路径
    mkdir /data 
    ##  format namenode
    bin/hadoop namenode -format
    
    (4) 启动hdfs
    sbin/hadoop-daemon.sh start namenode
    sbin/hadoop-daemon.sh start datanode
    
    (5) Web UI查看HDFS

    修改本地hosts,方便查看,添加 master 172.26.0.81
    在浏览器中输入 http://master:50070

    HDFS WEB UI
    (6) 上传文件到HDFS
    bin/hdfs dfs -mkdir /jianshu
    bin/hdfs dfs -put /opt/hadoop-2.7.3/README.txt /jianshu
    bin/hdfs dfs -cat /jianshu/README.txtt
    
    测试文件上传和读取

    7.配置YARN

    (1) 修改yarn-site.xml
    <configuration>
      <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
      </property>
      <property>
        <name>yarn.resourcemanager.address</name>
        <value>master:18040</value>
      </property>
      <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>master:18030</value>
      </property>
      <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>master:18025</value>
      </property>
      <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>master:18141</value>
      </property>
      <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>master:18088</value>
      </property>
      <property>
        <name>yarn.resourcemanager.scheduler.class</name>      <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
      </property>
      <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
      </property>
    <property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>false</value>
      </property>
      <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
      </property>
    </configuration>
    
    (2) 修改mapred.xml
    <configuration>
       <property>
         <name>mapreduce.framework.name</name>
         <value>yarn</value>
       </property>
       <property>
         <name>mapreduce.jobhistory.done-dir</name>
         <value>/user/history/done</value>
      </property>
      <property>
        <name>mapreduce.jobhistory.intermediate-done-dir</name>
        <value>/user/history/done_intermediate</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>master:10020</value>
      </property>
      <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>master:19888</value>
      </property>
    </configuration>
    
    (3) 启动服务
    sbin/yarn-daemon.sh start resourcemanager
    sbin/yarn-daemon.sh start nodemanager
    sbin/mr-jobhistory-daemon.sh start historyserver
    

    可以用jps命令查看进程。用web ui查看yarn集群情况,可以查看节点和作业情况。


    yarn集群
    (4) 提交mapreduce作业

    hadoop安装包中,包含示例jar,可以通过hadoop jar 提交 mapreduce作业。

    bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar \ 
    pi 100 10000
    

    控制台输出结果
    第一阶段,Wrote input for Map 0~99

    Number of Maps  = 100
    Samples per Map = 10000
    Wrote input for Map #0
    Wrote input for Map #1
    Wrote input for Map #2
    ...
    Wrote input for Map #99
    

    执行mapreduce任务0~99

    18/11/05 23:21:29 INFO client.RMProxy: Connecting to ResourceManager at master/172.18.0.81:18040
    18/11/05 23:21:30 INFO input.FileInputFormat: Total input paths to process : 100
    18/11/05 23:21:30 INFO mapreduce.JobSubmitter: number of splits:100
    18/11/05 23:21:31 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1541459403717_0001
    18/11/05 23:21:32 INFO impl.YarnClientImpl: Submitted application application_1541459403717_0001
    18/11/05 23:21:32 INFO mapreduce.Job: The url to track the job: http://master:18088/proxy/application_1541459403717_0001/
    18/11/05 23:21:32 INFO mapreduce.Job: Running job: job_1541459403717_0001
    18/11/05 23:21:44 INFO mapreduce.Job: Job job_1541459403717_0001 running in uber mode : false
    18/11/05 23:21:44 INFO mapreduce.Job:  map 0% reduce 0%
    18/11/05 23:22:12 INFO mapreduce.Job:  map 4% reduce 0%
    18/11/05 23:22:13 INFO mapreduce.Job:  map 6% reduce 0%
    ...
    

    执行完毕输出结果

    18/11/05 23:28:36 INFO mapreduce.Job:  map 100% reduce 33%
    18/11/05 23:28:37 INFO mapreduce.Job:  map 100% reduce 100%
    18/11/05 23:28:37 INFO mapreduce.Job: Job job_1541459403717_0001 completed successfully
    18/11/05 23:28:37 INFO mapreduce.Job: Counters: 49
        File System Counters
            FILE: Number of bytes read=2206
            FILE: Number of bytes written=11990913
            FILE: Number of read operations=0
            FILE: Number of large read operations=0
            FILE: Number of write operations=0
            HDFS: Number of bytes read=26090
            HDFS: Number of bytes written=215
            HDFS: Number of read operations=403
            HDFS: Number of large read operations=0
            HDFS: Number of write operations=3
        Job Counters
            Launched map tasks=100
            Launched reduce tasks=1
            Data-local map tasks=100
            Total time spent by all maps in occupied slots (ms)=2013035
            Total time spent by all reduces in occupied slots (ms)=327678
            Total time spent by all map tasks (ms)=2013035
            Total time spent by all reduce tasks (ms)=327678
            Total vcore-milliseconds taken by all map tasks=2013035
            Total vcore-milliseconds taken by all reduce tasks=327678
            Total megabyte-milliseconds taken by all map tasks=2061347840
            Total megabyte-milliseconds taken by all reduce tasks=335542272
        Map-Reduce Framework
            Map input records=100
            Map output records=200
            Map output bytes=1800
            Map output materialized bytes=2800
            Input split bytes=14290
            Combine input records=0
            Combine output records=0
            Reduce input groups=2
            Reduce shuffle bytes=2800
            Reduce input records=200
            Reduce output records=0
            Spilled Records=400
            Shuffled Maps =100
            Failed Shuffles=0
            Merged Map outputs=100
            GC time elapsed (ms)=30536
            CPU time spent (ms)=38390
            Physical memory (bytes) snapshot=20298399744
            Virtual memory (bytes) snapshot=194468679680
            Total committed heap usage (bytes)=13775880192
        Shuffle Errors
            BAD_ID=0
            CONNECTION=0
            IO_ERROR=0
            WRONG_LENGTH=0
            WRONG_MAP=0
            WRONG_REDUCE=0
        File Input Format Counters
            Bytes Read=11800
        File Output Format Counters
            Bytes Written=97
    Job Finished in 427.752 seconds
    Estimated value of Pi is 3.14155200000000000000
    
    (5) yarn web ui查看信息

    打开 http://master:18088。(在配置文件yarn-site.xml,yarn.resourcemanager.webapp.address中配置url)

    yarn resourcemanager
    左边菜单栏可以选择Nodes或者Application,Application标签页可以看到提交了2个任务。job_1541459403717_0001是我们提交的任务,可以对应上一节console的输出。
    查看job信息
    点击History查看信息
    mapreduce日志
    从日志信息中可以看到:shuffle过程最耗时,共启动了100个map任务,1个reduce任务。

    6. 添加节点实现分布式

    创建节点

    #docker cli
    docker run --name node1 --hostname node1 --network  hadoopnet --ip 172.18.0.82 -d  -it wsn/base /bin/bash
    

    拷贝hadoop文件

    docker cp /Users/wangsen/hadoop/hadoop-2.7.3.tar.gz node1:/opt
    

    获取node1 shell

    docker exec -it node1 /bin/bash
    

    导出master 中的配置文件etc文件中全部内容,拷贝到node1:/opt/hadoop-2.7.3/etc/hadoop目录中。

    docker cp master:/opt/hadoop-2.7.3/etc/hadoop ~/backetc
    docker cp ~/backetc/hadoop/ node1:/opt/hadoop-2.7.3/etc
    

    启动datanode

    sbin/hadoop-deamon.sh start datanode
    

    通过web ui查看datanode


    Web ui 查看添加的datanode

    上传文件NOTICE.txt到hdfs,通过Web UI查看信息,看到NOTICE.txt文件保存在node1和master两个节点上:


    文件信息

    7. 添加nodemanager

    在node1中执行下面的命令

    sbin/yarn-daemon.sh start nodemanager
    
    2个node节点

    提交pi任务:

    bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar  \
    pi 100 10000
    
    2个Nodemanager

    注:从结果看有4个map任务failed,可以通过日志进行检查。而且2个节点比1个节点的运行时间更长,可能是系统Memory资源不足,反复调入调出内存。

    总结

    用docker搭建学习环境比较方便,docker系统内置了DNS服务,设置好docker虚拟机的name,可以自动实现域名解析。
    在配置hdfs的时候,通常要配置证书和免密码登录,当namenode要启动datanode节点上进程的时候才需要。如果手动配置启动,datanode主动连接namenode。
    本文用hadoop jar运行了mapreduce任务,jar包含在hadoop 实例程序中,演示了yarn web ui使用。
    本文希望读者可以按照步骤自己实现环境的搭建,如果遇到HDFS搭建环境问题,请留言一起讨论。

    相关文章

      网友评论

          本文标题:docker安装Hadoop

          本文链接:https://www.haomeiwen.com/subject/zatjxqtx.html