![](/img/trans.png)
[英]Can I read csv files from Google Storage using Spark in more than one executor?
[英]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
但他們似乎沒有像我想象的那樣工作。 我希望以下工作:
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.