Flume-0.9.4和Hbase-0.96整合实践

2024-05-03 23:32
文章标签 实践 整合 0.9 flume hbase 0.96

本文主要是介绍Flume-0.9.4和Hbase-0.96整合实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导读: 
Flume-1.4.0和Hbase-0.96.0整合还是比较简单的,那么Flume-0.9.4和Hbase-0.96整合比Flume-1.4.0和Hbase-0.96整合麻烦多了!不是随便几个配置就能搞定的,里面涉及到修改Flume和Hadoop的源码。

此篇,可以作为学习篇,不建议做如此复杂的配置。建议参考Flume-1.4.0和Hbase-0.96.0整合实践

1、修改Flume-src根目录下的pom.xml文件中的部分依赖版本

(1)、Hadoop2x里面已经没有hadoop-core jar包,所以修改Hadoop的依赖包的版本:

  1. <dependency>
  2.         <groupId>org.apache.hadoop</groupId>
  3.         <artifactId>hadoop-core</artifactId>
  4.         <version>${cdh.hadoop.version}</version>
  5. </dependency>

  6. 修改为

  7. <dependency>
  8.             <groupId>org.apache.hadoop</groupId>
  9.             <artifactId>hadoop-mapreduce-client-core</artifactId>
  10.             <version>2.2.0</version>
  11. </dependency>
  12. <dependency>
  13.             <groupId>org.apache.hadoop</groupId>
  14.             <artifactId>hadoop-common</artifactId>
  15.             <version>2.2.0</version>
  16. </dependency>
  17. <dependency>
  18.             <groupId>org.apache.hadoop</groupId>
  19.             <artifactId>hadoop-mapreduce-client-common</artifactId>
  20.             <version>2.2.0</version>
  21. </dependency>
  22. <dependency>
  23.             <groupId>org.apache.hadoop</groupId>
  24.             <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
  25.             <version>2.2.0</version>
  26. </dependency>
复制代码


(2)、修改Guava的版本
  1. <dependency>
  2.         <groupId>com.google.guava</groupId>
  3.         <artifactId>guava</artifactId>
  4.         <version>r07</version>
  5. </dependency>

  6. 修改为

  7. <dependency>
  8.         <groupId>com.google.guava</groupId>
  9.         <artifactId>guava</artifactId>
  10.         <version>10.0.1</version>
  11. </dependency>
复制代码


(3)、修改flume-src\flume-core\pom.xml里面的以下配置
  1. <dependency>
  2.       <groupId>org.apache.hadoop</groupId>
  3.       <artifactId>hadoop-core</artifactId>
  4. </dependency>

  5. 修改为

  6. <dependency>
  7.             <groupId>org.apache.hadoop</groupId>
  8.             <artifactId>hadoop-mapreduce-client-core</artifactId>
  9.             <version>2.2.0</version>
  10. </dependency>
  11. <dependency>
  12.             <groupId>org.apache.hadoop</groupId>
  13.             <artifactId>hadoop-common</artifactId>
  14.             <version>2.2.0</version>
  15. </dependency>
  16. <dependency>
  17.             <groupId>org.apache.hadoop</groupId>
  18.             <artifactId>hadoop-mapreduce-client-common</artifactId>
  19.             <version>2.2.0</version>
  20. </dependency>
  21. <dependency>
  22.             <groupId>org.apache.hadoop</groupId>
  23.             <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
  24.             <version>2.2.0</version>
  25. </dependency>
复制代码


(4)、修改flume-src\plugins\flume-plugin-hbasesink\pom.xml里面的以下配置



  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>

  19. 修改为

  20. <dependency>
  21.           <groupId>org.apache.hbase</groupId>
  22.           <artifactId>hbase-it</artifactId>
  23.           <version>0.96.0-hadoop2</version>
  24. </dependency>
复制代码

 2、修改flume-core\src\main\java\org\apache\hadoop\io\FlushingSequenceFileWriter.java和RawSequenceFileWriter.java两个java类
  因为在步骤一中我们用新版本的Hadoop替换了旧版本的Hadoop,而新版本Hadoop中的org.apache.hadoop.io.SequenceFile.Writer类和旧版本的org.apache.hadoop.io.SequenceFile.Writer类有些不一样。所以导致了FlushingSequenceFileWriter.java和RawSequenceFileWriter.java两个java类出现了部分的错误,解决方法如下:
  (1)、需要修改Hadoop-2.2.0源码中的hadoop-2.2.0-src\hadoop-common-project\hadoop-common\src\main\java\org\apache\hadoop\io\SequenceFile.java类,在Writer类里面添加默认的构造函数:

  1. Writer(){
  2.     this.compress = CompressionType.NONE;
  3. }
复制代码

然后重新编译hadoop-common-project工程,将编译后的hadoop-common-2.2.0.jar替换之前的hadoop-common-2.2.0.jar
  (2)、修改FlushingSequenceFileWriter.java和RawSequenceFileWriter.java
  这两个类中有错误,请用新版本Hadoop的相应API替换掉旧版本Hadoop的API,具体怎么修改,这就不不说了,如有需要的同学,可以邮件联系我( wyphao.2007@163.com
  (3)、修改com.cloudera.flume.handlers.seqfile中的SequenceFileOutputFormat类修改如下:

  1. this(SequenceFile.getCompressionType(FlumeConfiguration.get()),
  2.         new DefaultCodec());

  3. 修改为

  4. this(SequenceFile.getDefaultCompressionType(FlumeConfiguration.get()),
  5.               new DefaultCodec());

  6. CompressionType compressionType = SequenceFile.getCompressionType(conf);

  7. 修改为

  8. CompressionType compressionType = SequenceFile.getDefaultCompressionType(conf);
复制代码

3、重新编译Flume源码
  重新编译Flume源码(如何编译Flume源码?请参见本博客的《Flume-0.9.4源码编译及一些编译出错解决方法》),并用编译之后的flume-core-0.9.4-cdh3u3.jar替换${FLUME_HOME}/lib中的flume-core-0.9.4-cdh3u3.jar类。删掉${FLUME_HOME}/lib/hadoop-core-0.20.2-cdh3u3.jar等有关Hadoop旧版本的包。

4、修改${FLUME_HOME}/bin/flume启动脚本
仔细分析${FLUME_HOME}/bin/flume脚本,你会发现如下代码:

  1. # put hadoop conf dir in classpath to include Hadoop
  2. # core-site.xml/hdfs-site.xml
  3. if [ -n "${HADOOP_CONF_DIR}" ]; then
  4.      CLASSPATH="${CLASSPATH}:${HADOOP_CONF_DIR}"
  5. elif [ -n "${HADOOP_HOME}" ] ; then
  6.      CLASSPATH="${CLASSPATH}:${HADOOP_HOME}/conf"
  7. elif [ -e "/usr/lib/hadoop/conf" ] ; then
  8.      # if neither is present see if the CDH dir exists
  9.      CLASSPATH="${CLASSPATH}:/usr/lib/hadoop/conf";
  10.      HADOOP_HOME="/usr/lib/hadoop"
  11. fi  # otherwise give up

  12. # try to load the hadoop core jars
  13. HADOOP_CORE_FOUND=false
  14. while true; do
  15.      if [ -n "$HADOOP_HOME" ]; then
  16.          HADCOREJARS=`find ${HADOOP_HOME}/hadoop-core*.jar ||  \
  17.                find ${HADOOP_HOME}/lib/hadoop-core*.jar ||  true`
  18.          if [ -n "$HADCOREJARS" ]; then
  19.              HADOOP_CORE_FOUND=true
  20.              CLASSPATH="$CLASSPATH:${HADCOREJARS}"
  21.              break;
  22.          fi
  23.      fi

  24.      HADCOREJARS=`find ./lib/hadoop-core*.jar 2> /dev/null || true`
  25.      if [ -n "$HADCOREJARS" ]; then
  26.          # if this is the dev environment then hadoop jar will
  27.          # get added as part of ./lib (below)
  28.          break
  29.      fi

  30.      # core jars may be missing, we'll check for this below
  31.      break
  32. done
复制代码

你会发现,这是Flume加载Hadoop旧版本的依赖包,在新版本的Hadoop根本就没有${HADOOP_HOME}/conf等文件夹,所以会出现Flume不能加载对新版本Hadoop的依赖。这里教你用最简单的方法来实现对新版本的Hbase和Hadoop的依赖,在${FLUME_HOME}/bin/flume脚本里面加入下面的CLASSPATH依赖:
  1. CLASSPATH="/home/q/hbase/hbase-0.96.0-hadoop2/lib/*"
复制代码
请注意hbase-0.96.0-hadoop2里面对hadoop的依赖,hbase-0.96.0-hadoop2里面对Hadoop的依赖包是2.1.0,用上面编译好的hadoop-common-2.2.0.jar替换${HBASE_HOME}/lib里面的hadoop-common-2.1.0.jar

5、如何和Hbase-0.96整合
  在flume-src\plugins\flume-plugin-hbasesink\src\main\java里面的添加自己的类(当然你完全可以自己创建一个新的maven工程)。如果需要和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文件。然后将你写好的Hbase sink注册到Flume中。


这篇关于Flume-0.9.4和Hbase-0.96整合实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

SpringBoot整合OpenFeign的完整指南

《SpringBoot整合OpenFeign的完整指南》OpenFeign是由Netflix开发的一个声明式Web服务客户端,它使得编写HTTP客户端变得更加简单,本文为大家介绍了SpringBoot... 目录什么是OpenFeign环境准备创建 Spring Boot 项目添加依赖启用 OpenFeig

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法

《springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法》:本文主要介绍springboot整合阿里云百炼DeepSeek实现sse流式打印,本文给大家介绍的非常详细,对大... 目录1.开通阿里云百炼,获取到key2.新建SpringBoot项目3.工具类4.启动类5.测试类6.测

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio