将Spark Streaming输出写入HDFS

时间:2015-10-12 08:29:09

标签: java apache-spark hdfs spark-streaming

我每10秒运行一次Spark Streaming应用程序,其工作是使用来自kafka的数据,转换它并根据密钥将其存储到HDFS中。即每个唯一键的文件。我使用Hadoop的saveAsHadoopFile()API来存储输出,我看到为每个唯一键生成了一个文件,但问题是每个唯一键只存储一行。 DStream有相同键的更多行。

例如,请考虑以下具有一个唯一键的DStream

  key                  value
 =====   =====================================
 Key_1   183.33 70.0 0.12 1.0 1.0 1.0 11.0 4.0 
 Key_1   184.33 70.0 1.12 1.0 1.0 1.0 11.0 4.0 
 Key_1   181.33 70.0 2.12 1.0 1.0 1.0 11.0 4.0 
 Key_1   185.33 70.0 1.12 1.0 1.0 1.0 11.0 4.0 
 Key_1   185.33 70.0 0.12 1.0 1.0 1.0 11.0 4.0 

我看到只有一行(而不是5行)存储在HDFS文件中,

185.33 70.0 0.12 1.0 1.0 1.0 11.0 4.0

以下代码用于将输出存储到HDFS中,

dStream.foreachRDD(new Function<JavaPairRDD<String, String>, Void> () {
    @Override
    public Void call(JavaPairRDD<String, String> pairRDD) throws Exception {
        long timestamp = System.currentTimeMillis();
        int randomInt = random.nextInt();
        pairRDD.saveAsHadoopFile("hdfs://localhost:9000/application-" + timestamp +"-"+ randomInt, String.class, String.class, RDDMultipleTextOutputFormat.class);
    }
});

其中RDDMultipleTextOutputFormat的实现如下,

public class RDDMultipleTextOutputFormat<K,V> extends    MultipleTextOutputFormat<K,V> {

    public K generateActualKey(K key, V value) { 
        return null;
    }

    public String generateFileNameForKeyValue(K key, V value, String name) { 
        return key.toString();
    }
}

如果我遗失了什么,请告诉我?谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

因为键是相同的,所以每次都会替换该值,因此您将获得提供给hadoop的最后一个值。