Hadoop Streaming + python + avro + Mapreduce例子

参见《Hadoop权威指南(第3版)》第四章 avro部分

准备工作:

Hadoop2.7.2版本安装

python环境安装

实验目的:

通过Hadoop Streaming + Python统计分析某个人喜欢的最大数字

背景知识介绍:

AVRO是一个编程语言无关的序列化规范。主要特点是:

1. 模式与数据都保存在文件中,一般模式以JSON格式保存,数据保存为二进制格式;

2. 由于保存了模式,因此无需对每个数据进行标识,减少了保存数据的空间;

3. 由于数据是自描述的,因此数据可以进行压缩/拆分,非常适合分布式环境中使用;

4. 由于数据是自描述的,非常方便对模式进行扩展;

5. 由于数据是自描述的,不需要强制生成代码


基于python的Avro格式数据读写

import avro.schema
from avro.datafile import DataFileReader, DataFileWriter
from avro.io import DatumReader, DatumWriter

schema=avro.schema.parse(open("user.avsc").read())

writer=DataFileWriter(open("user.avro","w"), DatumWriter(), schema)
writer.append({"name":"Alyssa","favorite_number":256})
writer.close()

reader=DataFileReader(open("user.avro","r"), DatumReader())
for user in reader:
    print(user)
reader.close()
user.avsc文件内容
{"type":"record","name":"User","fields":[{"name":"name","type":"string"},{"name":"favorite_number","type":"int"}]}
生成的user.avro文件内容

Obj^A^D^Vavro.schemaü^A{"fields": [{"type": "string", "name": "name"}, {"type": "int", "name": "favorite_number"}], "type": "record", "name": "User"}^Tavro.codec^Hnull^@tc¡U^C$^A<89>л@ûí<91>^TÖ^B^R^LAlyssa<80>^Dtc¡U^C$^A<89>л@ûí<91>^TÖ

1. 上传数据到HDFS

将user.avro上传到HDFS

hdfs dfs -put user.avro /avro


2. 编写Map程序

Hadoop Streaming会把avro数据读取出来并按行输出,读取出的格式为JSON(如果是byte,那么读取出来也是byte)

暂不提供Reduce程序,后续补充。

import sys
import json

for user in sys.stdin.readlines():
    user_json=json.loads(user)
    print("%s\t%s" % (user_json["name"],user_json["favorite_number"]))

3. 执行

(1)清理上次执行的结果
hdfs dfs -rm -r /output/avro

(2)执行

hadoop jar hadoop/hadoop-2.7.3/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar -D mapred.reduce.tasks=0 -files python/avro/mapper.py,lib/avro-1.7.7.jar,lib/avro-mapred-1.7.7.jar -libjars lib/avro-1.7.7.jar,lib/avro-mapred-1.7.7.jar -input /avro/ -output /output/avro -mapper mapper.py -inputformat org.apache.avro.mapred.AvroAsTextInputFormat

注意:

【1】指定输入类型 -inputformat org.apache.avro.mapred.AvroAsTextInputFormat

【2】上传依赖jar包 -files python/avro/mapper.py,lib/avro-1.7.7.jar,lib/avro-mapred-1.7.7.jar

【3】指定依赖jar包 -libjars lib/avro-1.7.7.jar,lib/avro-mapred-1.7.7.jar

(3)查看执行结果
hdfs dfs -cat /output/avro/part-00000

结果如下:

harrionwang@:study$ hdfs dfs -cat /output/avro/part-00000
Alyssa	256


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值