首先最最重要的写在最前面,也是我觉得个人踩得最深的坑,刚接触hadoop的人,缺少的认识:
hdfs的理解:它是一个文件系统,跟linux的文件系统是类似的结构,拥有类似的语法,大概就是你在linux上ls查看文件列表,那么hdfs的无非就是hadoop fs -ls。hadoop的输入输出,都是从hdfs读取和写入的,那么比如运行hadoop的word count例子的时候,网上各种大坑教程中完全都没有提到要先自己准备几个input文件,文本文档随便打几个字就好,并且把文件上传到hdfs系统中:这么做的原因在理解了hdfs后很显然了--hadoop的输入输出都在hdfs中,而且例子里的命令指定的目录,指定的也是hdfs中的文件夹路径。所以网上各种治标不治本的exception。explanation再回过头来看,完全就是在给新人挖坑!(不过可能别人写的时候都以为你知道,但是只有我知道我不知道而且你也不知道,话说还在运行hadoop自带例子的人能对hadoop有多么深刻的理解呢,佩服大神们的逻辑)
辣么,让我们从头来一遍:(我个人有把${hadoop_install}/bin加入path,所以我直接可以输入hadoop命令,建议大家都可以这么做。)
1.首先你得安装并运行起来hadoop,我不管你是集群还是单机,运行命令:ps -ef|grep hadoop查询是否有hadoop进程,如果你看到的是如下这一坨,那么你的hadoop就是在运行了。注意,我是本机运行的例子,所以如果你确定你是连别人的服务,那么请无视就好。
2.准备两个文件,比如text1.txt和text2.txt 里面各写上一句话,随便什么都好,反正就是拿来统计的。然后使用类似如下的命令来上传到hdfs文件系统中:hdfs dfs mkdir /input; hadoop fs -put *.txt /input ---你得先在hdfs中建立你的文件夹才能把文件往里放不是,还是那句话,它是个文件系统。
3.执行示例程序命令
hadoop jar hadoop/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce- examples-2.7.3.jar wordcount /input /output
这里output文件夹不需要在hdfs中提前建好,而且不能提前建,否则会报output folder already exists:比如你运行了一次又想再运行一次的时候就会报这个错,很明显,就是它需要一个空的目录来存放执行结果。如果执行了想再执行一次,就用hadoop fs -rmr /output删掉这个文件夹再执行就好。命令里的我写的相对路径,各位改成自己对应的路径就好。
贴个图证明我执行成功了:
4.查看结果:hadoop fs -cat /output/part-r-00000