我一直在尝试使用Apache Beam,作为初始测试的一部分,我一直在努力让word count运行。我一直在尝试Beam提供的MinimalWordCount示例。代码如下:
PipelineOptions options = PipelineOptionsFactory.create();
Pipeline p = Pipeline.create(options);
p.apply(TextIO.read().from("file:///tmp/shakespeare.txt"))
.apply("ExtractWords", ParDo.of(new DoFn<String, String>() {
@ProcessElement
public void processElement(ProcessContext c) {
for (String word : c.element().split(ExampleUtils.TOKENIZER_PATTERN)) {
if (!word.isEmpty()) {
c.output(word);
}
}
}
}))
.apply(Count.<String>perElement())
.apply("FormatResults", MapElements.via(new SimpleFunction<KV<String, Long>, String>() {
@Override
public String apply(KV<String, Long> input) {
return input.getKey() + ": " + input.getValue();
}
}))
.apply(TextIO.write().to("file:///tmp/wordcounts/"));
// Run the pipeline.
p.run().waitUntilFinish();
}
这个想法是通过spark-submit在本地运行它。以下是我的spark-submit命令:
$ SPARK_HOME / bin / spark-submit --master local [2] --class test.beam.example.MyWordCount /local/playground-1.0.0-shaded.jar --runner = SparkRunner --sparkMaster = local [2]
但是,它在以下函数中继续使用NullPointerException失败:
TextIO.write()。为了(&#34;文件:/// TMP / wordcounts /&#34)
以下是stacktrace:
线程中的异常&#34; main&#34;显示java.lang.NullPointerException
at org.apache.beam.sdk.io.FileSystems.matchNewResource(FileSystems.java:544)
at org.apache.beam.sdk.io.FileBasedSink.convertToFileResourceIfPossible(FileBasedSink.java:213)
at org.apache.beam.sdk.io.TextIO $ TypedWrite.to(TextIO.java:679)
at org.apache.beam.sdk.io.TextIO $ Write.to(TextIO.java:997)
当我在HDFS上运行文件时,会运行完全相同的代码。所以基本上替换
hdfs://而不是file:///
我是否需要在此处执行更多操作以指示光束在本地文件系统中查找文件?