首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hadoop2.7第一个python实例

hadoop2.7第一个python实例

作者头像
py3study
发布2020-01-13 12:16:11
5660
发布2020-01-13 12:16:11
举报
文章被收录于专栏:python3python3

没有任何基础,第一次跑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来实现,例子通过读取文本文件来统计出单词的出现次数。结果也以文本形式输出,每一行包含一个单词和单词出现的次数,两者中间使用制表符来想间隔。

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

一、下载文本文件

   从以上三个网址中复制三本书出来,粘贴到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/目录中,再次执行,成功!

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

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

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

检查结果是否输出并存储在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插入的。

  操作完毕!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、下载文本文件
  • 二、windows文件转linux文件
  • 三、编写python文件
  • 四、测试代码
  • 五、复制文本数据到HDFS
  • 六、执行MapReduce job
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档