Кажется, излишне использовать Spark напрямую ... Если эти данные будут «собраны» водителю, почему бы не использовать API HDFS? Часто Hadoop поставляется вместе с Spark. Вот пример:
import org.apache.hadoop.fs._
import org.apache.hadoop.conf._
val fileSpec = "/data/Invoices/20171123/21"
val conf = new Configuration()
val fs = org.apache.hadoop.fs.FileSystem.get(new URI("hdfs://nameNodeEneteredHere"),conf)
val path = new Path(fileSpec)
// if(fs.exists(path) && fs.isDirectory(path) == true) ...
val fileList = fs.listStatus(path)
Затем с println(fileList(0))
, информация (отформатированный), как этот первый пункт (в качестве примера) можно рассматривать как org.apache.hadoop.fs.FileStatus
:
FileStatus {
path=hdfs://nameNodeEneteredHere/Invoices-0001.avro;
isDirectory=false;
length=29665563;
replication=3;
blocksize=134217728;
modification_time=1511810355666;
access_time=1511838291440;
owner=codeaperature;
group=supergroup;
permission=rw-r--r--;
isSymlink=false
}
Где fileList(0).getPath
даст hdfs://nameNodeEneteredHere/Invoices-0001.avro
.
Я предполагаю, что это средство чтения файлов в основном было бы с назначением HDFS, но не внутри каждого исполнителя. TLDR; Я уверен, что Spark, скорее всего, опросит namenode, чтобы получить RDD. Если базовый вызов Spark опросит namenode для управления RDD, возможно, вышеописанное является эффективным решением. Тем не менее, предложения, предлагающие любое направление, будут приветствоваться.
В 1.6+ Это действительно возможно без чтения полных файлов. – zero323