python执行mapreduce

执行mapreduce有两种方式,一种是原生Java写的mr,一种是直接使用Streaming方式,这种方式是在Java上面做了一个封装,可以通过其它语言调用Java原生的mr接口。

  • 优点

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

下面是一个例子:

第一个文件test.dat:

0067011990999991950051507004...9999999N9+00001+99999999999...
0043011990999991950051512004...9999999N9+00221+99999999999...
0043011990999991950051518004...9999999N9-00111+99999999999...
0043012650999991949032412004...0500001N9+01111+99999999999...
0043012650999991949032418004...0500001N9+01121+99999999999...
0043012650999991949032418004...0500001N9+01221+99999999999...

第二个文件:map.py

#!usr/bin/python

import re
import sys
for line in sys.stdin:
    val=line.strip()
    (year,temp)=(val[15:19],val[40:45])
    print "%s\t%s" % (year,temp)

第三个文件:red.py

#!usr/bin/python

import sys
(last_key,max_val)=(None,0)
for line in sys.stdin:
  (key,val)=line.strip().split('\t')
  if last_key and last_key!=key:
    print '%s\t%s' % (last_key, max_val)
    (last_key, max_val)=(key,int(val))
  else:
    (last_key, max_val)=(key,max(max_val,int(val)))
if last_key:
  print '%s\t%s' % (last_key, max_val)

执行的mr命令:

hadoop jar /opt/cloudera/parcels/CDH-5.3.2-1.cdh5.3.2.p0.10/jars/hadoop-streaming-2.5.0-cdh5.3.2.jar
	-mapper 'python map.py' -file /usr/local/tables/map.py
	-reducer 'python red.py' -file /usr/local/tables/red.py
	-input /tmp/logs/test.dat
	-output /tmp/test/

为了让Hadoop将程序分发给其他机器,需要再加一个-file参数用于指明要分发的程序放在哪里。

				
时间: 2024-10-12 03:03:29

python执行mapreduce的相关文章

用python写MapReduce函数

尽管Hadoop框架是用java写的,但是Hadoop程序不限于java,可以用python.C++.ruby等.本例子中直接用python写一个MapReduce实例,而不是用Jython把python代码转化成jar文件. 例子的目的是统计输入文件的单词的词频. 输入:文本文件 输出:文本(每行包括单词和单词的词频,两者之间用'\t'隔开) 1. Python MapReduce 代码 使用python写MapReduce的"诀窍"是利用Hadoop流的API,通过STDIN(标准

【转】用python写MapReduce函数——以WordCount为例

本例中直接用python写一个MapReduce实例:统计输入文件的单词的词频 使用python写MapReduce的“诀窍”是利用Hadoop流的API,通过STDIN(标准输入).STDOUT(标准输出)在Map函数和Reduce函数之间传递数据. 我们唯一需要做的是利用Python的sys.stdin读取输入数据,并把我们的输出传送给sys.stdout.Hadoop流将会帮助我们处理别的任何事情. 1.map函数(mapper.py) #!/usr/bin/env python impo

python执行shell获取硬件参数写入mysql

最近要获取服务器各种参数,包括cpu.内存.磁盘.型号等信息.试用了Hyperic HQ.Nagios和Snmp,它们功能都挺强大的,但是于需求不是太符,亦或者太heavy. 于是乎想到用python执行shell获取这些信息,python执行shell脚本有以下三种方法: 1. os.system() os.system('ls')#返回结果0或者1,不能得到命令的输出 2. os.popen() output = os.popen('ls') print output.read()#打印出的

windows linux 使用python执行系统命令并将结果保存到变量

最近需要用到os.system 发现不能赋值到变量 后查有更新的模块,如下: os.system os.spawn* os.popen* popen2.* commands.* 重新使用content=os.popen('help').read() 就能获取到了 import pyodbcimport sysimport osimport commands #python conn sql server2008R2conn = pyodbc.connect( driver='{sql serve

python执行shell命令

python执行shell命令 #!/usr/bin/python2.7 #coding=utf-8 import shlex import datetime import subprocess import time def execute_command(cmdstring, cwd=None, timeout=None, shell=False): # 执行一个SHELL命令 ## 封装了subprocess的Popen方法, 支持超时判断,支持读取stdout和stderr ## 参数:

python执行mysqldump命令

本文简单讲述如何利用python执行一些sql语句,例如执行mysqldump命令,进行数据库备份,备份成sql文件 #!/usr/bin/python#导入os模块import os#导入时间模块import time#导入sys模块import sys#追加mysql的bin目录到环境变量sys.path.append('C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin')#如果不存在backup文件,新建一个if not os.path.e

用python执行Linux命令

例1:在python中包装ls命令 #!/usr/bin/env python#python wapper for the ls commandimport subprocesssubprocess.call(["ls","-l"]) 在Linux中执行该命令 [[email protected] python]# python ls.pytotal 8-rwxrwxrwx 1 root root 415 Mar 18 11:40 a.py-rw-r--r-- 1 

python 执行环境

一些函数 执行其它非python程序 受限执行 结束执行 操作系统接口 相关模块 1 一些函数 callable callable()是一个布尔函数,确定一个对象是否可以通过函数操作符(())来调用.如果函数可调用便返回True,否则便是False. 比如: >>> callable(1) False >>> callable(type) True compile compile(string,something,'eval'/'single'/'exec').程序员通

转 Python执行系统命令的方法

传送门 Python执行系统命令的方法 http://www.linux-field.com/?p=15 Python中执行系统命令常见方法有两种: 两者均需 import os (1) os.system # 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 system(command) -> exit_statusExecute the command (a string) in a subshell. # 如果再命令行下执行,结果直接打印出来 1 >>> os.