我的问题类似于已经回答的问题,即scala和阅读文件。
Reading files dynamically from HDFS from within spark transformation functions
我知道累加器使用它们将结果返回给驱动程序并写入驱动程序中的HDFS。在我们的用例中,每个执行器的输出都很大,所以我正在寻找一种在Java转换中写入HDFS的方法。
谢谢!
答案 0 :(得分:1)
JavaPairInputDStream<String, byte[]> input = KafkaUtils.createJDQDirectStream(ssc, String.class, byte[].class,
StringDecoder.class, DefaultDecoder.class, kafkaParams, Collections.singleton(topicName));
JavaPairDStream<String, byte[]> output = input.transformToPair(new Function<JavaPairRDD<String, byte[]>, JavaPairRDD<String, byte[]>>() {
public JavaPairRDD<String, byte[]> call(JavaPairRDD<String, byte[]> stringJavaPairRDD) throws Exception {
JavaSparkContext sc = JavaSparkContext.fromSparkContext(stringJavaPairRDD.context());
stringJavaPairRDD.saveAsTextFile("hdfs://");
return stringJavaPairRDD;
}
});
答案 1 :(得分:0)
终于找到了实现这一目标的优雅方式。为hadoop配置创建一个广播变量
Configuration configuration = JavaSparkContext.toSparkContext(context).hadoopConfiguration();
Broadcast<SerializableWritable<Configuration>> bc = context.broadcast(new SerializableWritable<Configuration>(configuration));
将此广播变量传递给您的转换或操作,并使用以下代码段获取Hadoop文件系统:
FileSystem fileSystem = FileSystem.get(bc.getValue().value());
如果其他人在同一条船上,希望这会有所帮助。
干杯!