个人认为在MapReduce中使用Avro可以提升数据的处理性能,主要是以下几点:

向Job提供数据文件时可以使用Avro序列化过的二进制数据文件

在数据解析方面速度比较快

排序功能

Avro官网也提供了一个ColorCount这样的一个案例,演示使用Avro序列化过的二进制数据文件作为MapReduce的Job的输入数据,并且完成计算之后,输出结果也是Avro序列化后的数据文件,下面是这个案例源码及相关步骤:

1. 项目的pom文件:

org.apache.avro

avro

1.7.7

org.apache.avro

avro-mapred

1.7.7

hadoop2 //这是maven的分类器,用来进一步来确定jar包的类别的

org.apache.hadoop

hadoop-client

2.9.2

junit

junit

4.12

test

org.apache.maven.plugins

maven-jar-plugin

com.zpark.demo.avro.mapreduce.MapReduceColorCount

org.apache.maven.plugins

maven-compiler-plugin

1.8

1.8

注意事项:

在引入依赖 avro-mapred 时一定要设置分类器属性

hadoop2,并且在使用不熟悉的依赖时,一定看下它的pom文件内容,看里面是不是定义了分类器。

2. Mapper和Reducer代码

public class MapReduceColorCount extends Configured implementsTool {public static class ColorCountMapper extendsMapper, NullWritable, Text, IntWritable>{

@Overridepublic void map(AvroKeykey, NullWritable value, Context context)throwsIOException, InterruptedException {

String color= (String)key.datum().get("favorite_color");if (color == null) {

color= "none";

}

context.write(new Text(color), new IntWritable(1));

}

}public static class ColorCountReducer extendsReducer, AvroValue>{

@Overridepublic void reduce(Text key, Iterablevalues,

Context context)throwsIOException, InterruptedException {int sum = 0;for(IntWritable value : values) {

sum+=value.get();

}

context.write(new AvroKey(key.toString()), new AvroValue(sum));

}

}public int run(String[] args) throwsException {if (args.length != 2) {

System.err.println("Usage: MapReduceColorCount ");return -1;

}//Job job = new Job(getConf());

Job job= Job.getInstance(getConf(), "word count");

job.setJarByClass(MapReduceColorCount.class);

job.setJobName("Color Count");

FileInputFormat.setInputPaths(job,new Path(args[0]));

FileOutputFormat.setOutputPath(job,new Path(args[1]));

job.setInputFormatClass(AvroKeyInputFormat.class);

job.setMapperClass(ColorCountMapper.class);

AvroJob.setInputKeySchema(job, ColorCountSchema.schema);

job.setMapOutputKeyClass(Text.class);

job.setMapOutputValueClass(IntWritable.class);

job.setOutputFormatClass(AvroKeyValueOutputFormat.class);

job.setReducerClass(ColorCountReducer.class);

AvroJob.setOutputKeySchema(job, Schema.create(Schema.Type.STRING));

AvroJob.setOutputValueSchema(job, Schema.create(Schema.Type.INT));return (job.waitForCompletion(true) ? 0 : 1);

}public static void main(String[] args) throwsException {int res = ToolRunner.run(newMapReduceColorCount(), args);

System.exit(res);

}

}

3. Avro Schema

通过下面这个类来产成Avro序列时的Schema对象

public classColorCountSchema {public static Schema schema = newSchema.Parser().parse(newStringBuilder()

.append("{\"namespace\": \"com.zpark.demo.avro.mapreduce\",")

.append("\"type\": \"record\",")

.append("\"name\": \"User\",")

.append("\"fields\": [")

.append("{\"name\": \"name\", \"type\": \"string\"},")

.append("{\"name\": \"favorite_number\", \"type\": [\"int\", \"null\"]},")

.append("{\"name\": \"favorite_color\", \"type\": [\"string\", \"null\"]}")

.append("]")

.append("}").toString()

);

}

下面是对应的user.avsc文件的内容

{"namespace": "com.zpark.demo.avro.mapreduce","type": "record","name": "User","fields": [

{"name": "name", "type": "string"},

{"name": "favorite_number", "type": ["int", "null"]},

{"name": "favorite_color", "type": ["string", "null"]}

]

}

4. 打包上传Jar包到Hadoop环境下运行

一定要注意,同时需要把依赖jar包avro-mapred-1.7.7-hadoop2.jar上传到 $HADOOP_HOME/share/hadoop/mapreduce目录下,并且一定上传分类器版本对应haddop2的jar,否则会报下面的错:

5.查看计算结果执行后会输出part-r-00000.avro这样的计算结果文件,可以通过 java -jar avro-tools-1.9.1.jar tojson part-r-00000.avro来查看,此外通过java -jar avro-tools-1.9.1.jar help可以查看avro-tools的详细命令列表

Version 1.9.1of Apache Avro

Copyright2010-2015The Apache Software Foundation

This product includes software developed at

The Apache Software Foundation (https://www.apache.org/).

----------------Available tools:

canonical Converts an Avro Schema to its canonical form

cat Extracts samplesfromfiles

compile Generates Java codeforthe given schema.

concat Concatenates avro files without re-compressing.

fingerprint Returns the fingerprintforthe schemas.

fragtojson Renders a binary-encoded Avro datum asJSON.

fromjson Reads JSON records and writes an Avro data file.

fromtext Imports a text file into an avro data file.

getmeta Printsoutthe metadata of an Avro data file.

getschema Printsoutschema of an Avro data file.

idl Generates a JSON schemafroman Avro IDL file

idl2schemata Extract JSON schemata of the typesfroman Avro IDL file

induce Induce schema/protocol from Java class/interfacevia reflection.

jsontofrag Renders a JSON-encoded Avro datum asbinary.

random Creates a file with randomly generated instances of a schema.

recodec Alters the codec of a data file.

repair Recovers datafroma corrupt Avro Data file

rpcprotocol Output the protocol of a RPC service

rpcreceive Opens an RPC Server and listensforone message.

rpcsend Sends a single RPC message.

tether Run a tethered mapreduce job.

tojson Dumps an Avro data fileasJSON, record per line or pretty.

totext Converts an Avro data file to a text file.

totrevni Converts an Avro data file to a Trevni file.

trevni_meta Dumps a Trevni file's metadata as JSON.

trevni_random Create a Trevni file filled with random instances of a schema.

trevni_tojson Dumps a Trevni fileas JSON.

maven依赖avro_在MapReduce中使用Avro相关推荐

  1. maven依赖本地非repository中的jar包-依赖jar包放在WEB-INF/lib等目录下的情况客户端编译出错的处理...

    2019独角兽企业重金招聘Python工程师标准>>> maven依赖本地非repository中的jar包 http://www.cnblogs.com/piaolingxue/a ...

  2. maven依赖avro_如何使用maven进行avro序列化

    maven导入avro: org.apache.avro avro 1.7.7 maven导入avro的构建插件: org.apache.avro avro-maven-plugin 1.7.7 ge ...

  3. 怎么排除maven依赖

    文章目录 怎么排除maven依赖 1.下载maven helper插件 2.查看依赖冲突 3.解决冲突 怎么排除maven依赖 当我们项目中引入其他模块时,就会产生依赖冲突,发生冲突会产生类似的报错: ...

  4. httpclient的maven依赖

    httpclient的maven依赖 在pom.xml中加入下面内容: <dependency><groupId>org.apache.httpcomponents</g ...

  5. maven依赖avro_Apache Avro使用入门指南

    Avro有C, C++, C#, Java, PHP, Python, and Ruby等语言的实现,本文只简单介绍如何在Java中使用Avro进行数据的序列化(data serialization) ...

  6. 解决IDEA中导入新的maven依赖后Language Level自动重置问题

    解决IDEA中导入新的maven依赖后Language Level自动重置问题 参考文章: (1)解决IDEA中导入新的maven依赖后Language Level自动重置问题 (2)https:// ...

  7. 解决IDEA中,maven依赖不自动补全的问题

    解决IDEA中,maven依赖不自动补全的问题 参考文章: (1)解决IDEA中,maven依赖不自动补全的问题 (2)https://www.cnblogs.com/flypig666/p/1179 ...

  8. java继承eclipse_Java-Maven(七):Eclipse中Maven依赖、聚合、继承特性

    之前通过学习了解,maven集成到eclipse中的如何创建项目,以及maven命令插件在eclipse中安装后的用法.那么接下来我们将会学习一些maven在项目中的一些特性,及如何使用. Maven ...

  9. dependency报红_解决IDEA中Maven依赖包导入失败报红问题(总结最有效8种解决方案)...

    问题描述: 真的,说来话长,这应该是我花最多时间去解决关于Maven依赖包导入的问题,以前粘贴复制导入,自动下载成功了, 这次怎么搞,怎么让他自动下载都还是红红的一片, 花了大半天,各种尝试,只为搏得 ...

最新文章

  1. linux ext4增加大小,如何修改 ext4 文件系统的大小
  2. Tensorflow一些常用基本概念与函数(1)
  3. 体验最火的敏捷-SCRUM!(网络直播课程 免费)
  4. java反射模式_Java反射机制详解
  5. python 单例模式的四种实现方法
  6. centos7安装yum_centos7下yum方式安装jenkins
  7. electron ajax路径,electron 打包用file协议的ajax请求路径问题
  8. python476集免费教材_476. 数字的补数 | python|python爬虫|python入门|python教程
  9. java 接口是抽象类吗_我是如何理解Java抽象类和接口的
  10. Mac中将 WEBP 图片转成 JPG、PNG 格式的 2 种方法
  11. 除了字节,腾讯也来“抢”阿里的这门生意
  12. 假设某台台式计算机的内存储器容量为128,假设某台计算机的内存储器容量为128MB,硬盘容量为10GB,硬盘的容量是内存容量的多少倍?...
  13. Word里的数学符号在哪里
  14. Excel如何查找两列数据不同项
  15. excel取整数的函数_EXCEL的知识考点
  16. 计算机内存与外存的区别及使用配合(内存外存区别与搭配;快速缓存;计算机总线结构;计算机程序内存分布(栈、堆、全局/静态、数据区、代码段))
  17. 蚂蚁金服杨军:蚂蚁数据分析平台的演进及数据分析方法的应用
  18. 电路设计_自恢复保险丝参数说明
  19. 「数据运营」理解DataOps运营
  20. python sort给字母排序_python sort、sorted高级排序技巧

热门文章

  1. 启用计算机浏览器摄像头,如何启用浏览器进行摄像头访问?
  2. php 测试数据整数,PHP中将字符串转化为整数(int) intval() printf() 性能测试
  3. js平滑滚动到顶部,底部,指定地方 animate()
  4. InvocationTargetException 浅析
  5. chkconfig命令及的使用 与linux的七个运行级别
  6. 尝试使用iReport4.7(基于Ubuntu Desktop 12.04 LTS)
  7. JSON.parse()函数处理json格式字符串方法
  8. 怎么做c语言的子程序,哪位师傅知道51单片机怎样编写子程序?C语言的。在主程序里调...
  9. Ogre1.7的地形、天空与雾
  10. java 异常总结_Java异常的十大问题总结