社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Hadoop实践之Python(一)

羽恒 • 6 年前 • 291 次点击  

关于hadoop,建议大家在自己的linux上面跟着网上的教程搭建一次单节点和多节点的hadoop平台,亦可参考Hadoop安装教程_单机/伪分布式配置。关于mapreduce,我是新手,只能从“分而治之”的角度来考虑,首先“map”也就是”分”——数据分割,然后“reduce”对"map"处理后的结果进一步的运算,这里给出的例子是一般的hadoop入门程序“WordCount”,就是首先写一个map程序用来将输入的字符串分割成单个的单词,然后reduce这些单个的单词,相同的单词就对其进行计数,不同的单词分别输出,结果输出每一个单词出现的频数。

注意:关于数据的输入输出是通过sys.stdin(系统标准输入)和sys.stdout(系统标准输出)来控制数据的读入与输出。所有的脚本执行之前都需要修改权限,否则没有执行权限,例如下面的脚本创建之前使用“chmod +x mapper.py”

mapper.py

#!/usr/bin/env python
# ($HADOOP_HOME/mapper.py)
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
# ($HADOOP_HOME/reducer.py)
from operator import itemgetter
import sys

current_word = None  # 为当前单词
current_count = 0  # 当前单词频数
word = None

for line in sys.stdin:
    words = line.strip()  # 去除字符串首尾的空白字符
    word, count = words.split('\t')  # 按照制表符分隔单词和数量
    
    try:
        count = int(count)  # 将字符串类型的‘1’转换为整型1
    except ValueError:
        continue

    if current_word == word:  # 如果当前的单词等于读入的单词
        current_count += count  # 单词频数加1
    else:
        if current_word:  # 如果当前的单词不为空则打印其单词和频数
            print '%s\t%s' %(current_word, current_count)  
        current_count = count  # 否则将读入的单词赋值给当前单词,且更新频数
        current_word = word

if current_word == word:
    print '%s\t%s' %(current_word, current_count)

查看输出结果

  cd $HADOOP_HOME
  echo "foo foo quux labs foo bar zoo zoo hying" | ./mapper.py | sort -k 1,1 | ./reducer.py
  # echo是将后面“foo ****”字符串输出,并利用管道符“|”将输出数据作为mapper.py这个脚本的输入数据,并将mapper.py的数据输入到reducer.py中,其中参数sort -k 1,1是将reducer的输出内容按照第一列的第一个字母的ASCII码值进行升序排序

下面看一些脚本的输出结果:

让Python代码在hadoop上跑起来!

一、准备输入数据

  • 接下来,先下载三本书:

     mkdir -p tmp/gutenberg
     cd tmp/gutenberg
     wget http://www.gutenberg.org/ebooks/20417.txt.utf-8
     wget http://www.gutenberg.org/files/5000/5000-8.txt
     wget http://www.gutenberg.org/ebooks/4300.txt.utf-8
    
  • 然后把这三本书上传到hdfs文件系统上:

    hdfs dfs -mkdir ./input # 在hdfs上的该用户目录下创建一个输入文件的文件夹
    hdfs dfs -put ./tmp/gutenberg/*.txt ./input # 上传文档到hdfs上的输入文件夹中
    
  • 寻找你的streaming的jar文件存放地址,注意2.6的版本放到share目录下了,可以进入hadoop安装目录寻找该文件:

    cd $HADOOP_HOME
    find ./ -name "*streaming*"
    
  • 由于这个文件的路径比较长,因此我们可以将它写入到环境变量:

    vi ~/.bashrc  # 打开环境变量配置文件
    # 在里面写入streaming路径
    export STREAM=$HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar
    source ~/.bashrc 
    
  • 通过streaming接口运行脚本

    hadoop jar $STREAM  -files ./mapper.py,./reducer.py -mapper ./mapper.py -reducer ./reducer.py -input ./input/gutenberg*.txt -output ./output
    
    • 就会complete啦,你就可以通过如下方式查看计数结果


再次,感谢以下文档的支持:
让python在hadoop上跑起来
streaming介绍


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/CjUgt9X1Nj
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/23976
 
291 次点击