zoukankan      html  css  js  c++  java
  • 在oracle Virtual Box 虚拟机中搭建hadoop1.2.1完全分布式环境(转自康哥的博客)

    该博文转自康哥的博客:kangfoo.github.io/article/2013/12/xu-ni-ji-an-zhuang-hadoop-wan-quan-fen-bu-shi/

    因为自己在参考博文进行集群部署的时候出现了很多误解,导致浪费了不少时间,因此想转过来并进行修改和注释,希望能减少一些不合理的地方。

    一、初衷

    对于学习 Hadoop 的我来讲,没有足够的硬件设备,但又想安装完全分布式的Hadoop,一个 master 两个 slave。手上就一台能联网的笔记本,那就使用 oracle vitual box 进行环境搭建吧。环境搭建的效果为:在虚拟机中虚拟3台 centos6.4 64 位系统,每台都配置双网卡 NAT,host-only 模式。在宿主机器上安装 eclipse 进行 Hadoop 开发。

    Hadoop 环境搭建很大部分是在准备操作系统。具体如何搭建 Hadoop 其实就像解压缩普通的 tar 类似。然后再适当的配置 Hadoop 的 dfs,mapredurce 相关的配置,调整操作系统就可以开始着手学习 Hadoop了。

    二、拓补图

    图片制作中… …

    • master11:192.168.56.11
    • slave12:192.168.56.12
    • slave14:192.168.56.14

    三、介质准备

    其他版本可到相关官方网站根据需要自行下载

    四、虚拟机和基础环境搭建

    这里主要操作有:安装一个新的oracle virtual box,并先安装一个centos6.4 的64位的操作系统。配置操作系统双网卡、修改机器名为master11、新建hadoop用户组和hadoop用户、配置sudo权限、安装配置 java环境、同步系统时间、关闭防火墙。其中有些步骤需要重启操作系统后成效,建议一切都配置后再重启并再次验证是否生效,并开始克隆两个 DataNode节点服务器slave12slave14。

    4.1 安装虚拟机

    可参见官方文档安装oracle virtual box

    4.2 在虚拟机里安装centos6.4

    此处使用的是mini版的centos6.4 64位网易提供的镜像。在安装中内存调整大于等于1g,默认为视图安装界面,小于1g则为命令行终端安装方式。可更具实际情况调整虚拟机资源分配。此处为内存1g,存储20g.网络NAT模式。

    具体可参见centos安装

    最好安装最简易的centos版本,连图形化都不需要,这样的可以节省空间和内存。

    4.3 配置双网卡

    使用自己的笔记本经常遇到的问题就是在不同的网络下ip是不一样的。那么我们在学习hadoop的时候岂不是要经常修改这些ip呢。索性就直接弄个host-only模式的让oracle virtual box提供一个虚拟的网关。具体步骤:

    1. 先关闭计算机 sudo poweroff

    2. 打开virtualbox主界面,依次点击屏幕左上角virtualbox->偏好设置->网络->点击右侧添加图标添加一个Host-Only网络vboxnet0,再设置参数值

      主机虚拟网络界面(A)
      IPv4地址(I):192.168.56.11
      IPv4网络掩码(M):255.255.255.0
      IPv6地址(P):空
      IPv6网络掩码长度(L):0
      DHCP服务器(D)
      选择启动服务器
      服务器地址(r):192.168.56.100
      服务器网络掩码(M):255.255.255.0
      最小地址(L):192.168.56.254
      最大地址(U):192.168.56.254
      
      截图:(ip地址的最后一位应该是11,不是1)
    3. image
    4. 配置网卡1。选中你刚新建的虚拟机,右键设置->网络->网卡1->点击启动网络连接(E)

      连接方式(A):仅主机(Host-Only)适配器
      界面名称(N):vboxnet0(此处需要注意,如果没有进行步骤1那么这里可能无法选择,整个设置流程会提示有错误而无法继续)
      高级
      控制芯片(T):xxx
      混杂模式(P):拒绝
      MAC地址(M):系统随机即可
      接入网线(C):选中
      
    5. 配置网卡2。点击网卡2->点击启动网络连接(E)

      连接方式(A):网络地址装换(NAT)
      界面名称(N):
      高级(d)
      控制芯片(T):xxx
      混杂模式(P):拒绝
      MAC地址(M):系统随机即可
      接入网线(C):选中
      
    6. 配置网络。启动操作系统,使用root用户进行网络配置。

      cd /etc/sysconfig/network-scripts/
      cp ifcfg-eth0 ifcfg-eth1

      配置ifcfg-eth0,ifcfg-eth1两个文件与virtual box 中的网卡mac值一一对应, ONBOOT=yes开机启动。并将ifcfg-eth1中的网卡名称eth0改为eth1,再重启网路服务。

      service network start

      其中eth0的网关信息比较多,需要根据情况具体配置。如,这里使用eth0为host-only模式,eth1为nat模式,eth0为固定ip,eth1为开机自动获取ip。可参考如下:

      [root@master11 network-scripts]# cat ifcfg-eth0
      DEVICE=eth0
      HWADDR=08:00:27:55:99:EA(必须和virtual box 中的mac地址一致)
      TYPE=Ethernet
      UUID=dc6511c2-b5bb-4ccc-9775-84679a726db3(没有可不填)
      ONBOOT=yes
      NM_CONTROLLED=yes
      BOOTPROTO=static
      NETMASK=255.255.255.0
      BROADCAST=192.168.56.255
      IPADDR=192.168.56.11

      [root@master11 network-scripts]# cat ifcfg-eth1 DEVICE=eth1 HWADDR=08:00:27:13:36:C3 TYPE=Ethernet UUID=b8f8485e-b731-4b64-8363-418dbe34880d ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=dhcp

    4.4 检查机器名称

    检查机器名称。修改后,重启生效。

    cat /etc/sysconfig/network

    这里期望得机器名称信息是:

     NETWORKING=yes
     HOSTNAME=master11

    最好也编辑一下etc/hosts文件,将master11,slave12以及slave14全部写入hosts文件,这样在使用ssh的时候就不需要输入IP地址了

    4.5 建立hadoop用户组和用户

    新建hadoop用户组和用户(以下步骤如无特殊说明默认皆使用hadoop)

    1
    2
    3
    groupadd hadoop
    useradd hadoop -g hadoop
    passwd hadoop

    4.6 配置sudo权限

    CentOS普通用户增加sudo权限的简单配置
    查看sudo是否安装:

    1
    rpm -qa|grep sudo

    修改/etc/sudoers文件,修改命令必须为visudo才行

    1
    visudo -f /etc/sudoers

    在root ALL=(ALL) ALL 之后增加

    1
    2
    hadoop ALL=(ALL) ALL
    Defaults:hadoop timestamp_timeout=-1,runaspw
    增加普通账户hadoop的sudo权限
    timestamp_timeout=-1 只需验证一次密码,以后系统自动记忆
    runaspw  需要root密码,如果不加默认是要输入普通账户的密码

    修改普通用户的.bash_profile文件(vi /home/hadoop/.bash_profile),在PATH变量中增加 /sbin:/usr/sbin:/usr/local/sbin:/usr/kerberos/sbin

    4.7 安装java

    使用hadoop用户sudo rpm -ivh jdk-7-linux-x64.rpm进行安装jdk7。 配置环境变量参考CentOS-6.3安装配置JDK-7

    如果真正使用非图形化的linux系统,最好先配置好ssh,这样的传输文件比如jdk就非常方便

    4.8 同步服务

    安装时间同步服务sudo yum install -y ntp 设置同步服务器 sudo ntpdate us.pool.ntp.org

    这个的作用就是同步时间么?但是不知道有什么其他意义?

    4.9 关闭防火墙

    hadoop使用的端口太多了,图省事,关掉。chkconfig iptables off。需要重启。

    4.10 克隆

    使用虚拟机进行克隆2个datanode节点。配置网卡(参见第五步)。配置主机名(参见第六步)。配置hosts,最好也包括宿主机(sudo vi /etc/hosts

    192.168.56.11 master11
    192.168.56.12 slave12
    192.168.56.14 slave14
    

    同步时间

    1
    sudo ntpdate us.pool.ntp.org

    重启服务service network start。可能出现错误参见device eth0 does not seem to be present, delaying initialization

    4.11 配置ssh

    1. 单机ssh配置并回环测试
      1
      2
      3
      4
      ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa  
      chmod 700 ~/.ssh
      cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
      chmod 600 ~/.ssh/authorized_keys
      输入ssh localhost不用输入密码直接登陆,表明ssh配置成功。(若未重新权限分配,可能无法实现ssh免密码登陆的效果。浪费了我不少时间。)
    2. 配置master和slave间的ssh 在slave12上执行
      1
      2
      scp hadoop@master11:~/.ssh/id_dsa.pub ./master_dsa.pub
      cat master_dsa.pub >>authorized_keys
      在master上执行ssh slave12若,不输入密码直接登陆,配置即通过。
    3. 相同的步骤需要也在slave14和master11上重复一遍。

    机器环境确认无误后可以轻松的安装hadoop。

    五、hadoop1.2.1 安装与配置

    经过了以上步骤准备Hadoop1.2.1的环境搭建就相对容易多了。此处就仅需要解压缩安装并配置Hadoop,再验证是否正常便可大功告成。

    5.1 安装

    1. 重启master11,准备工作环境目录
      1
      2
      cd ~/
      mkdir env
    2. 解压Hadoop 1.2.1 tar
      1
      tar -zxvf hadoop-1.2.1.tar.gz -C ~/env/
    3. 建立软链接
      1
      ln -s hadoop-1.2.1/ hadoop
    4. 配置环境变量(vi ~/.bashrc
      1
      2
      export JAVA_HOME=/usr/java/jdk1.7.0_45
      source ~/.bashrc
    5. 同步.bashrc
      1
      2
      scp ~/.bashrc hadoop@slave12:~/
      scp ~/.bashrc hadoop@slave14:~/
    6. 创建数据文件存放路径。主要便于管理Hadoop的数据文件。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      cd /home/hadoop/env
      mkdir data
      mkdir data/tmp
      mkdir data/name
      mkdir data/data
      chmod 755 data/data/
      mkdir mapreduce
      mkdir mapreduce/system
      mkdir mapreduce/local
      效果如下
      ├── env
      │   ├── data
      │   │   ├── data
      │   │   ├── name
      │   │   └── tmp
      │   ├── hadoop -> hadoop-1.2.1/
      │   ├── hadoop-1.2.1
      │   │   ├── bin
      │   │   ├── build.xml
      │   └── mapreduce
      │       ├── local
      │       └── system

    5.2 配置

    1. 配置 conf/core-site.xml 指定hdfs协议下的存储和临时目录

      1
      2
      3
      4
      5
      6
      7
      8
      <property>
        <name>fs.default.name</name>
        <value>hdfs://master11:9000</value>
      </property>
      <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/${user.name}/env/data/tmp</value>
      </property>
    2. 配置 conf/hdfs-site.xml 配置关于hdfs相关的配置。这里将原有默认复制3个副本调整为2个。学习时可根据需求适当调整。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      <property>
       <name>dfs.name.dir</name>
       <value>/home/${user.name}/env/data/name</value>
      </property>
      <property>
       <name>dfs.data.dir</name>
       <value>/home/${user.name}/env/data/data</value>
      </property>
      <property>
       <name>dfs.replication</name>
        <value>2</value>
      </property>
      <property>
       <name>dfs.web.ugi</name>
       <value>hadoop,supergroup</value>
       <final>true</final>
       <description>The user account used by the web interface. Syntax: USERNAME,GROUP1,GROUP2, ……</description>
      </property>
    3. 配置 conf/mapred-site.xml

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      <property>
       <name>mapred.job.tracker</name>
       <value>master11:9001</value>
      </property>
      <property>
       <name>mapred.system.dir</name>
       <value>/home/${user.name}/env/mapreduce/system</value>
      </property>
      <property>
       <name>mapred.local.dir</name>
       <value>/home/${user.name}/env/mapreduce/local</value>
      </property>
    4. 配置masters

      1
      vi masters

      写为

      1
      master11
    5. 配置slaves

      1
      vi slaves

      写为

      1
      2
      slave12
      slave14
    6. 同步hadoop到子节点

      1
      2
      scp -r ~/env/ hadoop@slave12:~/
      scp -r ~/env/ hadoop@slave14:~/

             scp的命令比较方便,~/env/到~/其实是将整个env目录复制到slave的用户根目录下,而不是将env下的所有文件复制到用户根目录下,一开始我就因此产生了误解。

    5.3 启动hadoop

    1. 在主节点上格式化namenode

      1
      ./bin/hadoop namenode -format
    2. 在主节点上启动Hadoop

      1
      ./bin/start-all.sh

    5.4 检查运行状态

    1. 通过web查看Hadoop状态

      http://192.168.56.11:50030/jobtracker.jsp
      http://192.168.56.11:50070/dfshealth.jsp
      
    2. 验证Hadoop mapredurce 执行hadoop jar hadoop-xx-examples.jar 验证jobtracker和tasktracker

      1
      ./bin/hadoop jar hadoop-0.16.0-examples.jar wordcount input output

      可wordcount参考Hadoop集群(第6期)_WordCount运行详解

    六、常见错误

    • expected: rwxr-xr-x, while actual: rwxrwxr-x WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Invalid directory in dfs.data.dir: Incorrect permission for /home/hadoop/env/data/data, expected: rwxr-xr-x, while actual: rwxrwxr-x
      解决方案:chmod 755 /home/hadoop/env/data/data

    • 节点之间不能通信 java.io.IOException: File xxx/jobtracker.info could only be replicated to 0 nodes, instead of 1
      java.net.NoRouteToHostException: No route to host
      解决方案:关闭iptables,sudo /etc/init.d/iptables stop

    • got exception trying to get groups for user webuser

      org.apache.hadoop.util.Shell$ExitCodeException: id: webuser:无此用户
           at org.apache.hadoop.util.Shell.runCommand(Shell.java:255)
           at org.apache.hadoop.util.Shell.run(Shell.java:182)
      

      解决方案: 在hdfs-site.xml文件中添加

      1
      2
      3
      4
      5
      6
      7
      <property>
       <name>dfs.web.ugi</name>
       <value>hadoop,supergroup</value>
       <final>true</final>
       <description>The user account used by the web interface.Syntax: USERNAME,GROUP1,GROUP2, ……
       </description>
      </property>

      加上这个配置。可以解决了

      value  第一个为你自己搭建hadoop的用户名,第二个为用户所属组因为默认  
      

      web访问授权是webuser用户。访问的时候。我们一般用户名不是webuser所有要覆盖掉默认的webuser

  • 相关阅读:
    仅当使用了列的列表并且 IDENTITY_INSERT 为 ON 时,才能为表'SpeType'中的标识列指定显式值
    SQL Server 创建作业系列问题
    常用WebService收集
    SQL Server中调用WebService的实例
    本地时间与格林威治时间相互转换
    $route和$router的区别?
    超详细的Canal入门,看这篇就够了!
    linux 安装redis 完整步骤
    什么是JSON
    The expression 'list' evaluated to a null value
  • 原文地址:https://www.cnblogs.com/middlesummer/p/3780525.html
Copyright © 2011-2022 走看看