关于如何开始代码部分的分析,我思考了许久。原因如下:Dr.Elephant的核心代码不多,截止到我读代码时,一共1万行左右。核心代码部分比较集中,可以通过一篇文章来分析完。Dr.Elephant的扩展性非常好,在介绍源码时,扩展性也是非常值得介绍的。
![](https://img-blog.csdn.net/20160606111802470?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Dr.Elephant启动入口
app/Global.java类继承了play框架的
GlobalSettings 类,并覆盖了其中的onStart和onStop方法。使用play框架启动Dr.Elephant时,会首先调用Global类中的onStart方法。
public void onStart(Application app) {
Logger.info("Starting Application...");
fixJavaKerberos();
try {
_drElephant = new DrElephant();
_drElephant.start();
} catch (IOException e) {
Logger.error("Application start failed...", e);
}
}
在该方法中,fixJavaKerberos()方法修复Java 1.6在使用Kerberos时的一个bug。接下来会实例化一个DrElephant对象,该对象继承了多线程的Tread类,并触发这个线程开始执行。当play框架停止Dr.Elephant应用时,会调用Global的onStop方法,如下:
public void onStop(Application app) {
Logger.info("Stopping application...");
if (_drElephant != null) {
_drElephant.kill();
}
}
DrElephant和DrElephantRunner
DrElephant类完成对DrElephantRunner的一个封装,DrElephant构造方法中实例化一个DrElephantRunner对象。DrElephant的run方法会调用该DrElephantRunner对象的run方法。
DrElephantRunner.run()
DrElephantRunner.run()会申请一个线程池和任务队列来完成Hadoop/Spark任务的收集、分析过程。
用一个流程图概括如下:
作者简介:屈世超,对高并发系统设计开发感兴趣,现专注于大数据开发工作。曾任职小米科技公司服务端后台开发工程师,现担任EverString数据平台组高级开发工程师。