kangfoo's blog

工作学习笔记,生活掠影。

Hadoop1.x Wordcount分析

| 评论

hadoop mapreduce 过程粗略的分为:map, redurce(copy, sort, reduce)两个阶段。具体的工作机制还是挺复杂的,这里主要通过hadoop example jar中提供的wordcount来对hadoop mapredurce做个简单的理解。Wordcount程序输入文件类型,计算单词的频率。输出是文本文件:每行是单词和它出现的频率,用Tab键隔开。

Hadoop内置的计数器,

  1. 首先确保Hadoop集群正常运行,并了解mapredurce工作时涉及到的基本的文件备配。vi mapred-site.xml

    <configuration>
    <property>
    <name>mapred.job.tracker</name> <!--JobTracker的主机(或者IP)和端口。 -->
    <value>master11:9001</value>
    </property>
    <property>
    <name>mapred.system.dir</name> <!--Map/Reduce框架存储系统文件的HDFS路径。-->
    <value>/home/${user.name}/env/mapreduce/system</value>
    </property>
    <property>
    <name>mapred.local.dir</name> <!--Map/Reduce在本地文件系统下中间结果存放路径. -->
    <value>/home/${user.name}/env/mapreduce/local</value>
    </property>
    </configuration>
    
  2. 上传一个文件到hdfs文件系统

    $ ./bin/hadoop fs -mkdir /test/input
    $ ./bin/hadoop fs -put ./testDir/part0 /test/input
    $ ./bin/hadoop fs -lsr /
    ## part0 文件中的内容为:
    hadoop zookeeper hbase hive
    rest osgi http ftp
    hadoop zookeeper
    
  3. 执行workcount $ ./bin/hadoop jar hadoop-examples-1.2.1.jar wordcount /test/input /test/output
    日志如下

    14/01/19 18:23:25 INFO input.FileInputFormat: Total input paths to process : 1
    ## 使用 native-hadoop library
    14/01/19 18:23:25 INFO util.NativeCodeLoader: Loaded the native-hadoop library
    14/01/19 18:23:25 WARN snappy.LoadSnappy: Snappy native library not loaded
    14/01/19 18:23:25 INFO mapred.JobClient: Running job: job_201401181723_0005
    14/01/19 18:23:26 INFO mapred.JobClient:  map 0% reduce 0%
    14/01/19 18:23:32 INFO mapred.JobClient:  map 100% reduce 0%
    14/01/19 18:23:40 INFO mapred.JobClient:  map 100% reduce 33%
    14/01/19 18:23:42 INFO mapred.JobClient:  map 100% reduce 100%
    ## jobid job_201401181723_0005 (job_yyyyMMddHHmm_(顺序自然数,不足4位补0,已保证磁盘文件目录顺序))
    14/01/19 18:23:43 INFO mapred.JobClient: Job complete: job_201401181723_0005
    ## Counters 计数器
    14/01/19 18:23:43 INFO mapred.JobClient: Counters: 29
    ## Job Counters
    14/01/19 18:23:43 INFO mapred.JobClient:   Job Counters
    14/01/19 18:23:43 INFO mapred.JobClient:     Launched reduce tasks=1
    14/01/19 18:23:43 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=6925
    14/01/19 18:23:43 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
    14/01/19 18:23:43 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
    14/01/19 18:23:43 INFO mapred.JobClient:     Launched map tasks=1
    14/01/19 18:23:43 INFO mapred.JobClient:     Data-local map tasks=1
    14/01/19 18:23:43 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=9688
    ## File Output Format Counters
    14/01/19 18:23:43 INFO mapred.JobClient:   File Output Format Counters
    14/01/19 18:23:43 INFO mapred.JobClient:     Bytes Written=63
    ## FileSystemCounters
    14/01/19 18:23:43 INFO mapred.JobClient:   FileSystemCounters
    14/01/19 18:23:43 INFO mapred.JobClient:     FILE_BYTES_READ=101
    14/01/19 18:23:43 INFO mapred.JobClient:     HDFS_BYTES_READ=167
    14/01/19 18:23:43 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=112312
    14/01/19 18:23:43 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=63
    ## File Input Format Counters
    14/01/19 18:23:43 INFO mapred.JobClient:   File Input Format Counters
    14/01/19 18:23:43 INFO mapred.JobClient:     Bytes Read=65
    ## Map-Reduce Framework
    14/01/19 18:23:43 INFO mapred.JobClient:   Map-Reduce Framework
    14/01/19 18:23:43 INFO mapred.JobClient:     Map output materialized bytes=101
    14/01/19 18:23:43 INFO mapred.JobClient:     Map input records=3
    14/01/19 18:23:43 INFO mapred.JobClient:     Reduce shuffle bytes=101
    14/01/19 18:23:43 INFO mapred.JobClient:     Spilled Records=16
    14/01/19 18:23:43 INFO mapred.JobClient:     Map output bytes=104
    14/01/19 18:23:43 INFO mapred.JobClient:     Total committed heap usage (bytes)=176230400
    14/01/19 18:23:43 INFO mapred.JobClient:     CPU time spent (ms)=840
    14/01/19 18:23:43 INFO mapred.JobClient:     Combine input records=10
    14/01/19 18:23:43 INFO mapred.JobClient:     SPLIT_RAW_BYTES=102
    14/01/19 18:23:43 INFO mapred.JobClient:     Reduce input records=8
    14/01/19 18:23:43 INFO mapred.JobClient:     Reduce input groups=8
    14/01/19 18:23:43 INFO mapred.JobClient:     Combine output records=8
    14/01/19 18:23:43 INFO mapred.JobClient:     Physical memory (bytes) snapshot=251568128
    14/01/19 18:23:43 INFO mapred.JobClient:     Reduce output records=8
    14/01/19 18:23:43 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=1453596672
    14/01/19 18:23:43 INFO mapred.JobClient:     Map output records=10
    
  4. 运行之后的文件系统结构
    日志如下

    drwxr-xr-x   - hadoop supergroup          0 2014-01-19 18:23 /test
    drwxr-xr-x   - hadoop supergroup          0 2014-01-19 18:23 /test/input
    -rw-r--r--   2 hadoop supergroup         65 2014-01-19 18:23 /test/input/part0
    drwxr-xr-x   - hadoop supergroup          0 2014-01-19 18:23 /test/output
    -rw-r--r--   2 hadoop supergroup          0 2014-01-19 18:23 /test/output/_SUCCESS
    drwxr-xr-x   - hadoop supergroup          0 2014-01-19 18:23 /test/output/_logs
    drwxr-xr-x   - hadoop supergroup          0 2014-01-19 18:23 /test/output/_logs/history
    ## job 执行结果的数据文件
    -rw-r--r--   2 hadoop supergroup      13647 2014-01-19 18:23 /test/output/_logs/history/job_201401181723_0005_1390127005579_hadoop_word+count
    ## job 配置文件
    -rw-r--r--   2 hadoop supergroup      48374 2014-01-19 18:23 /test/output/_logs/history/job_201401181723_0005_conf.xml
    ## 只分了1个
    -rw-r--r--   2 hadoop supergroup         63 2014-01-19 18:23 /test/output/part-r-00000
    drwxr-xr-x   - hadoop supergroup          0 2013-12-22 14:02 /user
    drwxr-xr-x   - hadoop supergroup          0 2014-01-18 23:16 /user/hadoop
    
  5. 查看结果。$ ./bin/hadoop fs -cat /test/output/part-r-00000

    ftp     1
    hadoop  2
    hbase   1
    hive    1
    http    1
    osgi    1
    rest    1
    zookeeper       2
    
  6. 更详细的信息可web访问 http://master11:50030/jobtracker.jsp 进行查看.

Hadoop1.x 命令手册列举

| 评论

hadoop命令一般分为两类:

用户命令
archive, distcp, fs, fsck, jar, job, pipes, version, CLASSNAME

管理命令
balancer, daemonlog, datanode, dfsadmin, jobtracker, namenode, secondarynamenode, tasktracker

用户命令

  1. fs命令,可参见 file system shell

    ## 新建一个文件夹
    $ ./hadoop fs -mkdir /test
    ## 上传一个文件到hdfs
    $ ./hadoop fs -put ./rcc /test
    ## 查看文件
    $ ./hadoop fs -lsr /test
    ## 文件模式  备份个数   用户   用户组   字节大小 最后修改日期 和时间 文件或者目录的绝对路径
    ##-rw-r--r--   2   hadoop supergroup 2810   2014-01-18 19:20  /test/rcc
    ## 
    ## 从hdfs文件系统中复制一个文件到本地
    $ ./hadoop fs -copyToLocal /test/rcc rcc.copy
    ## md5对比
    $ md5sum rcc rcc.copy
    # b9d8a383bba2dd1b2ee0ede6c5cabeae  rcc
    # b9d8a383bba2dd1b2ee0ede6c5cabeae  rcc.copy
    ##
    ## 删除
    $ ./hadoop fs -rmr /test
    
  2. fsck命令。 可以参考文件系统的健康状态;查看一个文件所在的数据块;可以删除一个坏块;可以查找一个缺失的块。 可参见fsck

    ## 新建一个文件夹
    $ ./hadoop fsck /
    
  3. archive命令。 创建一个hadoop档案文件。语法:archive -archiveName NAME -p <parent path> <src>* <dest> 可参考hadoop_archives

    ## 创建一个归档文件
    $ ./hadoop archive -archiveName archive.har -p  /test rcc
    ## 查看归档文件列表
    $ ./hadoop dfs -lsr har:///user/hadoop/rcc/archive.har
    ## 查看归档文件
    $ ./hadoop dfs -cat har:///user/hadoop/rcc/archive.har/rcc
    
  4. distcp 并行复制。可以从 Hadoop 文件系统中复制大量数据,也可以将大量数据复制到HDFS文件系统中。它其实是个没有reducer的MapReduce作业。

    $ hadoop distcp hadfs://datanode1/test1 hdfs://datanode2/
    ## 跨 RPC 版本可使用 http 方式进行复制
    $ hadoop distcp http://datanode1:50070/test1 hdfs://datanode2/
    

    管理命令

  5. dfsadmin

    ## 报告文件系统的基本信息和统计信息
    $ ./hadoop dfsadmin -report
    ## 安全模式维护命令
    $ ./hadoop dfsadmin -safemode enter
    ## -safemode enter | leave | get | wait
    ## 不接受对名字空间的更改(只读), 不复制或删除块
    ## -setQuota 为每个目录 <dirname>设定配额<quota>。包括文件夹和文件名称。
    $ ./hadoop dfsadmin -setQuota 2 /test
    $ ./hadoop fs -put ./rcc /test
    $ ./hadoop fs -put ./hadoop /test
    put: org.apache.hadoop.hdfs.protocol.NSQuotaExceededException: The NameSpace quota (directories and files) of directory /test is exceeded: quota=2 file count=3
    
  6. balancer命令。集群平衡工具

    ##
    $ ./hadoop balancer
    或者
    $ ./bin/./start-balancer.sh
    
其他未列举的命令可以参见官方文档。

官方文档链接: hadoop1.2.1 Commands Guide, hadoop1.0.4 命令手册

编译hadoop 2.x Hadoop-eclipse-plugin插件

| 评论

经过hadoop1.x的发展,编译hadoop2.x版本的eclipse插件视乎比之前要轻松的多。如果你不在意编译过程中提示的警告,那么根据how to build - hadoop2x-eclipse-plugin文档就可一步到位。若想自己设置部分变量,可参考编译hadoop 1.2.1 Hadoop-eclipse-plugin插件。当然有问题及时和开发社区联系你会收到意想不到的收获.

issuce站点.

主要步骤

  • 介质准备
  • 执行
  • 安装验证

具体操作

  1. 设置语言环境

    $ export LC_ALL=en
    
  2. 检查ANT_HOME,JAVA_HOME

  3. 下载hadoop2x-eclipse-plugin
    目前hadoop2的eclipse-plugins源代码由github脱管,下载地址how to build - hadoop2x-eclipse-plugin 右侧的 “Download ZIP” 或者 克隆到桌面. 当然你也可以fork到你自己的帐户下,在使用git clone。

  4. 执行

    $ cd src/contrib/eclipse-plugin
    $ ant jar -Dversion=2.2.0 -Declipse.home=/opt/eclipse -Dhadoop.home=/usr/share/hadoop
    

    将上述java system property eclipse.home 和 hadoop.home 设置成你自己的环境路径。 执行上述命令可能很快或者很慢。请耐心等待。主要慢的target:ivy-download,ivy-resolve-common。最后jar生成在 $root/build/contrib/eclipse-plugin/hadoop-eclipse-plugin-2.2.0.jar路径下。

  5. 安装验证
    将生成好的jar,复制到${eclipse.home}/plugins目录下。启动eclipse,新建Map/Reduce Project,配置hadoop location.验证插件完全分布式的插件配置截图和core-site.xml端口配置。

  6. 效果图
    使用插件访问本地的伪分布式hadoop环境。查看文件texst1.txt和test2.txt同使用命令 hadoop dfs -ls /in 效果相同。 image

  7. 已编译的插件 hadoop-eclipse-plugin-2.2.0.jar

  8. 备注
    目前我在使用这个版本的插件时发现还时挺不稳定的。发现了两个缺陷。我的环境为:Java HotSpot™ 64-Bit Server VM、 eclipse-standard-kepler-SR1-macosx-cocoa、 hadoop2.2.0。

缺陷:

  • Editor could not be initalized.
  • NullPointException

截图如下: image

在oracle Virtual Box 虚拟机中搭建hadoop1.2.1完全分布式环境

| 评论

一、初衷

对于学习 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节点服务器slave12\slave14。

4.1 安装虚拟机

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

4.2 在虚拟机里安装centos6.4

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

具体可参见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.1
    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
    
    截图:image

  3. 配置网卡1。选中你刚新建的虚拟机,右键设置->网络->网卡1->点击启动网络连接(E)

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

  4. 配置网卡2。点击网卡2->点击启动网络连接(E)

    连接方式(A):网络地址装换(NAT)
    界面名称(N):
    高级(d)
    控制芯片(T):xxx
    混杂模式(P):拒绝
    MAC地址(M):系统随机即可
    接入网线(C):选中
    

  5. 配置网络。启动操作系统,使用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

4.5 建立hadoop用户组和用户

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

groupadd hadoop
useradd hadoop -g hadoop
passwd hadoop

4.6 配置sudo权限

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

rpm -qa|grep sudo

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

visudo -f /etc/sudoers

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

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

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

同步时间

sudo ntpdate us.pool.ntp.org

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

4.11 配置ssh

  1. 单机ssh配置并回环测试
    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上执行
    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,准备工作环境目录
    cd ~/
    mkdir env
    
  2. 解压Hadoop 1.2.1 tar
    tar -zxvf hadoop-1.2.1.tar.gz -C ~/env/
    
  3. 建立软链接
    ln -s hadoop-1.2.1/ hadoop
    
  4. 配置环境变量(vi ~/.bashrc
    export JAVA_HOME=/usr/java/jdk1.7.0_45
    source ~/.bashrc
    
  5. 同步.bashrc
    scp ~/.bashrc hadoop@slave12:~/
    scp ~/.bashrc hadoop@slave14:~/
    
  6. 创建数据文件存放路径。主要便于管理Hadoop的数据文件。
    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协议下的存储和临时目录

    <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个。学习时可根据需求适当调整。

    <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

    <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

    vi masters
    

    写为

    master11
    
  5. 配置slaves

    vi slaves
    

    写为

    slave12
    slave14
    
  6. 同步hadoop到子节点

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

5.3 启动hadoop

  1. 在主节点上格式化namenode

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

    ./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

    ./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文件中添加

    <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

七、附录

编译hadoop 1.2.1 Hadoop-eclipse-plugin插件

| 评论

编译hadoop1.x.x版本的eclipse插件为何如此繁琐?

个人理解,ant的初衷是打造一个本地化工具,而编译hadoop插件的资源间的依赖超出了这一目标。导致我们在使用ant编译的时候需要手工去修改配置。那么自然少不了设置环境变量、设置classpath、添加依赖、设置主函数、javac、jar清单文件编写、验证、部署等步骤。

那么我们开始动手

主要步骤如下

  • 设置环境变量
  • 设置ant初始参数
  • 调整java编译参数
  • 设置java classpath
  • 添加依赖
  • 修改META-INF文件
  • 编译打包、部署、验证

具体操作

  1. 设置语言环境

    $ export LC_ALL=en
    
  2. 设置ant初始参数
    修改build-contrib.xml文件

    $ cd /hadoop-1.2.1/src/contrib
    $ vi build-contrib.xml
    

    编辑并修改hadoop.root值为实际hadoop解压的根目录

    <property name="hadoop.root" location="/Users/kangfoo-mac/study/hadoop-1.2.1"/>
    

    添加eclipse依赖

    <property name="eclipse.home" location="/Users/kangfoo-mac/work/soft/eclipse-standard-kepler-SR1-macosx-cocoa" />
    

    设置版本号

    <property name="version" value="1.2.1"/>
    
  3. 调整java编译设置
    启用javac.deprecation

    $ cd /hadoop-1.2.1/src/contrib
    $ vi build-contrib.xml
    


    <property name="javac.deprecation" value="off"/>
    

    改为

    <property name="javac.deprecation" value="on"/>
    
  4. ant 1.8+ 版本需要额外的设置javac includeantruntime=“on” 参数

    <!-- ====================================================== -->
    <!-- Compile a Hadoop contrib's files                       -->
    <!-- ====================================================== -->
    <target name="compile" depends="init, ivy-retrieve-common" unless="skip.contrib">
    <echo message="contrib: ${name}"/>
    <javac
     encoding="${build.encoding}"
     srcdir="${src.dir}"
     includes="**/*.java"
     destdir="${build.classes}"
     debug="${javac.debug}"
     deprecation="${javac.deprecation}"
     includeantruntime="on">
     <classpath refid="contrib-classpath"/>
    </javac>
    </target> 
    
  5. 修改编译hadoop插件 classpath

    $ cd hadoop-1.2.1/src/contrib/eclipse-plugin
    $ vi build.xml
    

    添加 文件路径 hadoop-jars

    <path id="hadoop-jars">
      <fileset dir="${hadoop.root}/">
        <include name="hadoop-*.jar"/>
      </fileset>
    </path>
    

    将hadoop-jars 添加到classpath

    <path id="classpath">
      <pathelement location="${build.classes}"/>
      <pathelement location="${hadoop.root}/build/classes"/>
      <path refid="eclipse-sdk-jars"/>
      <path refid="hadoop-jars"/>
    </path> 
    
  6. 修改或添加额外的jar依赖
    因为我们根本都没有直接编译过hadoop,所以就直接使用${HADOOP_HOME}/lib下的资源.需要注意,这里将依赖jar的版本后缀去掉了。
    同样还是在hadoop-1.2.1/src/contrib/eclipse-plugin/build.xml文件中修改或添加

    $ cd hadoop-1.2.1/src/contrib/eclipse-plugin
    $ vi build.xml
    

    找到 <!-- Override jar target to specify manifest --> 修改target name为 jar 中的 copy file 的路径,具体如下:

    <copy file="${hadoop.root}/hadoop-core-${version}.jar" tofile="${build.dir}/lib/hadoop-core.jar" verbose="true"/>
    <copy file="${hadoop.root}/lib/commons-cli-${commons-cli.version}.jar"  tofile="${build.dir}/lib/commons-cli.jar" verbose="true"/>
    <copy file="${hadoop.root}/lib/commons-configuration-1.6.jar"  tofile="${build.dir}/lib/commons-configuration.jar" verbose="true"/>
    <copy file="${hadoop.root}/lib/commons-httpclient-3.0.1.jar"  tofile="${build.dir}/lib/commons-httpclient.jar" verbose="true"/>
    <copy file="${hadoop.root}/lib/commons-lang-2.4.jar"  tofile="${build.dir}/lib/commons-lang.jar" verbose="true"/>
    <copy file="${hadoop.root}/lib/jackson-core-asl-1.8.8.jar"  tofile="${build.dir}/lib/jackson-core-asl.jar" verbose="true"/>
    <copy file="${hadoop.root}/lib/jackson-mapper-asl-1.8.8.jar"  tofile="${build.dir}/lib/jackson-mapper-asl.jar" verbose="true"/>
    
  7. 修改 jar 清单文件

    cd ./hadoop-1.2.1/src/contrib/eclipse-plugin/META-INF
    vi MANIFEST.MF
    

    找到这个文件的Bundle-ClassPath这一行,然后,修改成

    Bundle-ClassPath: classes/,lib/commons-cli.jar,lib/commons-httpclient.jar,lib/hadoop-core.jar,lib/jackson-mapper-asl.jar,lib/commons-configuration.jar,lib/commons-lang.jar,lib/jackson-core-asl.jar
    

    请保证上述字符占用一行,或者满足osgi bundle 配置文件的换行标准语法也行的。省事就直接写成一行,搞定。

  8. 新建直接打包并部署jar到eclipse/plugin目录的target

    cd hadoop-1.2.1/src/contrib/eclipse-plugin
    vi build.xml
    

    添加target直接将编译的插件拷贝到eclipse插件目录

    <target name="deploy" depends="jar" unless="skip.contrib"> 
    <copy file="${build.dir}/hadoop-${name}-${version}.jar" todir="${eclipse.home}/plugins" verbose="true"/> </target>
    

    将ant默认target default=“java"改为default=“deploy”

    <project default="deploy" name="eclipse-plugin">
    
  9. 编译并启动eclipse验证插件

    ant -f ./hadoop-1.2.1/src/contrib/eclipse-plugin/build.xml
    

    启动eclipse,新建Map/Reduce Project,配置hadoop location.验证插件完全分布式的插件配置截图和core-site.xml端口配置

  10. 效果图 image

相关源文件

在此非常感谢kinuxroot这位博主的的博文参考。