Hadoop Streaming提供了一个便于进行MapReduce编程的工具包,使用它可以基于一些可执行命令、脚本语言或其他编程语言来实现Mapper和 Reducer,从而充分利用Hadoop并行计算框架的优势和能力,来处理大数据

好吧我承认以上这句是抄的以下是原创干货

首先部署hadoop环境,这点可以参考 http://www.powerxing.com/install-hadoop-in-centos/

好吧原创从下一行开始

部署hadoop完成后,需要下载hadoop-streaming包,这个可以到http://www.java2s.com/Code/JarDownload/hadoop-streaming/hadoop-streaming-0.23.6.jar.zip去下载,或者访问http://www.java2s.com/Code/JarDownload/hadoop-streaming/选择最新版本,千万不要选择source否则后果自负,选择编译好的jar包即可,放到/usr/local/hadoop目录下备用

接下来是选择大数据统计的样本,我在阿里的天池大数据竞赛网站下载了母婴类购买统计数据,记录了900+个萌萌哒小baby的购买用户名、出生日期和性别信息,天池的地址https://tianchi.shuju.aliyun.com/datalab/index.htm

数据是一个csv文件,结构如下:

用户名,出生日期,性别(0女,1男,2不愿意透露性别)

比如:415971,20121111,0(数据已经脱敏处理)

下面我们来试着统计每年的男女婴人数

接下来开始写mapper程序mapper.py,由于hadoop-streaming是基于Unix Pipe的,数据会从标准输入sys.stdin输入,所以输入就写sys.stdin

#!/usr/bin/python
# -*- coding: utf-8 -*- import sys for line in sys.stdin:
line = line.strip()
data = line.split(',')
if len(data)<3:
continue
user_id = data[0]
birthyear = data[1][0:4]
gender = data[2]
print >>sys.stdout,"%s\t%s"%(birthyear,gender)

一个很简单的程序,看不懂的请自行提高姿势水平

下面是reduce程序,这里大家需要注意一下,map到reduce的期间,hadoop会自动给map出的key排序,所以到reduce中是一个已经排序的键值对,这简化了我们的编程工作

我是有洪荒之力的reducer.py,和外面的哪些妖艳贱货不一样

#!/usr/bin/python
# -*- coding: utf-8 -*- import sys gender_totle = {'':0,'':0,'':0}
prev_key = False
for line in sys.stdin:#map的时候map中的key会被排序
line = line.strip()
data = line.split('\t')
birthyear = data[0]
curr_key = birthyear
gender = data[1] #寻找边界,输出结果
if prev_key and curr_key !=prev_key:#不是第一次,并且找到了边界
print >>sys.stdout,"%s year has female %s and male %s"%(prev_key,gender_totle[''],gender_totle[''])#先输出上一次统计的结果
prev_key = curr_key
gender_totle[''] = 0
gender_totle[''] = 0
gender_totle[''] = 0#清零
gender_totle[gender] +=1#开始计数
else:
prev_key = curr_key
gender_totle[gender] += 1
#输出最后一行
if prev_key:
print >>sys.stdout,"%s year has female %s and male %s"%(prev_key,gender_totle[''],gender_totle[''])

接下来就是将样本和mapper reducer上传到hdfs中并执行了,这也是我踩坑的地方

可以先这样测试下python脚本是否正确

cat sample.csv | ./mapper.py | sort -t ' ' -k  | ./reducer.py 

首先要在hdfs中创建相应的目录,为了方便,我将一部分hadoop命令做了别名

alias stop-dfs='/usr/local/hadoop/sbin/stop-dfs.sh'
alias start-dfs='/usr/local/hadoop/sbin/start-dfs.sh'
alias dfs='/usr/local/hadoop/bin/hdfs dfs'
echo "alias stop-dfs='/usr/local/hadoop/sbin/stop-dfs.sh'" >> /etc/profile
echo "alias start-dfs='/usr/local/hadoop/sbin/start-dfs.sh'" >> /etc/profile
echo "alias dfs='/usr/local/hadoop/bin/hdfs dfs'" >> /etc/profile

启动hadoop后,先创建一个用户目录

dfs -mkdir -p /user/root

将样本上传到此目录中

dfs -put ./sample.csv /user/root

当然也可以这样处理更加规范,这两者的差别一会儿会说

dfs -mkdir -p /user/root/input
dfs -put ./sample.csv /user/root/input

接下来将mapper.py和reducer.py上传到服务器上,切换到上传以上两个文件的目录

然后就可以执行了,执行命令如下

hadoop jar /usr/local/hadoop/hadoop-streaming-0.23..jar \
-D mapred.job.name="testhadoop" \
-D mapred.job.queue.name=testhadoopqueue \
-D mapred.map.tasks= \
-D mapred.min.split.size= \
-D mapred.reduce.tasks= \
-D stream.num.map.output.key.fields= \
-D num.key.fields.for.partition= \
-input sample.csv \
-output output-streaming \
-mapper mapper.py \
-reducer reducer.py \
-file mapper.py \
-file reducer.py \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner

如果是将sample.csv放到input下,这个命令就应该这么写,不过反正我也没试过,出错了不关我的事

hadoop jar /usr/local/hadoop/hadoop-streaming-0.23..jar \
-D mapred.job.name="testhadoop" \
-D mapred.job.queue.name=testhadoopqueue \
-D mapred.map.tasks= \
-D mapred.min.split.size= \
-D mapred.reduce.tasks= \
-D stream.num.map.output.key.fields= \
-D num.key.fields.for.partition= \
-input input/sample.csv \
-output output-streaming \
-mapper mapper.py \
-reducer reducer.py \
-file mapper.py \
-file reducer.py \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner

命令的解释如下

(1)-input:输入文件路径
(2)-output:输出文件路径
(3)-mapper:用户自己写的mapper程序,可以是可执行文件或者脚本
(4)-reducer:用户自己写的reducer程序,可以是可执行文件或者脚本
(5)-file:打包文件到提交的作业中,可以是mapper或者reducer要用的输入文件,如配置文件,字典等。
         这个一般是必须有的,因为mapper和reducer函数都是写在本地的文件中,因此需要将文件上传到集群中才能被执行
(6)-partitioner:用户自定义的partitioner程序
(7)-D:作业的一些属性(以前用的是-jonconf),具体有:
              1)mapred.map.tasks:map task数目  
              设置的数目与实际运行的值并不一定相同,若输入文件含有M个part,而此处设置的map_task数目超过M,那么实际运行map_task仍然是M
              2)mapred.reduce.tasks:reduce task数目  不设置的话,默认值就为1
              3)num.key.fields.for.partition=N:shuffle阶段将数据集的前N列作为Key;所以对于wordcount程序,map输出为“word  1”,shuffle是以word作为Key,因此这里N=1
(8)-D stream.num.map.output.key.fields=1 这个是指在reduce之前将数据按前1列做排序,一般情况下可以去掉

接下来就是激动人心的一刻了,要非常用力地跪着按下enter键

如果有报错output-streaming already exists就用命令dfs -rm -R /user/root/output-streaming 然后跳起来按下enter键

即使出现奇怪的刷屏也不要惊奇恩妈妈是这么教我的

如果出现以下字样就是成功了

16/08/18 18:35:20 INFO mapreduce.Job:  map 100% reduce 100%
16/08/18 18:35:20 INFO mapreduce.Job: Job job_local926114196_0001 completed successfully

之后使用如下命令将结果取回本地,使用cat命令就能查看

dfs -get /user/root/output-streaming/* ./output-streaming
cat ./output-streaming/*

很惭愧,只做了一点微小的工作

使用python+hadoop-streaming编写hadoop处理程序的更多相关文章

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

    相关随笔: Hadoop-1.0.4集群搭建笔记 用python + hadoop streaming 编写分布式程序(二) -- 在集群上运行与监控 用python + hadoop streami ...

  2. 用python + hadoop streaming 编写分布式程序(二) -- 在集群上运行与监控

    写在前面 相关随笔: Hadoop-1.0.4集群搭建笔记 用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试 用python + hado ...

  3. 用python + hadoop streaming 编写分布式程序(三) -- 自定义功能

    又是期末又是实训TA的事耽搁了好久……先把写好的放上博客吧 相关随笔: Hadoop-1.0.4集群搭建笔记 用python + hadoop streaming 编写分布式程序(一) -- 原理介绍 ...

  4. hadoop streaming编程小demo(python版)

    大数据团队搞数据质量评测.自动化质检和监控平台是用django,MR也是通过python实现的.(后来发现有orc压缩问题,python不知道怎么解决,正在改成java版本) 这里展示一个python ...

  5. Hadoop Streaming

    原文地址:http://hadoop.apache.org/docs/r1.0.4/cn/streaming.html Hadoop Streaming Streaming工作原理 将文件打包到提交的 ...

  6. hadoop streaming anaconda python 计算平均值

    原始Liunx 的python版本不带numpy ,安装了anaconda 之后,使用hadoop streaming 时无法调用anaconda python  , 后来发现是参数没设置好... 进 ...

  7. Hadoop Streaming例子(python)

    以前总是用java写一些MapReduce程序现举一个例子使用Python通过Hadoop Streaming来实现Mapreduce. 任务描述: HDFS上有两个目录/a和/b,里面数据均有3列, ...

  8. Hadoop Streaming框架学习(一)

    Hadoop Streaming框架学习(一) Hadoop Streaming框架学习(一) 2013-08-19 12:32 by ATP_, 473 阅读, 3 评论, 收藏, 编辑 1.Had ...

  9. hadoop streaming 编程

    概况 Hadoop Streaming 是一个工具, 代替编写Java的实现类,而利用可执行程序来完成map-reduce过程.一个最简单的程序 $HADOOP_HOME/bin/hadoop jar ...

随机推荐

  1. java学习之路--String类的基本方法

    String类常见的功能 获取 1.1 字符串中包含的字符数,也就是获取字符串的长度:int length(); 1.2 根据位置获取某个位置上的字符:char charAt(int index) 1 ...

  2. 阿里云api调用做简单的cmdb

    阿里云api调用做简单的cmdb 1 步骤 事实上就是调用阿里api.获取可用区,比方cn-hangzhou啊等等.然后在每一个区调用api 取ecs的状态信息,最好写到一个excel里面去.方便排序 ...

  3. windows7,python3使用time.strftime()函数报ValueError: embedded null byte

    windows7环境下,执行代码报ValueError: embedded null byte时,在原代码前面加一行代码:locale.setlocale(locale.LC_ALL,'en')即可解 ...

  4. python字符串拼接

    Python字符串拼接 在Python的实际开发中,很多都需要用到字符串拼接,python中字符串拼接有很多,今天总结一下: 用+符号拼接 用%符号拼接 用join()方法拼接 用format()方法 ...

  5. python之wtforms组件

    作用 生成 HTML 表单. form 表单验证. 基本使用 安装 pip3 install wtforms 示例 登录 from flask import Flask, render_templat ...

  6. VC++运行库 集32位/64位整合版

    运行程序时,win7/win10(x86和x64)常会遇到缺少什么缺少msvc***.dll问题 安装下面链接提供的程序,安装后,便可解决. [2016-10-10]Microsoft Visual ...

  7. IT人员如何开好站立会议

    一.来由 软件开发的过程却又是一个离不开协作.沟通的过程.一个缺乏良好协作,沟通.理解和目标一致的软件团队,是很难高质高效的交付的. 敏捷的众多实践中,有一个为了提升团队协作的经典实践:站立会议 二. ...

  8. rsync 远程同步 实时同步备份 两种免交互的方式实现实时备份

    rsync 远程同步: 一款快速增量备份工具 Remote Sync,远程同步 支持本地复制,或者与其他SSH.rsync主机同步 作用:做数据备份 备份方式:      完全备份      增量备份 ...

  9. 【Spark-core学习之三】 Spark集群搭建 & spark-shell & Master HA

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  10. [转载]Javascript .then()这个方法是什么意思?

    then()方法是异步执行. 意思是:就是当.then()前的方法执行完后再执行then()内部的程序,这样就避免了,数据没获取到等的问题. 语法:promise.then(onCompleted, ...