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

相关文章

C++必修:模版的入门到实践

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C++学习 贝蒂的主页:Betty’s blog 1. 泛型编程 首先让我们来思考一个问题,如何实现一个交换函数? void swap(int& x, int& y){int tmp = x;x = y;y = tmp;} 相信大家很快就能写出上面这段代码,但是如果要求这个交换函数支持字符型

亮相WOT全球技术创新大会,揭秘火山引擎边缘容器技术在泛CDN场景的应用与实践

2024年6月21日-22日,51CTO“WOT全球技术创新大会2024”在北京举办。火山引擎边缘计算架构师李志明受邀参与,以“边缘容器技术在泛CDN场景的应用和实践”为主题,与多位行业资深专家,共同探讨泛CDN行业技术架构以及云原生与边缘计算的发展和展望。 火山引擎边缘计算架构师李志明表示:为更好地解决传统泛CDN类业务运行中的问题,火山引擎边缘容器团队参考行业做法,结合实践经验,打造火山

9 个 GraphQL 安全最佳实践

GraphQL 已被最大的平台采用 - Facebook、Twitter、Github、Pinterest、Walmart - 这些大公司不能在安全性上妥协。但是,尽管 GraphQL 可以成为您的 API 的非常安全的选项,但它并不是开箱即用的。事实恰恰相反:即使是最新手的黑客,所有大门都是敞开的。此外,GraphQL 有自己的一套注意事项,因此如果您来自 REST,您可能会错过一些重要步骤!

JavaWeb 学习笔记 spring+jdbc整合开发初步

JdbcTemplate类是Spring的核心类之一,可以在org.springframework.jdbc.core中找到它。JdbcTemplate类在内部已经处理数据库的建立和释放,可以避免一些常见的错误。JdbcTemplate类可直接通过数据源的应用实例化,然后在服务中使用,也可在xml配置中作为JavaBean应用给服务使用直接上一个实例步骤1.xml配置 <?xml version

IIS10和Tomcat8整合

在网上找了很久,也试了很多,都没有弄好。后来根据这个博客,做一些小修小改,终于成功了。 我是从里面的IIS与TOMCAT整合那里开始看的。第一步上面要创建一个注册表,我没有创建。我是创建了一个名为“isapi_redirect.properties”的文件,放进tomcat安装目录的conf文件夹里面。里面内容为: # Configuration file for the Jakarta

Netty ByteBuf 释放详解:内存管理与最佳实践

Netty ByteBuf 释放详解:内存管理与最佳实践 在Netty中(学习netty请参考:🔗深入浅出Netty:高性能网络应用框架的原理与实践),管理ByteBuf的内存是至关重要的(学习ByteBuf请参考:🔗Netty ByteBuf 详解:高性能数据缓冲区的全面介绍)。未能正确释放ByteBuf可能会导致内存泄漏,进而影响应用的性能和稳定性。本文将详细介绍如何正确地释放ByteB

Clickhouse 的性能优化实践总结

文章目录 前言性能优化的原则数据结构优化内存优化磁盘优化网络优化CPU优化查询优化数据迁移优化 前言 ClickHouse是一个性能很强的OLAP数据库,性能强是建立在专业运维之上的,需要专业运维人员依据不同的业务需求对ClickHouse进行有针对性的优化。同一批数据,在不同的业务下,查询性能可能出现两极分化。 性能优化的原则 在进行ClickHouse性能优化时,有几条

RabbitMQ实践——临时队列

临时队列是一种自动删除队列。当这个队列被创建后,如果没有消费者监听,则会一直存在,还可以不断向其发布消息。但是一旦的消费者开始监听,然后断开监听后,它就会被自动删除。 新建自动删除队列 我们创建一个名字叫queue.auto.delete的临时队列 绑定 我们直接使用默认交换器,所以不用创建新的交换器,也不用建立绑定关系。 实验 发布消息 我们在后台管理页面的默认交换器下向这个队列

Hbase特性介绍

1、什么是Hbase。 是一个高可靠性、高性能、列存储、可伸缩、实时读写的分布式数据库系统。 适合于存储非结构化数据,基于列的而不是基于行的模式 如图:Hadoop生态中HBase与其他部分的关系。 2、关系数据库已经流行很多年,并且Hadoop已经有了HDFS和MapReduce,为什么需要HBase? Hadoop可以很好地解决大规模数据的离线批量处理问题,但是,受限于Hadoo