首页 > 技术文章 > Hadoop 测试例子运行详解

fuxulook 2014-03-06 15:25 原文

一、软件环境

Hadoop搭建系统环境:三台完全一样的Centos6.5_64位系统,其中一个做Namenode和Datanode,另外两个做Datanode。

Hadoop安装目标版本:Hadoop2.2.0

二、运行步骤

2.1 新建输入文件内容

在当前目录新建一个文件夹叫input,在文件夹里新建三个文件f1.txt,f2.txt,f3.txt,并分别写入一些内容。

mkdir -p input/{1..3}.txt     递归创建目录和文件
echo "hello hadoop" > input/f1.txt'
echo "hello java" > input/f2.txt'
echo "hello world" > input/f3.txt'

2.2 在运行的hadoop中创建文件夹

注意在操作之前,一定要保证这个时候hadoop已经正常运行,datanode、jodtracker、namenode等必要信息均显示正常。

使用如下的命令创建文件夹

hadoop fs -mkdir -p /home/hadoop/input
/*注意相对路径,这里的/home/hadoop是我当前用户的目录,可根据自己具体情况进行改动 没有-p参数会无法创建成功*/

然后查看我们在hadoop中是否已经成功创建了该文件夹:

[hadoop@master bin]$ hadoop fs -ls /home/hadoop/
Found 2 items
drwxr-xr-x   - hadoop supergroup  0 2014-03-05 19:00 /home/hadoop/input

如果我们能看到如上的字样表明我们这一步已经成功了。

2.3 把文件复制到hadoop中的文件系统中(Hdfs)

[hadoop@master ~]$ hadoop fs -put input/*  /home/hadoop/input/

把(本地目录)/home/hadoop/input/*下的所以文件复制到HDFS中的input目录下

然后查看文件是否在hadoop中,并查看文件内容是否和输入的一致:

hadoop fs -ls /home/hadoop/input
hadoop fs -cat /home/hadoop/input/f1.txt

注:我们可以 通过节点IP或节点主机名:50070/dfshealth.jsp来从浏览器中查看整个hdfs文件系统的目录,打开namenode的链接,点击其中的Browse the filesystem超级链接,就可以看到相应的目录结构了。

2.4 运行example例子

我们要运行的例子在hadoop的安装目录下,名称叫做hadoop-mapreduce-examples-2.2.0.jar。到了这一步,无疑是出错率最高的时候,运行命令如下:

[hadoop@master bin]$ yarn jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount  /home/hadoop/dfs/input/ /home/hadoop/dfs/output/  

其中,output是输出文件夹,必须不存在,它由程序自动创建,如果预先存在output文件夹,则会报错。

在操作之前,请务必多次检查如下内容:

  1. 自己的input目录是否已经存入输入内容;
  2. output文件夹是否存在;
  3. 运行的hadoop用jps查看一下是否所有应该运行的进程都存在;
  4. 如果之前开过hadoop运行,这不是第一次开的话。可以试试先./stop-all.sh,然后把core-site.xml中的hadoop.tmp.dir的value所在路径,即/home/hadoop/tmp/hadoop_tmp删除,然后重新建立一遍,如果你是新建的hadoop用户,最好用chown指令再把文件的所属更改一下。如上一样的操作对hdfs-site.xml中的dfs.data.dir的value路径做一遍。最好对所有datanode和namenode也做一遍,保险起见。因为,我就是这些小细节上出了问题,由于之前运行导致这些本应该空的文件夹中存在文件,而频繁报错。
  5. 如果之前运行过wordcount报错记住还要用命令hadoop dfs -rmr output/*output为你的输出文件夹路径*/把output文件夹删除。报错内容如下:

 

2.5 查看运行结果

我们可以查看output文件夹的内容来检查程序是否成功创建文件夹,通过查看output文件里面的part-r-00000文件的内容来检查程序执行结果:

hadoop fs -cat /home/hadoop/output/part-r-00000

正常显示结果会像如下样式一样:

hadoop 1
hello 3
jave 1
world 1

我们可以看到hadoop出现一次,hello出现3次,java出现一次,world出现一次,这跟预期是一样的,说明执行成功。

 

 

错误笔记

1. 启动时发现莫名其妙的datanode没有启动。

从logs日志中看到Incompatible namespaceIDs in /home/hadoop/tmp/hadoop_tmp,想起来这个文件夹是自己新建的,是不是伪分布式时在里面产生了垃圾?于是rm -rf然后mkdir重来了一次,想想不安全我再把其他的之前新建的文件夹全部重新按照这个方法操作了一次;最后-format然后./start-all.sh,搞定啦。Datanode、SecondaryNameNode、Jps、ResourceManager、NameNode全部启动。

2. 其他N多错误

我在运行中也出现过其他很多方面的错误,最有效且最快找到出错的方法就是查看log文件了,哪个地方没有正常开启,就去对应进程的.log文件查看。比较烦人的是.log文件内容是按照日期递增顺序进行写入内容的,意思就是你每次要查看最新的运行信息必须要往下翻翻翻。

 

推荐阅读