簡體   English   中英

如何從spark執行器中讀取HDFS文件?

[英]How can I read HDFS files from a spark executor?

我有一個大的(> 500米行)CSV文件。 此CSV文件中的每一行都包含一個位於HDFS上的二進制文件的路徑。 我想使用Spark來讀取每個文件,處理它們,並將結果寫出到另一個CSV文件或表格。

在驅動程序中執行此操作非常簡單,以下代碼可以完成工作

val hdfsFilePathList = // read paths from CSV, collect into list

hdfsFilePathList.map( pathToHdfsFile => {
  sqlContext.sparkContext.binaryFiles(pathToHdfsFile).mapPartitions { 
    functionToProcessBinaryFiles(_)
  }
})

這個問題的主要問題是駕駛員做了太多的工作。 我想將binaryFiles完成的工作binaryFiles給執行程序。 我發現了一些有希望的例子,我認為這些例子允許我從執行器訪問sparkContext:

在RDD方法/閉包中使用SparkContext hadoop配置,例如foreachPartition

https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/util/SerializableConfiguration.scala

但他們似乎沒有像我想象的那樣工作。 我希望以下工作:

import java.io.{ObjectInputStream, ObjectOutputStream}
import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.conf.Configuration

class ConfigSerDeser(var conf: Configuration) extends Serializable {

  def this() {
    this(new Configuration())
  }

  def get(): Configuration = conf

  private def writeObject (out: java.io.ObjectOutputStream): Unit = {
    conf.write(out)
  }

  private def readObject (in: java.io.ObjectInputStream): Unit = {
    conf = new Configuration()
    conf.readFields(in)
  }

  private def readObjectNoData(): Unit = {
    conf = new Configuration()
  }
}

val serConf = new ConfigSerDeser(sc.hadoopConfiguration)

val mappedIn = inputDf.map( row => {
    serConf.get()
})

但它失敗了KryoException: java.util.ConcurrentModificationException

是否可以讓執行者直接訪問HDFS文件或HDFS文件系統? 或者,有沒有一種有效的方法來讀取HDFS / S3上的數百萬個二進制文件並使用Spark處理它們?

有一個類似的用例,我試圖做同樣的事情,但實現了SparkSession或SparkContext不可序列化,因此無法從執行程序訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM