我每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();
}
}
如果我遗失了什么,请告诉我?谢谢你的帮助。
答案 0 :(得分:1)
因为键是相同的,所以每次都会替换该值,因此您将获得提供给hadoop的最后一个值。