zoukankan      html  css  js  c++  java
  • 搭建ubuntu14.04的hadoop集群【docker容器充当服务器】

    首先弄出来装有hadoop、java、ssh、vim的镜像起名badboyf/hadoop。
    做镜像有两种方法,一种是用Dockerfile来生成一个镜像,一种是基于ubuntu14.04的基础镜像生成容器后进入容器设置完成后,根据容器打成新的镜像。这是第一次弄,各种不会的地方,所以用第二种方法,弄出来后会如果有时间在写Dockerfile来生成镜像。(为什么尽量用Dockerfile生成镜像,由容器生成的镜像特别大,比想象中的大,而且Dockerfile容易传输)

    开始

    首先需要ubuntu14.04的镜像,拉取镜像:

    docker pull ubuntu:14.04

    根据镜像生成一个容器:(这个容器ip为172.17.0.2 ip是自动生成的)

    docker run -it --name hadoop ubuntu:14.04 /bin/bash

    /bin/bash这个是启动命令,当执行完这条语句后就会直接进入容器并交给一个终端。
    由于是ubuntu的镜像,需要修改源,自带的源在国内速度太慢

    vi /etc/apt/sources.list 

    将下面的代码替换掉源文件的代码:

    deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
    apt-get update 
    apt-get install vim-gtk
    apt-get install openssh-server

    下载需要的软件,要操作系统,还不会用vi所以下了个vim,下载ssh因为hadoop和jdk的安装包已经下载好了需要传到容器中,并且集群的搭建也需要用到ssh。
    容器中其实就是ubuntu的操作系统,所以就大胆的弄,把需要的包都传上来并安装,在容器中执行

    service ssh start
    scp
    root@192.168.1.30:/home/hadoop-3.0.0-alpha1-src.tar.gz / scp root@192.168.1.30:/home/jdk-8u102-linux-x64.tar.gz /
    tar -zxvf jdk-8u102-linux-x64.tar.gz /usr/local/java/
    mv /usr/local/java/jdk1.8.0_102 /usr/local/java/jdk1.8
    tar -zxvf hadoop-3.0.0-alpha1-src.tar.gz .

    #配置
    vim /etc/profile
    #下面这些粘到最后面export JAVA_HOME=/usr/local/java/jdk1.8
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH
    export HADOOP_INSTALL=/hadoop-3.0.0-alpha1
    export PATH=$PATH:$HADOOP_INSTALL/bin:$HADOOP_INSTALL/sbin

    #这个参数在搭建集群的时候会用到
    touch /etc/profile.d/hadoop_home_env.sh
    vim /etc/profile.d/hadoop_home_env.sh
    # 加上
    export HADOOP_HOME=/hadoop-3.0.0-alpha1

    输入 java -version 查看java安装是否成功,输入hadoop 查看hadoop是都安装成功。
    确保安装成功后,开始集群的配置:(一下配置 copy自 http://blog.csdn.net/u010499619/article/details/52886872 稍做修改)
    hadoop3.0需要配置的文件有core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、hadoop-env.sh、workers都在hadoop安装目录的/etc/hadoop下

    1.core-site.xml配置文件
    <configuration>  
      <property>  
        <name>fs.defaultFS</name>   
         <value>hdfs://master:9000</value>  
      </property>  
      <property>  
          <name>hadoop.tmp.dir</name>  
          <value>/hadoop-3.0.0-alpha1/tmp</value>  
      </property>  
    </configuration>  

    2.hdfs-site.xml配置文件

    <configuration>  
     <property>  
       <name>dfs.replication</name>  
       <value>1</value>  
     </property> 
    </configuration> 

    3.workers中设置slave节点,将slave机器的名称写入

    slave1  

    4.mapred-site配置
    (加黑的部分是因为我电脑上docker容器上的内存不够,执行mapreduce程序时Container [] is running beyond virtual memory limits。随自己的电脑情况来看,如果不是容器,虚拟机或真机的话,这应该不会有问题。

    cp mapred-site.xml.template mapred-site.xml  
    <configuration>  
        <property>  
            <name>mapreduce.framework.name</name>  
            <value>yarn</value>  
        </property>

      <property>
        <name>mapreduce.map.memory.mb</name>
        <value>1024</value>
      </property>
      <property>
        <name>mapreduce.map.memory.mb</name>
        <value>800</value>
      </property>

      <property>
        <name>mapreduce.map.java.opts</name>
        <value>-Xmx256m</value>
      </property>
      <property>
        <name>mapreduce.reduce.java.opts</name>
        <value>-Xmx512m</value>
      </property>

    <property>  
     <name>mapreduce.application.classpath</name>  
     <value>  
      /hadoop-3.0.0-alpha1/etc/hadoop,  
      /hadoop-3.0.0-alpha1/share/hadoop/common/*,  
      /hadoop-3.0.0-alpha1/share/hadoop/common/lib/*,  
      /hadoop-3.0.0-alpha1/share/hadoop/hdfs/*,  
      /hadoop-3.0.0-alpha1/share/hadoop/hdfs/lib/*,  
      /hadoop-3.0.0-alpha1/share/hadoop/mapreduce/*,  
      /hadoop-3.0.0-alpha1/share/hadoop/mapreduce/lib/*,  
      /hadoop-3.0.0-alpha1/share/hadoop/yarn/*,  
      /hadoop-3.0.0-alpha1/share/hadoop/yarn/lib/*  
     </value>  
    </property>  
    </configuration>

    5.yarn-site.xml配置

    <configuration>  
        <property>  
            <name>yarn.nodemanager.aux-services</name>  
            <value>mapreduce_shuffle</value>  
        </property>  
        <property>  
            <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>  
            <value>org.apache.hadoop.mapred.ShuffleHandle</value>  
        </property>  
        <property>  
            <name>yarn.resourcemanager.resource-tracker.address</name>  
            <value>master:8025</value>  
        </property>  
        <property>  
            <name>yarn.resourcemanager.scheduler.address</name>  
            <value>master:8030</value>  
        </property>  
        <property>  
            <name>yarn.resourcemanager.address</name>  
            <value>master:8040</value>  
        </property>  
    </configuration>  

    6.hadoop-env.sh中配置java_home

    export JAVA_HOME=/usr/local/java/jdk1.8.0_101  #必须设置,即使配置了在profile中配置了java_home得设置

    这样基础的容器搭建好,ctrl + d 或者 exit 退出容器。

    docker commit hadoop badboyf/hadoop

    docker images 查看镜像
    这个镜像是特别大的,我打出来两个多G,所以说还是用Dockerfile来打镜像
    使用docker做这个测试的原因就是比较懒,不想装两个虚拟机,还是比较懒,所以直接就用这个容器当做了master,在根据生成的镜像生成一个slave1节点。(ip:172.17.0.3)

    docker run -it --name slave1 --link hadoop:master badboyf/hadoop:latest /bin/bash

    用--link是新生成的容器能根据别名(master)就能找到hadoop这个容器,进入容器后查看 /etc/hosts 文件多了一行

    127.0.0.1       localhost
    ::1     localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.17.0.2      master 029b3703b460 hadoop
    172.17.0.3      1c0160d6ad3d slave1
    172.17.0.2      master 029b3703b460 hadoop这个是--link自动加的
    下面的slave1是手动加的,使用slave1也能让这个容器认识自己,因为 $HADOOP_INSTALL/etc/hadoop/worders 中写的是slave1

    也要修改hadoop容器中的 /etc/hosts 文件:

    127.0.0.1       localhost
    ::1     localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.17.0.2      029b3703b460 master
    172.17.0.3      1c0160d6ad3d slave1

    加黑的部分是各自的容器的主机的名(终端输入hostname查看)及自己hadoop配置中用到的名,这里是手动加的,在生产环境肯定不是这么玩的,但是水平有限,先能程序跑通在优化吧。为什么要把主机的名也添加上,mapreduce程序在跑的时候有一步resourcemanager需要连slave1用的就是主机名。而且在/etc/hosts文件在容器重启的时候会恢复最后备份一下,到时候直接粘过去,还是水平有限。还有重启的时候/etc/profile、/etc/profile.d/里边的文件 需要重新source一下。ssh服务需要重启(service ssh restart)。
    配置两个容器间免密码登陆:

    ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa  #两个容器都生成公钥,生成~/.ssh/id_rsa.pub、~/.ssh/id_rsa

    把id_rsa.pub里面的内容分别复制到对方的容器中~/.ssh/authorized_keys文件中。测试过程中最好也配置一下本身容器的免密码登陆,可以测试一下hosts中是否配置成功。

    到这里,配置已经完事。开始测试程序是否能在集群里跑通。
    格式化namenode:这步一定要先执行(主从节点都执行)

    hdfs namenode -format   

    启动dfs及yarn(启动程序之类的脚本都在 hadoop安装目录/sbin/  目录下)(这步只需在主节点执行,当主节点执行完成后,到从节点容器中用jps命令查看,会发现已经启动了需要启动的程序)

    start-dfs.sh  
    start-yarn.sh  

    测试mapreduce程序:(跑程序前需要先穿件好输入文件)

    hadoop fs -mkdir /input
    hadoop fs -put /README.txt /input
    hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.0-alpha1.jar grep /input /output 'dfs[a-z]+'

    遇到的各种问题:

    程序运行期间可能会出现各种问题,这是需要把log级别放宽点,打开DEBUG级别:

    export HADOOP_ROOT_LOGGER=DEBUG,console
    export HADOOP_ROOT_LOGGER=INFO    #处理完问题在把级别设成info,debug输出的东西太多了

    java.net.ConnectException: Connection refused:
    先看看hdfs是否启动了,在看看ssh服务是否启动,然后确定自己配置的master,slave1能否在各自的容器中识别,可以利用ssh。

    libexec 中的文件不能执行之类的问题:
    /etc/profile.d/   里边的文件配置HADOOP_HOME环境变量出错。

    在执行中一直停在running job:
    打开debug级别,如果一直在connect to 一堆乱七八糟的字母,因为hosts中配置的问题,把从节点主机名与ip对应

    hfds系统默认生成的文件系统在/tmp/下,如果感觉是操作文件系统时发生什么状况(比如更改配置后在用hadoop fs时就报错之类的问题),需要重新格式化一下,把所有的都停了:

    stop-yarn.sh
    stop-dfs.sh

    然后

    rm -fr /tmp
    hdfs namenode -format

    删掉目录里的东西,如果你的系统中这个目录有其他有用的文件,到这个里面找到有关hadoop的文件夹在删掉。然后在重新format。如果还不好用,看看是不是core-site.xml文件里边的配置有问题。

  • 相关阅读:
    pipelinewise 学习二 创建一个简单的pipeline
    pipelinewise 学习一 docker方式安装
    Supercharging your ETL with Airflow and Singer
    ubuntu中使用 alien安装rpm包
    PipelineWise illustrates the power of Singer
    pipelinewise 基于singer 指南的的数据pipeline 工具
    关于singer elt 的几篇很不错的文章
    npkill 一个方便的npm 包清理工具
    kuma docker-compose 环境试用
    kuma 学习四 策略
  • 原文地址:https://www.cnblogs.com/badboyf/p/6251263.html
Copyright © 2011-2022 走看看