我有一个HDFS文本文件,每行都是一个URL,可以从中下载图片。我想将它们下载并与每个图片一起保存到HDFS中,作为一个文件,我想在分布式群集上运行它,而不仅仅是在驱动程序节点上运行。
这是我的代码:
val conf = new SparkConf().setAppName("test")
val sc = new SparkContext(conf)
val hadoopConf = sc.hadoopConfiguration
val rdd = sc.textFile(PIC_URL_PATH, 10) //each line in PIC_URL_PATH is an URL, which I can download picture from.
rdd.foreachPartition(part => {
part.foreach(urlPath => {
val fileSystem = FileSystem.get(hadoopConf) //hadoopConf is not serializable!
val urlLink = new URL(urlPath)
val con = urlLink.openConnection
val is = con.getInputStream
val bs = new Array[Byte](1024)
var len = 0
val fsos = fileSystem.create(new Path(urlPath.substring(urlPath.lastIndexOf("/") + 1)))
while ( (len = is.read(bs)) != -1) fsos.write(bs, 0, len)
fsos.close()
is.close()
})
})
我将文本文件读为RDD。然后,对于每个分区,我从给定的URL下载图片,并尝试使用FileSystem将图片(每个都是流)保存到HDFS。但是Configuration类不能序列化。
有没有办法解决这个问题?