Flume-0.9.4数据插入HBase-0.96

22 篇文章 12 订阅
3 篇文章 0 订阅

最近由于业务需要,需要将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/

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

$ unzip flume-distribution-0.9.4-cdh4.0.0-project.zip
$ cd flume-0.9.4-cdh4.0.0/
$ mvn package-DskipTests
如果你没有安装thrift,或者安装了未修改pom.xml中的thrift配置,此时会显示编译失败,错误提示如下:

[ERROR] Failed to execute goal org.apache.thrift.tools:maven-thrift-plugin:
0.1.10:compile (default) on project flume-core: thrift did not exit cleanly. 
Review output for more information. -> [Help 1]
此时需要安装thrift,并且修改pom.xml文件中的thrift配置,原来的配置如下:

<plugin>
    <groupId>org.apache.thrift.tools</groupId>
    <artifactId>maven-thrift-plugin</artifactId>
    <version>0.1.10</version>
    <configuration>
      <thriftExecutable>${thrift.executable}</thriftExecutable>
    </configuration>
    <executions>
      <execution>
        <goals>
          <goal>compile</goal>
          <goal>testCompile</goal>
        </goals>
      </execution>
    </executions>
</plugin>
此时,需要安装thrift,安装可参考 《ubuntu 12.04中安装thrift-0.9.1》,安装好之后,对上面的配置修改如下:(注:/usr/local/bin/thrift是我thrift的安装目录)
<thriftExecutable>/usr/local/bin/thrift</thriftExecutable>
配置好后,运行上面的maven编译命令,还会出现一个错误:

[ERROR] Failed to execute goal org.apache.maven.plugins:
maven-compiler-plugin:2.3.2:compile (default-compile) on project flume-core: 
Compilation failure: Compilation failure:
这是因为pom.xml里面的libthrift版本不对,做如下修改即可:
<dependency>
        <groupid>org.apache.thrift</groupid>
        <artifactid>libthrift</artifactid>
        <version>0.9.1</version>
</dependency>
继续编译打包,还是会出错,错误如下:

[ERROR] Failed to execute goal on project flume-config-web: Could not resolve 
dependencies for project com.cloudera:flume-config-web:war:0.9.4-cdh4.0.0: 
Failure to find org.apache.hadoop:hadoop-core:jar:0.20.2-cdh3u3-SNAPSHOT in
https://repository.cloudera.com/content/groups/public/ was cached in the local 
repository, resolution will not be reattempted until the update interval of 
com.cloudera.repository.releases has elapsed or updates are forced -> [Help 1]
很明显,还是因为包找不到,做如下修改即可:

<dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-core</artifactId>
        <version>0.20.2-cdh3u3</version>
        <exclusions>
          <exclusion>
            <groupId>com.cloudera.cdh</groupId>
            <artifactId>hadoop-ant</artifactId>
          </exclusion>
        </exclusions>
</dependency>
这次再运行打包编译命令,就可以看到如下的成功信息了:

[INFO] Flume ............................................. SUCCESS [0.003s]
[INFO] Flume Core ........................................ SUCCESS [12.344s]
[INFO] Flume Master Config Web Application ............... SUCCESS [3.243s]
[INFO] Flume Node Web .................................... SUCCESS [0.885s]
[INFO] Flume Distribution Project ........................ SUCCESS [25.381s]
[INFO] A log4j appender for Flume ........................ SUCCESS [0.251s]
[INFO] Flume Hello World Plugin .......................... SUCCESS [0.133s]
[INFO] Flume HBase Plugin ................................ SUCCESS [20:42.199s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
2、在第一步编译成功的基础上继续修改pom.xml文件。因为flume-0.9.4里面使用的hadoop-core,还是0.20版本,是不能直接连接hbase-0.96的,所以需要将上面的hadoop-core的依赖用下面的内容替换:

<dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-core</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-common</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
            <version>2.2.0</version>
        </dependency>
除此之外,还需要flume-core目录底下的pom.xml文件,将hadoop-core的依赖也修改为上面的内容。由于guava也太早,所以将guava的依赖也用下面的内容替换:

      <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>10.0.1</version>
      </dependency>
为了保证能插入数据到hbase-0.96里面,还需要替换flume源文件夹下的plugins/flume-plugin-hbasesink里面的hbase依赖,

将下面的内容:

<dependency>
      <groupId>org.apache.hbase</groupId>
      <artifactId>hbase</artifactId>
      <version>${cdh.hbase.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hbase</groupId>
      <artifactId>hbase</artifactId>
      <version>${cdh.hbase.version}</version>
      <classifier>tests</classifier>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-test</artifactId>
      <version>${cdh.hadoop.version}</version>
      <scope>test</scope>
    </dependency>
替换为:

      <dependency>
          <groupId>org.apache.hbase</groupId>
          <artifactId>hbase-it</artifactId>
          <version>0.96.0-hadoop2</version>
      </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文件:

<property>
    <name>flume.plugin.classes</name>
    <value>com.cloudera.flume.hbase.HBaseSink,com.cloudera.flume.hbase.Attr2HBaseEventSink,test.flume.hbase.MyHBaseSink</value>
</property>
(注,其中MyHBaseSink是自定义的Sink类)

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

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即可.

转载请注明出处:http://blog.csdn.net/iAm333

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值