elephant-bird的使用示例

2024-08-20 17:48
文章标签 使用 示例 bird elephant

本文主要是介绍elephant-bird的使用示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

elephant-bird的使用示例

一、简要概述

在近期项目的开发中,由于处理数据量巨大,为了减少HDFS的存储压力以及提高MapReduce的运算效率,故采用了protoc buffer序列化和lzo压缩机制。在项目中采用了这两种机制后,整个集群的存储压力及运算效率得到了明显的改善。但在开发中,我们需要分别根据protobuf的配置文件xxx.proto所定义的消息结构(也就是数据类型)来自己手动实现Hadoop org.apache.hadoop.io.WritableComparable,以及InputFormat和OutputFormat.,同时也要手动加入lzo压缩处理,这样一来,工作量就会变得非常巨大,但elephant-bird很好的替代了这方面的工作。它能基于protocol buffer的proto文件,以及thrift的thrift文件生成对应的Writable,InputFormat以及OutputFormat.需要lzo压缩以及64位编码也没关系,照样都支持.如此省去了你自己去写这些代码的麻烦,而且写这些代码都是机械性的,所以也就有了elephant-bird的存在性。

如果,大家对protobuf、thrift、lzo有不了解的话,可以参看本人的博客,进入对应的博客分类里面,即可查看到。

二、环境搭建

1.环境说明:

在如下的使用示例中,需要你的机器上安装ant以及protocol buffer(本例中Thrift暂不使用)。如果,大家没安装的话,可以参看本人的博客把环境搭建好。

对于使用elephant-bird,我们只需要使用elephant-bird提供的可执行jar包即可根据要求生产自己想要的代码。

2.下载elephant-bird相关jar包

(1).可以通过git从git clone git://github.com/kevinweil/elephant-bird.git  clone一份工程

(2).下载本人的连接:

1.创建工程,结构如下:

1.将上图展示的各种jar放入工程。

2.新建address_book.proto文件,内容如下:

package org.zhu.elephantBird.proto;option java_outer_classname = "AddressBookProtos";message Person {required string name = 1;required int32 id = 2;optional string email = 3;enum PhoneType {MOBILE = 0;HOME = 1;WORK = 2;}message PhoneNumber {required string number = 1;optional PhoneType type = 2 [default = HOME];}repeated PhoneNumber phone = 4;
}message AddressBook {repeated Person person = 1;
}
3.build.xml文件,内容如下:

<!--默认执行target2:generate-protobufANDelephant-bird-->
<project name="elephant-bird-study" basedir="." default="generate-protobufANDelephant-bird"><property name="src.proto.dir" location="./conf" /><property name="src.gen.java.dir" location="${src.dir}/gen-java" /><!--target 1:只生成protobuf代码--><target name="generate-protobuf"><delete dir="${src.gen.java.dir}" /><mkdir dir="${src.gen.java.dir}" /><apply executable="protoc" failοnerrοr="true" skipemptyfilesets="true" verbose="true"><arg value="--proto_path=${src.proto.dir}" /><arg value="--java_out=${src.gen.java.dir}" /><fileset dir="${src.proto.dir}" includes="addressBook.proto" /></apply></target><!--target 2:生成protobuf代码和elephant-bird代码--><!--增加了<env key="PATH" path="${env.PATH}:${basedir}/script" />,表示将刚才新建的$YOUR_PROJECT_HOME/script下的文件放入path中     增加了参数<arg value="- -example_out=${src.gen.java.dir}" />,这里elephant-bird有个奇怪的规则,参数名为- -example_out,其中example存在规则,他将跟protoc-gen-组成protoc-gen-example做为Protocol Buffer调用elephant-bird的脚本文件名.   --><target name="generate-protobufANDelephant-bird" ><delete dir="${src.gen.java.dir}"/><mkdir dir="${src.gen.java.dir}"/><apply executable="protoc" failοnerrοr="true" skipemptyfilesets="true" verbose="true" ><env key="PATH" path="${env.PATH}:${basedir}/script" /><arg value="--proto_path=${src.proto.dir}" /><arg value="--java_out=${src.gen.java.dir}" /><!--注意:下面的“- -addressBook_out”中的“addressBook”部分的名称要和script目录下的"protoc-gen-addressBoo的中"addressBook"部分保持一致,否则会报找不到脚本错误--><arg value="--addressBook_out=${src.gen.java.dir}" /><fileset dir="${src.proto.dir}" includes="address_book.proto" /></apply></target></project>

4.编写config-example.yml文件:

#通过指定代码生成器类型(具体的生成代码的类)配置elephant-bird生成的代码类型
#注意下面的"address_book"标识要和conf目录下的address_book.proto的名称(不包括后缀名.proto)保持一致
#否则会报配置文件(即此文件,config-example.yml)和xxx.proto文件不匹配错误
#如下配置将生成mapreduce、pig相关的实现代码
address_book:- com.twitter.elephantbird.proto.codegen.DeprecatedLzoProtobufBlockInputFormatGenerator- com.twitter.elephantbird.proto.codegen.LzoProtobufB64LineInputFormatGenerator- com.twitter.elephantbird.proto.codegen.LzoProtobufB64LineOutputFormatGenerator- com.twitter.elephantbird.proto.codegen.LzoProtobufBlockInputFormatGenerator- com.twitter.elephantbird.proto.codegen.LzoProtobufBlockOutputFormatGenerator- com.twitter.elephantbird.proto.codegen.ProtobufWritableGenerator- com.twitter.elephantbird.proto.codegen.LzoProtobufB64LinePigLoaderGenerator- com.twitter.elephantbird.proto.codegen.LzoProtobufBlockPigLoaderGenerator
#  - com.twitter.elephantbird.proto.codegen.LzoProtobufHiveSerdeGenerator- com.twitter.elephantbird.proto.codegen.ProtobufBytesToPigTupleGenerator

5.编写protoc-gen-addressBook脚本文件:

#!/bin/bash  
#调用java命令执行elephant-bird的代码生成引擎(com.twitter.elephantbird.proto.HadoopProtoCodeGenerator)
#按照配置文件config-example.yml来生成制定类型的代码/usr/bin/java -cp ./lib/*: com.twitter.elephantbird.proto.HadoopProtoCodeGenerator ./script/config-example.yml -

编写以上配置文件的注意事项:

(1).请保证build.xml文件中的<arg value="--addressBook_out=${src.gen.java.dir}" />中的“addressBook”部分的名称要和script目录下的"protoc-gen-           addressBoo的中"addressBook"部分保持一致,否则会报找不到脚本错误

(2).请保证config-example.yml文件中的"address_book"标识要和conf目录下的address_book.proto的名称(不包括后缀名.proto)保持一致
否则会报配置文件(即此文件,config-example.yml)和xxx.proto文件不匹配错误

6.通过ant生成代码:

可以通过执行ant命令(需要进入当前工程的工作目录)或者在eclipse中,在built.xml页面中右击鼠标,点击"run as ant"来运行程序生成代码。

如无意外的话,你的工程下的src包下会生成如下一坨代码





这篇关于elephant-bird的使用示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090755

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式