我正在使用Spark在云端运行。我的存储不是传统的HDFS,但我通过URL连接到我的文件。例如,我可以执行以下操作,Spark将接收目录中的所有文件。我也可以使用任何其他HDFS函数调用。
sc.TextFile("hdfs://mystorage001/folder/month1/*")
我的数据分布在5个不同的驱动器之间,我想在从每个驱动器读取之间进行循环操作,因此我可以并行读取所有5个驱动器。我目前可以执行以下操作并处理所有数据,但它不会并行读取驱动器。相反,spark会读取一个驱动器中的所有文件,然后移动到下一个文件。
sc.TextFile("hdfs://mystorage001/folder/month1/*, hdfs://mystorage002/folder/month2/*, hdfs://mystorage003/folder/month3/*, hdfs://mystorage004/folder/month4/*,hdfs://mystorage005/folder/month5/*")
我有100个遗嘱执行人。所以我也试过这个,但这给了我最差的表现。
sc.TextFile("hdfs://mystorage001/folder/month1/*, 20) union sc.TextFile("hdfs://mystorage002/folder/month2/*, 20) union sc.TextFile("hdfs://mystorage003/folder/month3/*, 20) union sc.TextFile("hdfs://mystorage004/folder/month4/*, 20) union sc.TextFile("hdfs://mystorage005/folder/month5/*")
我知道在每个目录中我都有名为000000_0,000001_0,000002_0等的文件...所以如果我可以通过名称的那一部分命令文件列表,我认为这将完成我想要的,但我找到如何返回列表的唯一方法是通过wholeTextFile()
,它需要首先加载所有数据。
答案 0 :(得分:0)
import org.apache.hadoop.fs._
val fs = FileSystem.get(sc.hadoopConfiguration)
val path = Array(new Path("hdfs://mystorage001/folder/month1/"),
new Path("hdfs://mystorage001/folder/month2/"),
new Path("hdfs://mystorage001/folder/month3/"),
new Path("hdfs://mystorage001/folder/month4/"),
new Path("hdfs://mystorage001/folder/month5/"))
path.map(fs.listStatus(_)).flatMap(_.zipWithIndex).sortBy(_._2).map(_._1.getPath).mkString(",")