hadoop2.7第一个python实例(超详细)

没有任何基础,第一次跑hadoop实例,遇到不少问题,记录下来以便自查和帮助同样情况的hadoop学习者。

参考博客:https://www.cnblogs.com/end/archive/2012/08/13/2636175.html

集群组成:VMwawre14.1+CentOS6.5+hadoop2.7,  3个虚拟机节点,分别为master、slave1,slave2

hadoop安装目录:/opt/hadoop

例子:模仿 WordCount 并使用Python来实现,例子通过读取文本文件来统计出单词的出现次数。结果也以文本形式输出,每一行包含一个单词和单词出现的次数,两者中间使用制表符来想间隔。

本文章主要讲跑通例子的操作,原理看上面的参考博客。

一、下载文本文件

  • The Outline of Science, Vol. 1 (of 4) by J. Arthur Thomson
  • The Notebooks of Leonardo Da Vinci
  • Ulysses by James Joyce

   从以上三个网址中复制三本书出来,粘贴到windows上新建的txt中,另存为Science.txt、Notebooks.txt、Ulysses.txt,记得在另存为的窗口中,右下角选择utf-8编码,最后将此三本书复制到集群中的master虚拟机中,临时保存目录为:/tmp/gutenberg

   [CAI@master ~]$ ls -l /tmp/gutenberg
   total 3524
   -rwxrw-rw- 1 CAI CAI 1396148 Sep 16 11:42 Notebooks.txt
   -rwxrw-rw- 1 CAI CAI  661810 Sep 16 11:42 Science.txt
   -rwxrw-rw- 1 CAI CAI 1548179 Sep 16 11:42 Ulysses.txt

二、windows文件转linux文件

       从windows中直接拷贝文件到linux,由于两个系统的换行符表示不一样,所以会有识别问题。比如从windows中编写一个demo.py文件,虽然加了在文件首行输入#!/usr/bin/env python,以便在linux上跑,但是执行时会出现No such file or directory,其实是找不到python命令文件,原因是:

windows文件格式是DOS,而非UNIX格式。Windows格式下,换行符是CRLT,使得demo.py第一行变成了#!/usr/bin/env python\015(CR的ascaii 15)

使用Linux VIM检查文件格式:":set ff 或者:set fileformate"

使用Linux VIM转换文件格式:“:set ff=unix或者:set fileformate=unix”

使用Windows UltraEdit做文件格式转换:“file->Conversions->DOS->UNIX”

也就是说从windows中拷贝到linux的文件,用vim打开该文件,在命令行模式下面输入‘:set ff’则可以查看到格式为dos, 用命令“:set ff=unix”就可以改为unix。 

用以上方法将Science.txt、Notebooks.txt、Ulysses.txt三本书的格式改为unix。以后拷贝进来的windows文件都可进行此操作。

三、编写python文件

由于不太熟悉linux的vim编辑,所以在windows上编写mapper.py、reducer.py可执行文件.

mapper.py:

#!/usr/bin/env python
import sys
for line in sys.stdin:
    line = line.strip()
    words = line.split()
    for word in words:
        print '%s\\t%s' % (word, 1)

reducer.py: 

#!/usr/bin/env python
from operator import itemgetter
import sys
word2count = {}
for line in sys.stdin:
    line = line.strip()
    word, count = line.split('\\t', 1)
    try:
        count = int(count)
        word2count[word] = word2count.get(word, 0) + count
    except ValueError:
        pass
sorted_word2count = sorted(word2count.items(), key=itemgetter(0))
for word, count in sorted_word2count:
    print '%s\\t%s'% (word, count)

将此两个文件复制黏贴到集群master虚拟机上,目录为/home/CAI/Downloads/

对此两文件进行上面的第二步操作,将windows文件转为linux文件

给以上两个文件赋予可执行权限:

chmod +x /home/CAI/Downloads/mapper.py

chmod +x /home/CAI/Downloads/reducer.py

四、测试代码

在运行MapReduce job测试前尝试手工测试mapper.py 和 reducer.py脚本,以免得不到任何返回结果

[CAI@master ~]$ echo "foo foo quux labs foo bar quux" | /home/CAI/Downloads/mapper.py
foo    1
foo    1
quux    1
labs    1
foo    1
bar    1
quux    1
[CAI@master ~]$ echo "foo foo quux labs foo bar quux" | /home/CAI/Downloads/mapper.py | /home/CAI/Downloads/reducer.py
bar    1
foo    3
labs    1
quux    2

五、复制文本数据到HDFS

1、首先创建hdfs目录,可以在master虚拟机上任何地方。注意创建目录和查看目录都需要用hadoop自有的命令,而非linux的      命令;另外在执行/opt/hadoop/bin/hadoop fs -mkdir /new_dir创建new_dir目录时出错了。从报错中发现是版本的原因,2.x以前的版本这个命令,2.x之后的版本命令改成了:/opt/hadoop/bin/hdfs dfs -mkdir -p   /new_dir。

     本人创建hdfs目录的命令如下:

      [CAI@master ~]$ /opt/hadoop/bin/hdfs dfs -mkdir -p /usr/hadoop

    注意:[CAI@master hadoop]$ /opt/hadoop/bin/hdfs dfs -rm -r -f /usr/hadoop   可以删除目录

     查看刚刚创建的目录,此处用ls /usr是查看不到hadoop目录的,必须要用hadoop自己的命令查看:

     [CAI@master ~]$ /opt/hadoop/bin/hdfs dfs -ls /usr/hadoop
    18/09/16 15:00:34 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java      classes where applicable
     Found 1 items
     drwxr-xr-x   - CAI supergroup          0 2018-09-16 14:58 /usr/hadoop

     查询结果如上蓝色字体部分,上面红色字体部分为警告,解决上述警告的参考博客为:

     https://blog.csdn.net/jack85986370/article/details/51902871 

     注意解决上述警告问题需要在所有节点都操作一遍,别只给master纠正,slave1和slave2也要纠正(集群配置更改要时刻记得        所有节点)。

 

2、将含三本书的/tmp/gutenberg目录复制到刚刚创建的hdfs目录中:

     [CAI@master ~]$ /opt/hadoop/bin/hdfs dfs -copyFromLocal /tmp/gutenberg /usr/hadoop/gutenberg

     查看复制效果:

     [CAI@master ~]$ /opt/hadoop/bin/hdfs dfs -ls /usr/hadoop/gutenberg
     Found 3 items
     -rw-r--r--   2 CAI supergroup    1396148 2018-09-16 15:07 /usr/hadoop/gutenberg/Notebooks.txt
     -rw-r--r--   2 CAI supergroup     661810 2018-09-16 15:07 /usr/hadoop/gutenberg/Science.txt
     -rw-r--r--   2 CAI supergroup    1548179 2018-09-16 15:07 /usr/hadoop/gutenberg/Ulysses.txt

 

六、执行MapReduce job

1、在hadoop安装目录下(省的写绝对路径),执行命令:  

  注意:以上命令中最后的输出目录gutenberg-output不能已存在(上一次执行若出错,这个文件夹就会已存在),若存在了会报错,得先删除该存在的目录:[CAI@master hadoop]$ ./bin/hdfs dfs -rm -r -f /usr/hadoop/gutenberg-output

即便没碰到上面问题,还是有错误,可看到其中一条日志如下:

java.io.IOException: Cannot run program "/home/CAI/Downloads/mapper.py": error=2, No such file or directory

因为mapper.py经过第四大步测试,是可以成功执行的,经过命令java --version可以看到正常输出java版本,暂时没考虑java问题。后来再度看上面的错误,是找不到文件mapper.py,突然想到经过上面第三大步骤,虽然master上有文件mapper.py和reducer.py,但是两个数据节点却没有,于是将此两文件拷贝到两数据节点的/home/CAI/Downloads/目录中,再次执行,成功!

记住:可执行文件一定要拷贝到所有节点上去!

执行过程中的部分日志如下图所示:

 hadoop2.7第一个python实例(超详细)_第1张图片

在master节点,打开火狐浏览器,登录http://192.168.137.130:8088/,可以看到如下图:

hadoop2.7第一个python实例(超详细)_第2张图片

检查结果是否输出并存储在HDFS目录下的gutenberg-output中:
[CAI@master hadoop]$ ./bin/hdfs dfs -ls /usr/hadoop/gutenberg-output
Found 2 items
-rw-r--r--   2 CAI supergroup          0 2018-09-16 17:02 /usr/hadoop/gutenberg-output/_SUCCESS
-rw-r--r--   2 CAI supergroup     878875 2018-09-16 17:02 /usr/hadoop/gutenberg-output/part-00000

查看输出结果的前15行:
[CAI@master hadoop]$ ./bin/hdfs dfs -cat /usr/hadoop/gutenberg-output/part-00000 | head -15
"(Lo)cra"    1
"1490    1
"1498,"    1
"35"    1
"40,"    1
"A    2
"AS-IS".    1
"A_    1
"Absoluti    1
"Aesopi"    1
"Alack!    1
"Alack!"    1
"Alla    1
"Allegorical    1
"Alpha    1
注意输出,上面结果的(")符号不是Hadoop插入的。

  操作完毕!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Hadoop)