`
guoyunsky
  • 浏览: 839114 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
3d3a22a0-f00f-3227-8d03-d2bbe672af75
Heritrix源码分析
浏览量:203194
Group-logo
SQL的MapReduce...
浏览量:0
社区版块
存档分类
最新评论

Elephantbird的安装和使用

阅读更多

      本博客属原创文章转载请注明出处: http://guoyunsky.iteye.com/blog/1780165

      本人新浪微博:http://weibo.com/guoyunwb

 

      elephant-bird使用还是比较简单,毕竟只是一个生成代码的工具.我一开始以为elephant-bird也跟Protcol Buffer或Thrift一样,有自己的脚本,传入参数和参数值,通过脚本去生成代码.后来才发现,根本无需如此.
       毕竟elephant-bird基于Protocol Buffer和Thrift,而Protocol Buffer跟Thrift(Thrift我还没去测试过)又支持调用外部命令,也就是shell脚本.而这个shell脚本可以是elephant-bird生成代码的地方.具体看使用吧.
       1.依赖环境: 

                 1)Ant 

                 2)Protocol Buffer
       2.下载   

               下载相对简单,我这里通过git:   

                git clone https://github.com/kevinweil/elephant-bird.git 

                这里下载的elephant-bird路径我在下面简称为$ELEPHANT_BIRD_HOME
       3.安装 

              安装也相对简单,通过ant即可.如: ant install-local ant compile 

              运行这两个ant之后,会发现在$ELEPHANT_BIRD_HOME/build目录下发现elephant-bird-xxx.jar以及lib/compile目录,等下需要用到.
       4.使用 

             1)所需要的proto文件

               我这里直接拷贝Protocol Buffer的样例:address_book.proto,代码如下:    

 

 package com.twitter.data.proto.tutorial;
// The sample protocol buffer file that Google uses in their examples at 
// http://code.google.com/p/protobuf. 
// Used in this project for tests and examples.
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; 
} 

      也可以从$ELEPHANT_BIRD_HOME/examples/src/proto/下获取address_book.proto


    2)新建build.xml,代码如下:  

     

<project name="elephant-bird-study" basedir= "." default="generate-protobuf" >
      <property name="src.dir" location="src" /> 
      <property name="src.java.dir" location="${src.dir}/java" /> 
      <property name="src.proto.dir" location="${src.dir}/proto" /> 
      <property name="src.gen.java.dir" location="${src.dir}/gen-java" />

     <target name="generate-protobuf" > 
           <delete dir="${src.gen.java.dir}"/> 
           <mkdir dir="${src.gen.java.dir}"/> 
           <apply executable="protoc" failonerror="true" skipemptyfilesets="true" verbose="true">                                    
           <arg value="--proto_path=${src.proto.dir}" />    
            <arg value="--java_out=${src.gen.java.dir}" />   
            <arg value="--test_out=${src.gen.java.dir}" />    
            <fileset dir="${src.proto.dir}" includes="**/*.proto" /> 
         </apply>
    </target>
</project>

  
        3)通过ant脚本生成address_book.proto对应的代码:

 

           ant generate-protobuf    

           如果不出意外,可以在你工程目录下的src/gen-java看到生成的代码:com.twitter.data.proto.tutorial.AddressBookProtos.java.

 

        4)以上只是通过Protocol Buffer生成了Java,但对应Hadoop的Writable,Pig的LoadFunc还没生成,这里还要使用protoc命令,由protoc去调用一个脚本去生成这些代码.具体如下: 

           i.需要的东西:    

             a)各种jar:

                     elephant-bird-2.1.8.jar,guava-10.0.1.jar,hadoop-core-0.20.2-cdh3u0.jar,hadoop-lzo-0.4.15.jar,protobuf-java-2.3.0.jar,yamlbeans-0.9.3.jar,这些自己下载获取从$ELEPHANT_BIRD_HOME/build/lib/compile或$ELEPHANT_BIRD_HOME/lib下获取 

            b)需要运行elephant-bird脚本,我这里放在$YOUR_PROJECT_HOME/script目录下 

        ii.步骤: 

             a)将以上需要的jar放到你的工程目录下的lib目录中    

             b)更改build.xml,如下:      

<project name="elephant-bird-study" basedir= "." default="generate-protobuf" >
         <property name="src.dir" location="src" />
         <property name="src.java.dir" location="${src.dir}/java" /> 
         <property name="src.proto.dir" location="${src.dir}/proto" /> 
         <property name="src.gen.java.dir" location="${src.dir}/gen-java" />

         <target name="generate-protobuf" > 
               <delete dir="${src.gen.java.dir}"/> 
               <mkdir dir="${src.gen.java.dir}"/> 
               <apply executable="protoc" failonerror="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}" /> 
                   <arg value="--twadoop_out=${src.gen.java.dir}" /> 
                   <fileset dir="${src.proto.dir}" includes="**/*.proto" /> 
              </apply> 
       </target>
</project>

 

           增加了<env key="PATH" path="${env.PATH}:${basedir}/script" />,表示将刚才新建的$YOUR_PROJECT_HOME/script下的文件放入path中     

         增加了参数<arg value="--twadoop_out=${src.gen.java.dir}" />,这里elephant-bird有个奇怪的规则,参数名为--twadoop_out,其中twadoop存在规则,他将跟protoc-gen-组成protoc-gen-twadoop做为Protocol Buffer调用elephant-bird的脚本文件名.   

           c)在$YOUR_PROJECT_HOME/script目录下新建脚本protoc-gen-twadoop,内容如下:    

#!/bin/bash
bindir=`/usr/bin/dirname "$0"` 
/usr/bin/java -cp $bindir/../lib/*: com.twitter.elephantbird.proto.HadoopProtoCodeGenerator $bindir/config-twadoop.yml -

         以上会将刚拷贝到$YOUR_PROJECT_HOME/lib下的所有jar由java执行,然后会调用com.twitter.elephantbird.proto.HadoopProtoCodeGenerator类去生成所需要的各种代码.想要什么代码,则由config-twadoop.yml配置 

 

       d)注意protoc-gen-twadoop中有config-twadoop.yml,该文件配置elephant-bird想生成代码.文件内容如下:    

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.LzoProtobufB64LinePigLoaderGenerator  
- com.twitter.elephantbird.proto.codegen.LzoProtobufBlockInputFormatGenerator  
- com.twitter.elephantbird.proto.codegen.LzoProtobufBlockOutputFormatGenerator
#  - com.twitter.elephantbird.proto.codegen.LzoProtobufBlockPigLoaderGenerator
# - com.twitter.elephantbird.proto.codegen.LzoProtobufHiveSerdeGenerator    
- com.twitter.elephantbird.proto.codegen.ProtobufWritableGenerator
# - com.twitter.elephantbird.proto.codegen.ProtobufBytesToPigTupleGenerator 

     我这里不想生成pig和hive的代码,所以在前面加了个#注释了.


    e)生成代码,再次运行ant generate-protobuf,不出意外的话,YOUR_PROJECT_HOME/src/gen-java就会生成所需要的代码.

 

     注:本博客基于Elephantbird2.1.8

    在github上建了一个开源工程,可以运行ant命令基于elephantbird直接生成代码.地址:

       https://github.com/guoyunsky/elephant-bird-simple

 

更多技术文章、感悟、分享、勾搭,请用微信扫描:

1
1
分享到:
评论

相关推荐

    通信电源蓄电池组容量性充放电试验三措一案.docx

    5G通信行业、网络优化、通信工程建设资料。

    铁塔维护检测手段.docx

    5G通信行业、网络优化、通信工程建设资料

    通信设备安装施工组织方案.doc

    5G通信、网络优化与通信建设

    299-教育行业信息化与数据平台建设分享.pptx

    299-教育行业信息化与数据平台建设分享.pptx

    手写数字和字母数据集binaryalphadigs.mat

    手写数字和字母数据集binaryalphadigs.mat

    变电站视频监控解决方案.doc

    5G通信行业、网络优化、通信工程建设资料

    PEMFC电堆输出电压模型,可计算效率、输出功率、电流、消耗功率以及等效内阻

    PEMFC电堆输出电压模型,可计算效率、输出功率、电流、消耗功率以及等效内阻

    创建型 结构型 设计型设计模式相关知识

    1、 设计思路 1、 创建型设计模式 创建型设计模式主要“关注对象的创建”。 1. 单例模式 单例模式:能不用就不用 ,他的目的就是为了让一个类只创建一个实例。 用法:把对象的创建权限关闭,提供一个人公开的静态方法,实现静态方法后将实例存放于静态的字段中,方法中返回。 单例模式会长期持有一个对象不会被释放,而普通实例不用就会被释放(当然必须是GC之后才会被释放)。 单例用途;数据临时存储的地方如静态字典,数据库连接池、线程池、IOC容器实例。   1.1懒汉式 设置构造函数为私有的,避免其他外部类可以对其实例化, 创建静态类来存储实例。 在静态方法中创建实例,避免多个线程同时调用方法,我们可以加线程锁, 在方法中使用双判断语句:最外层判断是为了提高运行速率,检查如果静态字段中已经存在实例了就可以直接return;第二层判断是避免创建多个对象实例。 1.2饿汉式1 静态构造函数:由CLR保证,静态构造函数只会在启动程序时候,由CLR自行创建。并且只会创建一次,相比较于懒汉式创建的更早,并且不需要担心会

    《通信工程概预算》模拟试题2.docx

    5G通信行业、网络优化、通信工程建设资料

    毕业设计:Java项目之jsp高校规章制度管理系统(源码 + 数据库 + 说明文档)

    论文目录: 第二章 需求分析与系统总体设计 - 5 - 2.1java的特点 - 5 - 2.2技术可行性 - 5 - 2.3可靠性和安全性特点 - 6 - 2.4系统总体设计 - 6 - 2.5JSP技术介绍 - 7 - 2.5.1 什么是JSP - 7 - 2.5.2 JSP技术特点 - 7 - 2.5.3 JSP开发WEB的几种方式 - 8 - 第三章 数据库的设计与实现 - 9 - 3.1数据库的需求分析 - 9 - 3.2数据库的逻辑设计 - 10 - 3.3 数据库的结构创建 - 10 - 第四章 后台系统和数据库的配置 - 13 - 4.1后台服务器配置 - 13 - 4.2后台数据库的配置 - 13 - 4.3后台全局配置文件 - 13 - 第五章 前端网络页面的开发与设计 - 14 - 5.1登录页面 - 14 - 5.2 管理员用户页面 - 15 - 5.3 注册用户页面 - 16 - 5.4主页面 - 17 - 5.5用户注册页面 - 18 - 5.6 规章制度管理页面 - 18 - 第六章 系统的安全性 - 19 - 6.1 session和cookie的安

    ONU、分光器验收规范.doc

    5G通信行业、网络优化、通信工程建设资料。

    99-煤矿安全生产标准化基本要求及评分方法.pdf

    99-煤矿安全生产标准化基本要求及评分方法.pdf

    node-v12.22.6-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    475现场通讯器用户手册

    475现场通讯器用户手册

    node-v7.7.0.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    600A钳形电流表使用手册

    600A钳形电流表使用手册

    常见宏基站认识和设计讲解.pptx

    5G通信、网络优化与通信建设

    node-v12.16.3-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    数据中心机房供电需求分析.pptx

    5G通信、网络优化与通信建设

    Binomial Self-compensation

    Binomial Self-compensation for Motion Error in Dynamic 3D Scanning

Global site tag (gtag.js) - Google Analytics