Apache spark 如何将转换后的数据从分区发送到S3?
我有一个Apache spark 如何将转换后的数据从分区发送到S3?,apache-spark,Apache Spark,我有一个RDD,它对收集来说太大了。我已经对RDD应用了一系列转换,并希望将转换后的数据直接从从属服务器上的分区发送到S3。我目前的经营情况如下: val rdd:RDD = initializeRDD val rdd2 = rdd.transform rdd2.first // in order to force calculation of RDD rdd2.foreachPartition sendDataToS3 不幸的是,发送到S3的数据未经转换。RDD看起来与stageinitia
RDD
,它对收集
来说太大了。我已经对RDD
应用了一系列转换,并希望将转换后的数据直接从从属服务器上的分区发送到S3。我目前的经营情况如下:
val rdd:RDD = initializeRDD
val rdd2 = rdd.transform
rdd2.first // in order to force calculation of RDD
rdd2.foreachPartition sendDataToS3
不幸的是,发送到S3的数据未经转换。RDD
看起来与stageinitializeRDD
中的情况一模一样
以下是sendDataToS3的正文:
implicit class WriteableRDD[T](rdd:RDD[T]){
def transform:RDD[String] = rdd map {_.toString}
....
def sendPartitionsToS3(prefix:String) = {
rdd.foreachPartition { p =>
val filename = prefix+new scala.util.Random().nextInt(1000000)
val pw = new PrintWriter(new File(filename))
p foreach pw.println
pw.close
s3.putObject(S3_BUCKET, filename, new File(filename))
}
this
}
}
这是通过rdd.transform.sendPartitionsToS3(前缀)
调用的
我如何确保在
sendDataToS3
中发送的数据是转换后的数据?我猜您的代码中有一个bug没有包含在问题中
无论如何,我回答这个问题只是为了确保您知道RDD.saveAsTextFile
。您可以在S3上给它一个路径(s3n://bucket/directory
),它将直接从执行器将每个分区写入该路径
我很难想象您何时需要实现自己的
sendPartitionsToS3
而不是使用saveAsTextFile
我无法用您提供的代码重现问题。您是否能够从foreachPartition
闭包保存转换后的数据,可能会将其传递给S3?我还没有尝试S3,但转换后的数据会正确地传递给函数,并从函数中传递。当我收集RDD时,数据会被转换。当我从foreachPartition
块将它发送到S3时,它不是。我放弃了。我认为一般情况下不可能重现这种情况,所以要么是代码中出现了一些奇怪的问题,要么是遇到了一个非常奇怪的bug。