1.1 实现思路分析
- 使用Google Option解析命令行参数。
- 读取要采集的数据目录,生成上传任务,上传任务包含一个任务文件,该文件包含了要上传哪些文件到HDFS上。
- 执行任务,读取要上传的任务文件,挨个将任务文件中的文件上传到HDFS。上传中、上传完毕需要给任务文件添加特别的标识。
1.2 Google option命令行参数解析
为了实现程序的灵活性,可以手动指定从哪儿采集数据、以及配置上报到HDFS上什么样的位置。因为要从命令行中接收参数,此处使用Google-option来进行解析。以下是Google-option的github地址:https://github.com/pcj/google-options
1.2.1 G oogle-option 介绍
Google-option这是Bazel Project中的命令行参数解析器。 com.google.devtools.common.options程序包已拆分为一个单独的jar,用于通用实用程序。
Bazel:是Google开源的构建工具,它的速度非常快,是Maven的5倍以上。采用了Cache和增量构建。修改一行代码,Bazel只需要0.5s,但Maven需要重新构建一次。Bazel可以比较容易扩展至其他语言,原生支持Java、C++,现在还支持Rust、Go、Scala等
1.2.2 安装GoogleOption
<dependency> <groupId>com.github.pcj</groupId> <artifactId>google-options</artifactId> <version>1.0.0</version> </dependency>
1.2.3 使用方式
- 创建一个类用于定义所有的命令行选项,这个类需要从OptionBase继承
package example; import com.google.devtools.common.options.Option; import com.google.devtools.common.options.OptionsBase; import java.util.List; /** * Command-line options definition for example server. */ public class ServerOptions extends OptionsBase { @Option( name = "help", abbrev = 'h', help = "Prints usage info.", defaultValue = "true" ) public boolean help; @Option( name = "host", abbrev = 'o', help = "The server host.", category = "startup", defaultValue = "" ) public String host; @Option( name = "port", abbrev = 'p', help = "The server port.", category = "startup", defaultValue = "8080" ) public int port; @Option( name = "dir", abbrev = 'd', help = "Name of directory to serve static files.", category = "startup", allowMultiple = true, defaultValue = "" ) public List<String> dirs; }
- 解析这些参数并使用它们
package example; import com.google.devtools.common.options.OptionsParser; import java.util.Collections; public class Server { public static void main(String[] args) { OptionsParser parser = OptionsParser.newOptionsParser(ServerOptions.class); parser.parseAndExitUponError(args); ServerOptions options = parser.getOptions(ServerOptions.class); if (options.host.isEmpty() || options.port < 0 || options.dirs.isEmpty()) { printUsage(parser); return; } System.out.format("Starting server at %s:%d...\n", options.host, options.port); for (String dirname : options.dirs) { System.out.format("\\--> Serving static files at <%s>\n", dirname); } } private static void printUsage(OptionsParser parser) { System.out.println("Usage: java -jar server.jar OPTIONS"); System.out.println(parser.describeOptions(Collections.<String, String>emptyMap(), OptionsParser.HelpVerbosity.LONG)); } }
1.2.4 开发舆情上报程序参数解析
1.2.4.1 使用G oogleOption 创建参数实体类
- 在cn.itcast.sentiment_upload.arg包下创建一个SentimentOptions类,并从OptionsBase继承
- 定义以下几个参数
(1) 帮助,可以显示命令的帮助信息 help h 默认参数
(2) 要采集数据的位置 source s
(3) 生成待上传的临时目录 temp_dir t “/tmp/sentiment”
(4) 生成要上传到的HDFS路径 output o
参考代码:
import com.google.devtools.common.options.Option; import com.google.devtools.common.options.OptionsBase; /** * 参数实体类 * (1) 帮助,可以显示命令的帮助信息 help h 默认参数 * (2) 要采集数据的位置 source s * (3) 生成待上传的临时目录 temp_dir t "/tmp/sentiment" * (4) 生成要上传到的HDFS路径 output o */ public class SentimentOptions extends OptionsBase { @Option( name = "help", abbrev = 'h', help = "打印帮助信息", defaultValue = "true" ) public boolean help; @Option( name = "source", abbrev = 's', help = "要采集数据的位置", defaultValue = "" ) public String sourceDir; @Option( name = "pending_dir", abbrev = 'p', help = "生成待上传的待上传目录", defaultValue = "/tmp/pending/sentiment" ) public String pendingDir; @Option( name = "output", abbrev = 'o', help = "生成要上传到的HDFS路径", defaultValue = "" ) public String output; }
1.2.4.2 在 main方法中解析参数
import com.google.devtools.common.options.Option; import com.google.devtools.common.options.OptionsBase; /** * 参数实体类 * (1) 帮助,可以显示命令的帮助信息 help h 默认参数 * (2) 要采集数据的位置 source s * (3) 生成待上传的临时目录 temp_dir t "/tmp/sentiment" * (4) 生成要上传到的HDFS路径 output o */ public class SentimentOptions extends OptionsBase { @Option( name = "help", abbrev = 'h', help = "打印帮助信息", defaultValue = "true" ) public boolean help; @Option( name = "source", abbrev = 's', help = "要采集数据的位置", defaultValue = "" ) public String sourceDir; @Option( name = "pending_dir", abbrev = 'p', help = "生成待上传的待上传目录", defaultValue = "/tmp/pending/sentiment" ) public String pendingDir; @Option( name = "output", abbrev = 'o', help = "生成要上传到的HDFS路径", defaultValue = "" ) public String output; }