Flume-0.9.4数据插入HBase-0.96
來自:http://blog.csdn.net/iam333/article/details/18770977
最近由于業(yè)務(wù)需要,需要將flume的數(shù)據(jù)插入HBase-0.96,利用flume的實(shí)時(shí)日志收集,實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)存儲。正如前文所 述,flume-ng即flume-1.4.0版本和hbase-0.96結(jié)合相對比較容易配置,只需要做一些相關(guān)配置,實(shí)現(xiàn)自己的 HbaseEventSerializer類,重新編譯flume-ng-hbase-sink部分源碼并打包即可。但是因?yàn)楣疽郧皹I(yè)務(wù)的日志收集使用 的flume不是flume-1.4.0版本,而是flume-0.9.4,所以為了保證對原來代碼的兼容性,就需要實(shí)現(xiàn)flume-0.9.4與 HBase-0.96結(jié)合。經(jīng)過兩天的研究,和同事實(shí)現(xiàn)了這個(gè)功能,鑒于網(wǎng)上目前還缺少這樣的資料,也為了后來人不再踩我們踩過的坑,所以寫篇文章記錄一 下。
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/
下載好以后,執(zhí)行如下命令:
- $?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配置,此時(shí)會顯示編譯失敗,錯(cuò)誤提示如下:
- [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]??
此時(shí)需要安裝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>??
此時(shí),需要安裝thrift,安裝可參考《ubuntu 12.04中安裝thrift-0.9.1》,安裝好之后,對上面的配置修改如下:(注:/usr/local/bin/thrift是我thrift的安裝目錄)
- <thriftExecutable>/usr/local/bin/thrift</thriftExecutable>??
配置好后,運(yùn)行上面的maven編譯命令,還會出現(xiàn)一個(gè)錯(cuò)誤:
- [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:??
這是因?yàn)閜om.xml里面的libthrift版本不對,做如下修改即可:
- <dependency>??
- ????????<groupid>org.apache.thrift</groupid>??
- ????????<artifactid>libthrift</artifactid>??
- ????????<version>0.9.1</version>??
- </dependency>??
繼續(xù)編譯打包,還是會出錯(cuò),錯(cuò)誤如下:
- [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]??
很明顯,還是因?yàn)榘也坏?#xff0c;做如下修改即可:
- <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>??
這次再運(yùn)行打包編譯命令,就可以看到如下的成功信息了:
- [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、在第一步編譯成功的基礎(chǔ)上繼續(xù)修改pom.xml文件。因?yàn)閒lume-0.9.4里面使用的hadoop-core,還是0.20版本,是不能直接連接hbase-0.96的,所以需要將上面的hadoop-core的依賴用下面的內(nèi)容替換:
- <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的依賴也修改為上面的內(nèi)容。由于guava也太早,所以將guava的依賴也用下面的內(nèi)容替換:
- <dependency>??
- ??<groupId>com.google.guava</groupId>??
- ??<artifactId>guava</artifactId>??
- ??<version>10.0.1</version>??
- </dependency>??
為了保證能插入數(shù)據(jù)到hbase-0.96里面,還需要替換flume源文件夾下的plugins/flume-plugin-hbasesink里面的hbase依賴,
將下面的內(nèi)容:
- <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源碼部分,主要修改的內(nèi)容為 FlushingSequenceFileWriter.java、RawSequenceFileWriter.java和 SequenceFileOutputFormat.java,使用新版本的hadoop-2.2.0中的相應(yīng)方法修改。(如果不知道如何修改,可以聯(lián)系 我。)
至此,重新運(yùn)行maven的編譯打包命令,如果出現(xiàn)第一步最后的成功信息,證明修改成功。
4、修改flume啟動腳本。仔細(xì)分析${FLUME_HOME}/bin/flume會發(fā)現(xiàn),該文件里面有很長一段是加載舊版本的hadoop依賴包,所以應(yīng)該將其注釋掉。并將該部分替換為:
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機(jī)器上修改${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那項(xiàng)配置成自定義的sink即可.
轉(zhuǎn)載于:https://www.cnblogs.com/sunxucool/p/3630099.html
總結(jié)
以上是生活随笔為你收集整理的Flume-0.9.4数据插入HBase-0.96的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不需要真相是什么歌啊?
- 下一篇: 数学工具WZgrapher