用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试


原文地址:http://www.cnblogs.com/joyeecheung/p/3757915.html

相关随笔:  点击打开链接

  • Hadoop-1.0.4集群搭建笔记
  • 用python + hadoop streaming 编写分布式程序(二) -- 在集群上运行与监控
  • 用python + hadoop streaming 编写分布式程序(三) -- 自定义功能

MapReduce与HDFS简介

什么是Hadoop?

Google为自己的业务需要提出了编程模型MapReduce和分布式文件系统Google File System,并发布了相关论文(可在Google Research的网站上获得: GFS 、 MapReduce)。 Doug Cutting和Mike Cafarella在开发搜索引擎Nutch时对这两篇论文做了自己的实现,即同名的MapReduce和HDFS,合起来就是Hadoop。

MapReduce的Data flow如下图,原始数据经过mapper处理,再进行partition和sort,到达reducer,输出最后结果。

图片来自Hadoop: The Definitive Guide

Hadoop Streaming原理

Hadoop本身是用Java开发的,程序也需要用Java编写,但是通过Hadoop Streaming,我们可以使用任意语言来编写程序,让Hadoop运行。

Hadoop Streaming的相关源代码可以在Hadoop的Github repo 查看。简单来说,就是通过将用其他语言编写的mapper和reducer通过参数传给一个事先写好的Java程序(Hadoop自带的*-streaming.jar),这个Java程序会负责创建MR作业,另开一个进程来运行mapper,将得到的输入通过stdin传给它,再将mapper处理后输出到stdout的数据交给Hadoop,partition和sort之后,再另开进程运行reducer,同样地通过stdin/stdout得到最终结果。因此,我们只需要在其他语言编写的程序里,通过stdin接收数据,再将处理过的数据输出到stdout,Hadoop streaming就能通过这个Java的wrapper帮我们解决中间繁琐的步骤,运行分布式程序。

图片来自Hadoop: The Definitive Guide

原理上只要是能够处理stdio的语言都能用来写mapper和reducer,也可以指定mapper或reducer为Linux下的程序(如awk、grep、cat)或者按照一定格式写好的java class。因此,mapper和reducer也不必是同一类的程序。

Hadoop Streaming的优缺点

  • 优点
    • 可以使用自己喜欢的语言来编写MapReduce程序(换句话说,不必写Java XD)
    • 不需要像写Java的MR程序那样import一大堆库,在代码里做一大堆配置,很多东西都抽象到了stdio上,代码量显著减少
    • 因为没有库的依赖,调试方便,并且可以脱离Hadoop先在本地用管道模拟调试
  • 缺点
    • 只能通过命令行参数来控制MapReduce框架,不像Java的程序那样可以在代码里使用API,控制力比较弱,有些东西鞭长莫及
    • 因为中间隔着一层处理,效率会比较慢

所以Hadoop Streaming比较适合做一些简单的任务,比如用python写只有一两百行的脚本。如果项目比较复杂,或者需要进行比较细致的优化,使用Streaming就容易出现一些束手束脚的地方。

用python编写简单的Hadoop Streaming程序

这里提供两个例子:

  1. Michael Noll的word count程序
  2. Hadoop: The Definitive Guide里的例程

使用python编写Hadoop Streaming程序有几点需要注意:

  1. 在能使用iterator的情况下,尽量使用iterator,避免将stdin的输入大量储存在内存里,否则会严重降低性能
  2. streaming不会帮你分割key和value传进来,传进来的只是一个个字符串而已,需要你自己在代码里手动调用split()
  3. 从stdin得到的每一行数据末尾似乎会有\n,保险起见一般都需要使用rstrip()来去掉
  4. 在想获得K-V list而不是一个个处理key-value pair时,可以使用groupby配合itemgetter将key相同的k-v pair组成一个个group,得到类似Java编写的reduce可以直接获取一个Text类型的key和一个iterable作为value的效果。注意itemgetter的效率比lambda表达式要高,所以如果需求不是很复杂的话,尽量用itemgetter比较好。

我在编写Hadoop Streaming程序时的基本模版是

复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Some description here...
"""import sys
from operator import itemgetter
from itertools import groupbydef read_input(file):"""Read input and split."""for line in file:yield line.rstrip().split('\t')def main():data = read_input(sys.stdin)for key, kviter in groupby(data, itemgetter(0)):# some code here..if __name__ == "__main__":main()
复制代码

如果对输入输出格式有不同于默认的控制,主要会在read_input()里调整。

本地调试

本地调试用于Hadoop Streaming的python程序的基本模式是:

$ cat <input path> | python <path to mapper script> | sort -t $'\t' -k1,1 | python <path to reducer script> > <output path>

或者如果不想用多余的cat,也可以用<定向

$ python <path to mapper script> < <input path> | sort -t $'\t' -k1,1 | python <path to reducer script> > <output path>

这里有几点需要注意:

  1. Hadoop默认按照tab来分割key和value,以第一个分割出的部分为key,按key进行排序,因此这里使用

    sort -t $'\t' -k1,1

    来模拟。如果你有其他需求,在交给Hadoop Streaming执行时可以通过命令行参数调,本地调试也可以进行相应的调整,主要是调整sort的参数。因此为了能够熟练进行本地调试,建议先掌握sort命令的用法。

  2. 如果你在python脚本里加上了shebang,并且为它们添加了执行权限,也可以用类似于

    ./mapper.py

    来代替

    python mapper.py

推荐阅读


Hadoop Streaming的官方文档,建议通读
Recommendations with hadoop streaming and python

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis学习(13): 连接数据库之前的准备(测试连接)

工具eclipse 先导入我们的jar包 链接&#xff1a;https://pan.baidu.com/s/1-dgB_x91YY4C9KnCbqIazg 提取码&#xff1a;ptp2 test 类 package test;import java.beans.Statement; import java.sql.*;public class Test {private final static String URL "jdbc:sqls…

第一百五十二期:白话Entity Framework Core数据验证

数据验证是每个项目必须存在的&#xff0c;可以防止不符合系统规范的数据进入系统进而导致系统不稳定甚至崩溃。我们可以自己编写代码进行验证&#xff0c;但是这样一方面代码量较大&#xff0c;另一方面有可能验证代码覆盖不完全。但是在 Entity Framework Core &#xff08;以…

小程序云开发实战 - 口袋工具之“历史上的今天”

前言 本项目是一个基于云开发的小程序。 本文选取项目中的一个页面 -- 历史上的今天 来做一个云开发的分享&#xff0c;会涉及云函数和云数据库。 由于是实战项目&#xff0c;关于小程序的基础知识请移步官方文档&#xff0c;本文不再赘述。 项目预览 微信搜索&#xff1a; 口袋…

第一百五十三期: 云迁移可能失败的5种方式以及成功的5种方式

通过将应用程序迁移到云平台中&#xff0c;企业可以提高安全性、数据访问、可扩展性和IT灵活性。将业务迁移到云平台还可以为企业节省成本。以下是导致企业云迁移失败的五个主要原因以及其解决方法。 作者&#xff1a;Andy Patrizio 对于大多数企业而言&#xff0c;将业务迁移…

每天一个linux命令(30): chown命令

原文地址&#xff1a;http://www.cnblogs.com/peida/archive/2012/12/04/2800684.html chown将指定文件的拥有者改为指定的用户或组&#xff0c;用户可以是用户名或者用户ID&#xff1b;组可以是组名或者组ID&#xff1b;文件是以空格分开的要改变权限的文件列表&#xff0c;支…

mybatis学习(14):log4j:ERROR Category option 1 not a decimal integer.

log4j:ERROR Category option " 1 " not a decimal integer. java.lang.NumberFormatException: For input string: " 1 " 修改log4j.xml配置文件 ### \u914D\u7F6E\u6839 ### log4j.rootLogger debug,console ,fileAppender,dailyRollingFile,ROLLING_…

在PEA上海做演讲主题:大型、高负载网站架构和应用初探

主题&#xff1a;大型、高负载网站架构和应用初探时间&#xff1a;30-45分钟 开题&#xff1a;163,sina,sohu等网站他们有很多应用程序都是PHP写的&#xff0c;为什么他们究竟是如何能做出同时跑几千人甚至上万同时在线应用程序呢? 挑选性能更好web服务器 单台 Apache web se…

数论考试题(b) 求约数的约数的最大个数

题意&#xff1a;求1~n范围里约数的约数的个数加起来最多的是哪个数 及其总数 题解&#xff1a; /* 对一个数质因数分解 首先要知道两个公式&#xff1a;约数的个数的公式&#xff0c;和约数的约数的个数的公式(详见题解) 然后发现&#xff1a;质因数分解后 小的次冥尽量大 会…

Anaconda 安装

参考网址&#xff1a;http://www.jianshu.com/p/169403f7e40c http://blog.csdn.net/qq_26898461/article/details/51488326 Anaconda基础 什么是Anaconda Anaconda是一个用于科学计算的Python发行版&#xff0c;支持 Linux, Mac, Windows系统&#xff0c;提供了包管理与环境管…

mybatis学习(15):mybatis连接mysql数据库

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(String id); }BlogMapper.xml <?xml version"1.0" encoding"UTF-8" ?>…

nodejs对mongodb数据库的增删改查操作(转载)

首先要确保mongodb的正确安装&#xff0c;安装参照&#xff1a;http://docs.mongodb.org/manual/tutorial/install-mongodb-on-debian-or-ubuntu-linux 另外可以参考我的另一篇博文 http://www.cnblogs.com/sexintercourse/p/5774310.html 指导mongo和nodejs的开发 然后下载nod…

mybatis学习(16):不使用接口的方式

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Inteage id); }BlogMapper.xml <?xml version"1.0" encoding"UTF-8" ?>…

AS3图像抖动效果源码。

DemoSourceWebsite转载于:https://www.cnblogs.com/xxcainiao/archive/2008/05/07/1186805.html

mybatis学习(17):列名与属性名不一致的情况(使用别名)

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Inteage id); }BlogMapper.xml <?xml version"1.0" encoding"UTF-8" ?>…

mybatis学习(18):列名与属性名不一致的情况(使用ResultMap)

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer id);Blog selectBlog2(Integer id); }BlogMapper.xml <?xml version"1.0" en…

MVCToolKit中HtmlHelper.ActionLink的BUG?

分页时<%if (ViewData.Accounts.IsPreviousPage) { %><%Html.ActionLink<SpeakOutFreely.Controllers.ManageController>(c >c.List(ViewData.Accounts.PageIndex -1), "Previous")%><%} %><%if (ViewData.Accounts.IsNextPage) { %&g…

PyChram简单使用教程

一、PyChram下载 官网&#xff1a;http://www.jetbrains.com/pycharm Windows:http://www.jetbrains.com/pycharm/download/#sectionwindows Linux:http://www.jetbrains.com/pycharm/download/#sectionlinux Mac:http://www.jetbrains.com/pycharm/download/# 二、PyChram简单…

mybatis学习(19):模糊查询#

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer id);Blog selectBlog2(Integer id);List<Blog> selectBlogByTi…

mybatis学习(20):模糊查询$

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer id);Blog selectBlog2(Integer id);List<Blog> selectBlogByTi…

mybatis学习(21):MySQL 字符串 转换 CAST与CONVERT 函数的用法

MySQL 的CAST()和CONVERT()函数可用来获取一个类型的值&#xff0c;并产生另一个类型的值。两者具体的语法如下&#xff1a; Sql代码 CAST(value as type); CONVERT(value, type); 就是CAST(xxx AS 类型), CONVERT(xxx,类型)。 Sql代码 mysql> SELECT CAST(3.35 …