我有一个应用程序,用于获取zip文件并将zip文件下的文本文件转换为avro文件。
它以下列方式以串行方式执行该过程:
1)挑选zip文件并解压缩
2)获取该zip文件下的每个文本文件及其内容
3)从不同位置获取avsc文件(模式文件)
4)将文本文件内容与相应的模式合并,从而制作avro文件
但是这个过程是以连续方式完成的(一次一个文件)。
现在我想并行执行这个过程。我将所有zip文件放在一个文件夹下。
folder/
A.zip
B.zip
C.zip
1)在每个zip文件下都有文本文件,只包含数据(没有Schema / headers)
我的文本文件如下所示:
ABC 1234
XYZ 2345
EFG 3456
PQR 4567
2)其次,我有一个avsc文件,其中包含相同文本文件的模式
我的avsc文件看起来像
{
"Name": String,
"Employee Id" : Int
}
作为我使用的实验
SparkContext.parallelize(Folder having all the zip files).map {each file => //code of avro conversion}
但是在avro转换部分的代码中(在SparkContext.parallelize 下)我使用了spark的 SparkContext.newHadoopAPIFile 功能,它也返回了 RDD
因此,当我使用这些更改运行应用程序时,我得到Task not Serializable问题。
由于两个原因怀疑这个问题 1)在SparkContext.parallelize下使用了SparkContext 2)在RDD内部制作了RDD。
org.apache.spark.SparkException:任务不可序列化
现在我需要并行功能但不确定是否有任何替代方法来实现此用例的并行性或如何解决此任务不可序列化问题。
我正在使用Spark 1.6和Scala版本2.10.5