来自:http://blog.csdn.net/iam333/article/details/18770977

最近由于业务需要,需要将flume的数据插入HBase-0.96,利用flume的实时日志收集,实现数据的实时存储。正如前文所 述,flume-ng即flume-1.4.0版本和hbase-0.96结合相对比较容易配置,只需要做一些相关配置,实现自己的 HbaseEventSerializer类,重新编译flume-ng-hbase-sink部分源码并打包即可。但是因为公司以前业务的日志收集使用 的flume不是flume-1.4.0版本,而是flume-0.9.4,所以为了保证对原来代码的兼容性,就需要实现flume-0.9.4与 HBase-0.96结合。经过两天的研究,和同事实现了这个功能,鉴于网上目前还缺少这样的资料,也为了后来人不再踩我们踩过的坑,所以写篇文章记录一 下。

1)编译flume-0.9.4源码

首先,需要下载flume-0.9.4的源代码。下载地址:https://repository.cloudera.com/content /repositories/releases/com/cloudera/flume-distribution/0.9.4-cdh4.0.0/

下载好以后,执行如下命令:

  1. $ unzip flume-distribution-0.9.4-cdh4.0.0-project.zip
  2. $ cd flume-0.9.4-cdh4.0.0/
  3. $ mvn package-DskipTests

如果你没有安装thrift,或者安装了未修改pom.xml中的thrift配置,此时会显示编译失败,错误提示如下:

  1. [ERROR] Failed to execute goal org.apache.thrift.tools:maven-thrift-plugin:
  2. 0.1.10:compile (default) on project flume-core: thrift did not exit cleanly.
  3. Review output for more information. -> [Help 1]

此时需要安装thrift,并且修改pom.xml文件中的thrift配置,原来的配置如下:

  1. <plugin>
  2. <groupId>org.apache.thrift.tools</groupId>
  3. <artifactId>maven-thrift-plugin</artifactId>
  4. <version>0.1.10</version>
  5. <configuration>
  6. <thriftExecutable>${thrift.executable}</thriftExecutable>
  7. </configuration>
  8. <executions>
  9. <execution>
  10. <goals>
  11. <goal>compile</goal>
  12. <goal>testCompile</goal>
  13. </goals>
  14. </execution>
  15. </executions>
  16. </plugin>

此时,需要安装thrift,安装可参考《ubuntu 12.04中安装thrift-0.9.1》,安装好之后,对上面的配置修改如下:(注:/usr/local/bin/thrift是我thrift的安装目录)

  1. <thriftExecutable>/usr/local/bin/thrift</thriftExecutable>

配置好后,运行上面的maven编译命令,还会出现一个错误:

  1. [ERROR] Failed to execute goal org.apache.maven.plugins:
  2. maven-compiler-plugin:2.3.2:compile (default-compile) on project flume-core:
  3. Compilation failure: Compilation failure:

这是因为pom.xml里面的libthrift版本不对,做如下修改即可:

  1. <dependency>
  2. <groupid>org.apache.thrift</groupid>
  3. <artifactid>libthrift</artifactid>
  4. <version>0.9.1</version>
  5. </dependency>

继续编译打包,还是会出错,错误如下:

  1. [ERROR] Failed to execute goal on project flume-config-web: Could not resolve
  2. dependencies for project com.cloudera:flume-config-web:war:0.9.4-cdh4.0.0:
  3. Failure to find org.apache.hadoop:hadoop-core:jar:0.20.2-cdh3u3-SNAPSHOT in
  4. https://repository.cloudera.com/content/groups/public/ was cached in the local
  5. repository, resolution will not be reattempted until the update interval of
  6. com.cloudera.repository.releases has elapsed or updates are forced -> [Help 1]

很明显,还是因为包找不到,做如下修改即可:

  1. <dependency>
  2. <groupId>org.apache.hadoop</groupId>
  3. <artifactId>hadoop-core</artifactId>
  4. <version>0.20.2-cdh3u3</version>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>com.cloudera.cdh</groupId>
  8. <artifactId>hadoop-ant</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>

这次再运行打包编译命令,就可以看到如下的成功信息了:

  1. [INFO] Flume ............................................. SUCCESS [0.003s]
  2. [INFO] Flume Core ........................................ SUCCESS [12.344s]
  3. [INFO] Flume Master Config Web Application ............... SUCCESS [3.243s]
  4. [INFO] Flume Node Web .................................... SUCCESS [0.885s]
  5. [INFO] Flume Distribution Project ........................ SUCCESS [25.381s]
  6. [INFO] A log4j appender for Flume ........................ SUCCESS [0.251s]
  7. [INFO] Flume Hello World Plugin .......................... SUCCESS [0.133s]
  8. [INFO] Flume HBase Plugin ................................ SUCCESS [20:42.199s]
  9. [INFO] ------------------------------------------------------------------------
  10. [INFO] BUILD SUCCESS
  11. [INFO] ------------------------------------------------------------------------

2、在第一步编译成功的基础上继续修改pom.xml文件。因为flume-0.9.4里面使用的hadoop-core,还是0.20版本,是不能直接连接hbase-0.96的,所以需要将上面的hadoop-core的依赖用下面的内容替换:

  1. <dependency>
  2. <groupId>org.apache.hadoop</groupId>
  3. <artifactId>hadoop-mapreduce-client-core</artifactId>
  4. <version>2.2.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.hadoop</groupId>
  8. <artifactId>hadoop-common</artifactId>
  9. <version>2.2.0</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.apache.hadoop</groupId>
  13. <artifactId>hadoop-mapreduce-client-common</artifactId>
  14. <version>2.2.0</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.apache.hadoop</groupId>
  18. <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
  19. <version>2.2.0</version>
  20. </dependency>

除此之外,还需要flume-core目录底下的pom.xml文件,将hadoop-core的依赖也修改为上面的内容。由于guava也太早,所以将guava的依赖也用下面的内容替换:

  1. <dependency>
  2. <groupId>com.google.guava</groupId>
  3. <artifactId>guava</artifactId>
  4. <version>10.0.1</version>
  5. </dependency>

为了保证能插入数据到hbase-0.96里面,还需要替换flume源文件夹下的plugins/flume-plugin-hbasesink里面的hbase依赖,

将下面的内容:

  1. <dependency>
  2. <groupId>org.apache.hbase</groupId>
  3. <artifactId>hbase</artifactId>
  4. <version>${cdh.hbase.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.hbase</groupId>
  8. <artifactId>hbase</artifactId>
  9. <version>${cdh.hbase.version}</version>
  10. <classifier>tests</classifier>
  11. <scope>test</scope>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.apache.hadoop</groupId>
  15. <artifactId>hadoop-test</artifactId>
  16. <version>${cdh.hadoop.version}</version>
  17. <scope>test</scope>
  18. </dependency>

替换为:

  1. <dependency>
  2. <groupId>org.apache.hbase</groupId>
  3. <artifactId>hbase-it</artifactId>
  4. <version>0.96.0-hadoop2</version>
  5. </dependency>

(注:由于本文的maven仓库使用的是公司maven仓库,如果在编译过程中找不到上述包,可以修改flume源码目录下的pom.xml文件中的<repository>部分,加上apache hadoop和hbase的官方maven仓库地址)

3、修改flume-0.9.4的flume-core里面的java源码部分,主要修改的内容为 FlushingSequenceFileWriter.java、RawSequenceFileWriter.java和 SequenceFileOutputFormat.java,使用新版本的hadoop-2.2.0中的相应方法修改。(如果不知道如何修改,可以联系 我。)

至此,重新运行maven的编译打包命令,如果出现第一步最后的成功信息,证明修改成功。

4、修改flume启动脚本。仔细分析${FLUME_HOME}/bin/flume会发现,该文件里面有很长一段是加载旧版本的hadoop依赖包,所以应该将其注释掉。并将该部分替换为:

CLASSPATH="hadoop的lib包路径,hbase的lib包路径“。

5、整合hbase-0.96。

在flume-src\plugins\flume-plugin-hbasesink\src\main\java里面的添加自己的类。如果需要 和Hbase整合,必须继承EventSink.Base类,重写里面的方法(可以参照flume-src\plugins\flume-plugin- hbasesink\src\main\java\com\cloudera\flume\hbase \Attr2HBaseEventSink.java),写完之后需要重新编译flume-src\plugins\flume-plugin- hbasesink底下的类,打包成jar文件。

6、如何配Hbase sink。

(1)在Flume master机器上修改${FLUME_HOME}/conf/flume-site.xml文件:

  1. <property>
  2. <name>flume.plugin.classes</name>
  3. <value>com.cloudera.flume.hbase.HBaseSink,com.cloudera.flume.hbase.Attr2HBaseEventSink,test.flume.hbase.MyHBaseSink</value>
  4. </property>

(注,其中MyHBaseSink是自定义的Sink类)

(2)修改${FLUME_HOME}/bin/flume-env.sh

  1. export FLUME_CLASSPATH=/home/q/flume-0.9.4-cdh3u3/plugins/flume-plugin-hbasesink-0.9.4-cdh3u3.jar

其中的flume-plugin-hbasesink-0.9.4-cdh3u3.jar包就是步骤5中打包好的jar文件。

(3)重启Flume master、agent等,这样你就可以在master:35871/masterext.jsp中的Sinks表里面看到你自己的Hbase sink。
(4)将collector中的sink那项配置成自定义的sink即可.

Flume-0.9.4数据插入HBase-0.96的更多相关文章

  1. Hbase 0.95.2介绍及下载地址

    HBase是一个分布式的.面向列的开源数据库,该技术来源于Google论文“Bigtable:一个结构化数据的分布式存储系统”.就像Bigtable利用了Google文件系统(File System) ...

  2. json数据写入hbase

    package main.scala.com.web.zhangyong168.cn.spark.java; import org.apache.hadoop.hbase.HBaseConfigura ...

  3. Hbase 0.92.1集群数据迁移到新集群

    老集群 hbase(main):001:0> status 4 servers, 0 dead, 0.0000 average load hbase(main):002:0> list T ...

  4. 大数据应用之HBase数据插入性能优化之多线程并行插入测试案例

    一.引言: 上篇文章提起关于HBase插入性能优化设计到的五个参数,从参数配置的角度给大家提供了一个性能测试环境的实验代码.根据网友的反馈,基于单线程的模式实现的数据插入毕竟有限.通过个人实测,在我的 ...

  5. 大数据应用之HBase数据插入性能优化实测教程

    引言: 大家在使用HBase的过程中,总是面临性能优化的问题,本文从HBase客户端参数设置的角度,研究HBase客户端数据批量插入性能优化的问题.事实胜于雄辩,数据比理论更有说服力,基于此,作者设计 ...

  6. 最简大数据Spark-2.1.0

    0.0 前言 本文主要基于最新的Spark 2.1.0版本.阅读本文可以对Spark 2.1.0的学习过程,运行流程,关键组件,原理有所了解.文章有点长,你也可以直接阅读感兴趣的部分,但是还是建议全面 ...

  7. Hbase 0.92.1 Replication

    原集群 服务器名称 服务 sht-sgmhadoopnn-01 Master,NameNode,JobTracker sht-sgmhadoopdn-01 RegionServer,DataNode, ...

  8. Hbase 0.98集群搭建的详细步骤

    准备工作 Hbase的搭建是依赖于Hadoop的,Hbase的数据文件实际上存储在HDFS文件系统中,所以我们需要先搭建hadoop环境,之前的博文中已经搭建过了(详见http://www.cnblo ...

  9. hbase 0.98.1集群安装

    本文将基于hbase 0.98.1解说其在linux集群上的安装方法,并对一些重要的设置项进行解释,本文原文链接:http://blog.csdn.net/bluishglc/article/deta ...

  10. 【转】Apache Kylin 2.0为大数据带来交互式的BI

    本文转载自:[技术帖]Apache Kylin 2.0为大数据带来交互式的BI 编者注:Kyligence的联合创始人兼CEO Luke Han在上做题为“”的演讲. 基于Hadoop的SQL一直在被 ...

随机推荐

  1. Xcode 小技巧

    1.手动添加 #warning ,在不确定的 bug.错误.待定代码处,手动添加 #warning 行,在编译时间提醒自己需要处理的地方. 2.由于 arrayWithObjects: 和 initW ...

  2. js跨域请求提示函数未定义的问题

    我的代码是这么写的 window.onload=function(){ function sendRequest(){ var script=document.getElementById(" ...

  3. JS简单实现二级联动菜单

    <form method="post" action=""> 省/市:<select id="province" onch ...

  4. 自定义MVC视图引擎ViewEngine 创建Model的专属视图

    MVC内置的视图引擎有WebForm view engine和Razor view engine,当然也可以自定义视图引擎ViewEngine.本文想针对某个Model,自定义该Model的专属视图. ...

  5. matlab进行地图仪的绘制

    % 绘制地球仪,并标出我们的位置 cla reset; load topo; [x,y,z] = sphere();%45是画出来的球面的经纬分面数 s = surface(x,y,z,'FaceCo ...

  6. Extjs DateField onchange

    1 开发思路: 在日期值变化的事件中获得选择后的日期值,传给后台,然后从后台加载相应的数据 2 问题:在查看extjs2.2 的api的官方说明文档,文档对datefield组件的change事件说明 ...

  7. 摘自知乎--mysql

    允许晚辈叫一声前辈.从前辈的描述中可以看出前辈对MySQL已经有很好的理解,但我还是想从我这个半知半解的晚辈角度提出几点. 1.系统学习数据库,最要紧的是把基本功打牢,所以<数据库系统概念 原书 ...

  8. 使用 NSPropertyListSerialization 持久化字典与数组

    NSPropertyListSerialization The NSPropertyListSerialization class provides methods that convert prop ...

  9. Coursera课程《大家的python》(Python for everyone)课件

    You can access the Google Drive containing all of the current and in-progress lecture slides for thi ...

  10. VS2010+OpenCV2.4.3配置

    VS2010+OpenCV2.4.3配置:  环境变量path: D:\openCV2.4.3\opencv\build\x86\vc10\bin  项目-属性-VC++目录:(vs2008中,工具- ...