分享

Flume-0.9.4和Hbase-0.96整合实践

howtodown 2014-4-17 03:38:56 发表于 总结型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 16282
本帖最后由 howtodown 于 2014-4-17 03:43 编辑
导读: 
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.都需要修改那些文件?

2.为什么修改这些文件?
3.代码有的地方需要改动,猜测原因什么?



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中。









没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条