首页 > Flume-0.9.4数据插入HBase-0.96

Flume-0.9.4数据插入HBase-0.96

junitjunit4.10org.spring

-->

来自: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.toolsgroupId>  
  3.     <artifactId>maven-thrift-pluginartifactId>  
  4.     <version>0.1.10version>  
  5.     <configuration>  
  6.       <thriftExecutable>${thrift.executable}thriftExecutable>  
  7.     configuration>  
  8.     <executions>  
  9.       <execution>  
  10.         <goals>  
  11.           <goal>compilegoal>  
  12.           <goal>testCompilegoal>  
  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/thriftthriftExecutable>  

配置好后,运行上面的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.thriftgroupid>  
  3.         <artifactid>libthriftartifactid>  
  4.         <version>0.9.1version>  
  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.hadoopgroupId>  
  3.         <artifactId>hadoop-coreartifactId>  
  4.         <version>0.20.2-cdh3u3version>  
  5.         <exclusions>  
  6.           <exclusion>  
  7.             <groupId>com.cloudera.cdhgroupId>  
  8.             <artifactId>hadoop-antartifactId>  
  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.hadoopgroupId>  
  3.             <artifactId>hadoop-mapreduce-client-coreartifactId>  
  4.             <version>2.2.0version>  
  5.         dependency>  
  6.         <dependency>  
  7.             <groupId>org.apache.hadoopgroupId>  
  8.             <artifactId>hadoop-commonartifactId>  
  9.             <version>2.2.0version>  
  10.         dependency>  
  11.         <dependency>  
  12.             <groupId>org.apache.hadoopgroupId>  
  13.             <artifactId>hadoop-mapreduce-client-commonartifactId>  
  14.             <version>2.2.0version>  
  15.         dependency>  
  16.         <dependency>  
  17.             <groupId>org.apache.hadoopgroupId>  
  18.             <artifactId>hadoop-mapreduce-client-jobclientartifactId>  
  19.             <version>2.2.0version>  
  20.         dependency>  

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

  1. <dependency>  
  2.   <groupId>com.google.guavagroupId>  
  3.   <artifactId>guavaartifactId>  
  4.   <version>10.0.1version>  
  5. dependency>  

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

将下面的内容:

  1. <dependency>  
  2.       <groupId>org.apache.hbasegroupId>  
  3.       <artifactId>hbaseartifactId>  
  4.       <version>${cdh.hbase.version}version>  
  5.     dependency>  
  6.   
  7.     <dependency>  
  8.       <groupId>org.apache.hbasegroupId>  
  9.       <artifactId>hbaseartifactId>  
  10.       <version>${cdh.hbase.version}version>  
  11.       <classifier>testsclassifier>  
  12.       <scope>testscope>  
  13.     dependency>  
  14.   
  15.     <dependency>  
  16.       <groupId>org.apache.hadoopgroupId>  
  17.       <artifactId>hadoop-testartifactId>  
  18.       <version>${cdh.hadoop.version}version>  
  19.       <scope>testscope>  
  20.     dependency>  

替换为:

  1. <dependency>  
  2.     <groupId>org.apache.hbasegroupId>  
  3.     <artifactId>hbase-itartifactId>  
  4.     <version>0.96.0-hadoop2version>  
  5. dependency>  

(注:由于本文的maven仓库使用的是公司maven仓库,如果在编译过程中找不到上述包,可以修改flume源码目录下的pom.xml文件中的部分,加上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-srcpluginsflume-plugin-hbasesinksrcmainjava里面的添加自己的类。如果需要 和Hbase整合,必须继承EventSink.Base类,重写里面的方法(可以参照flume-srcpluginsflume-plugin- hbasesinksrcmainjavacomclouderaflumehbase Attr2HBaseEventSink.java),写完之后需要重新编译flume-srcpluginsflume-plugin- hbasesink底下的类,打包成jar文件。

6、如何配Hbase sink。

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

  1. <property>  
  2.     <name>flume.plugin.classesname>  
  3.     <value>com.cloudera.flume.hbase.HBaseSink,com.cloudera.flume.hbase.Attr2HBaseEventSink,test.flume.hbase.MyHBaseSinkvalue>  
  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即可.

转载于:https://www.cnblogs.com/sunxucool/p/3630099.html

更多相关:

  • 环境:Cmake3.10+OpenCV2.4.13.5+CUDA9.2 Problem CMake Warning at cmake/OpenCVPackaging.cmake:23 (message):CPACK_PACKAGE_VERSION does not match version provided by version...

  • 文章目录Step 1:glibc-2.17 被libc.so.6库依赖,升级glibc库Step2:升级编译器-->4.8.2可以正常编译glibc2.17Step3:修改ELF,降低ceph-mon依赖的库函数版本解决ceph-mon调用高版本libc库(修改动态库链接表ELF) Step 1:glibc-2.17 被lib...

  • Qt程序版本号使用 在pro文件中添加(版本号可以3段或者4段) VERSION=1.0.1.2DEFINES += APP_VERSION=\"$${VERSION}\" 实际代码中使用 QString version = APP_VERSION;qInfo()<<"版本信息:"<< version;...

  • 一:概述SSM框架在项目开发中经常使用到,相比于SSH框架,它在仅几年的开发中运用的更加广泛。 Spring作为一个轻量级的框架,有很多的拓展功能,最主要的我们一般项目使用的就是IOC和AOP。SpringMVC是Spring实现的一个Web层,相当于Struts的框架,但是比Struts更加灵活和强大!Mybatis是 一个持久层...

  • AppDomain.CurrentDomain.ApplicationIdentity.CodeBase   获取作为URL的部署清单的位置 Eg:发布前地址为E:PROJECTWORKLandaV8inDebugxxxxx.xbap(xxxxx.xbap为部署站点下的文件),部署后获取的地址为http://192.168...

  •   1  启动Consul 2  创建springcloud-consul项目及三个子模块        2.1 数据模块consul-producer        2.2 数据消费模块consul-consumer        2.3 gateway网关模块 3  测试及项目下载    1、首先安装Consul并启动Consu...

  • 参考自: http://how2j.cn/k/search-engine/search-engine-springboot/1791.html?p=78908 工具版本: elasticsearch 6.2.2、 kibana 6.2.2,  下载地址: elasticsearch、kibana 下载demo 1、kotlin版sp...

  • junitjunit4.10org.spring...