参见《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