文章目录

首先找到启动的主类io.druid.cli.Main。在Main中,使用Airline包来解析命令。

如图,可知Druid接收的启动命令分为五组,分别是server、example、tools、index、internal。

Druid启动命令分组

这里分析index命令组,详细用法可见官方文档。由代码81行可知该命令组调用了CliHadoopIndexer类。

该类接收参数:
Druid_CliHadoopIndexer

官方文档中启动命令为:

1
java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 -classpath lib/*:<hadoop_config_dir> io.druid.cli.Main index hadoop <spec_file>

其中spec_file即为argumentSpec。

接着程序执行run方法。先设定Hadoop版本,然后通过注入的extensionsConfig设置扩展信息。接着将所有的需要的驱动包路径放入driverURLs,不含Hadoop的包位置放入nonHadoopURLS,扩展包的路径放入extensionURLs:
extensionURLs

然后借助URLClassLoader来载入driverURLs:

1
2
final URLClassLoader loader = new URLClassLoader(driverURLs.toArray(new URL[driverURLs.size()]), null);
Thread.currentThread().setContextClassLoader(loader);

之后将nonHadoopURLs和extensionURLs合并为jobUrls,并且设置为druid.hadoop.internal.classpath属性:
jobUrls

之后,重新调用main方法,并设置执行internal命令组的hadoop-indexer命令,即CliInternalHadoopIndexer类,并提交job到Hadoop。

recall_main
文章目录