使用Spark下载图片并保存到HDFS

时间:2019-02-17 14:38:08

标签: apache-spark

我有一个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类不能序列化。

有没有办法解决这个问题?

0 个答案:

没有答案