NingG +

编译flume:使用eclipse查看flume源码

背景

最近要弄日志收集系统,初始方案是将日志压缩之后,通过类似FTP方式上传,其中有一个问题:日志不能实时收集,因此,无法实时监控系统状态。Flume支持实时的日志采集,妥了,尝试用一下。

说点题外话,通过类似FTP方式上传文件时,还有几个问题,自己仍在思考:

编译环境

查看自己机器的环境:我用笔记本来编译的,是win 7(x64)操作系统;更详细的编译环境信息通过如下方式查看:CMD–>systeminfo,这个命令收集系统信息,需要花费40s,稍等一会儿,得到如下信息:

C:\Users\Administrator>systeminfo

OS 名称:          Microsoft Windows 7 旗舰版
OS 版本:          6.1.7601 Service Pack 1 Build 7601

系统类型:         x64-based PC
处理器:           安装了 1 个处理器。
	 [01]: Intel64 Family 6 Model 23 Stepping 6 GenuineIntel ~785 Mhz

物理内存总量:     2,968 MB
可用的物理内存:   819 MB
虚拟内存: 最大值: 5,934 MB
虚拟内存: 可用:   2,196 MB
虚拟内存: 使用中: 3,738 MB

Eclipse下查看Flume的源码(推荐)

下载完Flume的源码包之后,直接将整个flume源码目录,当作Existing Maven ProjectsImport到Eclipse中即可。注,遇到的几个问题:

下面附一张,将Flume source 以 Maven工程导入Eclipse的效果:

Flume源码的Debug

本质上Flume是启动一个JVM实例,具体启动参数,可以参考/bin/flume-ng脚本的最终启动命令。列几个启动脚本的常量,就是JVM实例的main class:

FLUME_AGENT_CLASS="org.apache.flume.node.Application"
FLUME_AVRO_CLIENT_CLASS="org.apache.flume.client.avro.AvroCLIClient"
FLUME_VERSION_CLASS="org.apache.flume.tools.VersionInfo"
FLUME_TOOLS_CLASS="org.apache.flume.tools.FlumeToolsMain"

TODO:

开始编译(废弃

备注:不必再通过mvn命令,将原始的flume源码编译为Eclipse工程了,直接将原始的flume源码作为maven工程导入即可,具体,参考前一部分Eclipse下查看Flume的源码(推荐)

OK,在这台Win7上,编译flume源码,走起。

特别说明:这些内容,都是我从官网看来的,建议有点追求的coder,多看看flume官网,这样才能有提高,我的博客仅仅是自己留作备份看的。

下载源码

Apache flume的下载页面:Apache Flume Download

我下载的是当前稳定版本flume对应的源码:apache-flume-1.5.0.1-src

开始编译

根据官方资料:flume开发&调试环境,开始编译。此次编译,我的目标很简单:在eclipse下查看flume的源代码。具体编译时,使用的命令:

mvn install -DskipTests
mvn eclipse:eclipse -DdownloadSources

出现的问题

执行命令mvn install -DskipTests后,程序有一段时间静止在编译flume ng core的模块上,强行终止(操作:ctrl + c)后,使用 “mvn install -rf :flume-ng-core -X “ 启动debug进行问题定位找到线索:

分析之后,修改flume-ng-core\scripts\目录下saveVersion.ps1,将其中powershell的两个参数args[0]args[1]替换为实际值即可。在此之前,需要确认windows系统已经安装了powershell,验证是否安装powershell的方法:运行–>powershell,看看是否能够进入与cmd类似的命令页面(我的win7系统默认带了powershell)。 如果没有安装powershell,请参考:windows管理框架

在编译flume-ng-morphline-solr-sink过程中,由于GFW等等原因,可能无法访问 repository.cloudera.com,导致编译失败,失败信息详情如下:

[ERROR] Failed to execute goal on project flume-ng-morphline-solr
-sink: Could not resolve dependencies for project org.apache.flum
e.flume-ng-sinks:flume-ng-morphline-solr-sink:jar:1.5.0.1: Failed
 to collect dependencies at org.kitesdk:kite-morphlines-all:pom:0
.12.0: Failed to read artifact descriptor for org.kitesdk:kite-mo
rphlines-all:pom:0.12.0: Could not transfer artifact org.kitesdk:
kite-morphlines-all:pom:0.12.0 from/to cdh.repo (https://reposito
ry.cloudera.com/artifactory/cloudera-repos): repository.cloudera.
com: Unknown host repository.cloudera.com -> [Help 1]

浏览一下,失败信息的大意是:编译flume-ng-morphline-solr-sink过程中,寻找依赖(dependency)失败,这是由于远端cloudera仓库对应的域名repository.cloudera.com无法解析引发的。OK,既然找不到这个cloudera仓库,那直接取消对这一仓库的引用好了,具体:修改flume-ng-sinks\flume-ng-morphline-solr-sink\目录下pom.xml文件,将<repository>元素注释掉,最终效果如表:

ok,重新执行命令mvn install -DskipTests,欧NO,又出错了,得到如下信息:

[ERROR] Failed to execute goal on project flume-ng-morphline-solr
-sink: Could not resolve dependencies for project org.apache.flum
e.flume-ng-sinks:flume-ng-morphline-solr-sink:jar:1.5.0.1: The fo
-llowing artifacts could not be resolved: org.kitesdk:kite-morphli
nes-all:pom:0.12.0, org.kitesdk:kite-morphlines-solr-core:jar:tes
-ts:0.12.0: Failure to find org.kitesdk:kite-morphlines-all:pom:0.
12.0 in http://repo1.maven.org/maven2 was cached in the local repo
-sitory, resolution will not be reattempted until the update inte
rval of repo1.maven.org has elapsed or updates are forced -> [Help 1]

平复一下心情,看看上面的提示,大意是说找不到kite-morphlines-all,看来之前粗鲁的将<repository>元素注释掉,并不能解决问题,OK,再找两个替代的repository就好了,具体再次修改flume-ng-sinks\flume-ng-morphline-solr-sink\目录下pom.xml文件如下:

  <repositories>
	<repository>
		<id>maven-restlet</id>
		<name>Public online Restlet repository</name>
		<url>http://maven.restlet.org</url>
	</repository>
  </repositories>

并且修改flume源代码根目录下的pom.xml文件,将其中<kite.version>0.12.0</kite.version>,修改为<kite.version>0.15.0</kite.version>

又有依赖(dependency)找不到了:

[ERROR] Failed to execute goal on project flume-ng-morphline-solr
-sink: Could not resolve dependencies for project org.apache.flum
e.flume-ng-sinks:flume-ng-morphline-solr-sink:jar:1.5.0.1: Failed
 to collect dependencies at org.kitesdk:kite-morphlines-all:pom:0
.12.0 -> org.kitesdk:kite-morphlines-useragent:jar:0.12.0 -> ua_p
arser:ua-parser:jar:1.3.0: Failed to read artifact descriptor for
 ua_parser:ua-parser:jar:1.3.0: Could not transfer artifact ua_pa
rser:ua-parser:pom:1.3.0 from/to maven-twttr (http://maven.twttr.
com): Connection to http://maven.twttr.com refused: Connection ti
med out: connect -> [Help 1]

再次修改flume-ng-sinks\flume-ng-morphline-solr-sink\目录下pom.xml文件,在<repositories>下添加一个元素:

<repositories>
	
	... 
	
	<repository>
	  <id>p2.jfrog.org</id>
	  <url>http://p2.jfrog.org/libs-releases</url>
	</repository>
</repositories>

重新编译,还不行,说是找不到p2.jfrog.org,怒了,翻墙,再编译,搞定。(有的网络环境,不需要翻墙,也能编译通过)

eclipse下查看源码

上面编译之后,在eclipse下,Import–>Existing Projects into Workspace,然后选择flume编译源码的路径即可,结果如下图所示:

eclipse-src

疑问

后记:每次编译代码,网络都让人蛋疼,GFW让人蛋疼,有一个VPN太重要了。

参考来源

Top