从Java中的spark转换函数中写入HDFS中的文件

时间:2017-10-17 15:48:10

标签: java hadoop apache-spark

我的问题类似于已经回答的问题,即scala和阅读文件。

Reading files dynamically from HDFS from within spark transformation functions

我知道累加器使用它们将结果返回给驱动程序并写入驱动程序中的HDFS。在我们的用例中,每个执行器的输出都很大,所以我正在寻找一种在Java转换中写入HDFS的方法。

谢谢!

2 个答案:

答案 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());

如果其他人在同一条船上,希望这会有所帮助。

干杯!