Поиск всех имен файлов рекурсивно в hdfs с использованием Spark - PullRequest
0 голосов
/ 21 февраля 2019

Я давно искал способ получить все имена файлов в каталоге и его подкаталогах в файловой системе Hadoop (hdfs).

Я обнаружил, что могу использовать эти команды, чтобы получить его:

sc.hadoopConfiguration.set("mapreduce.input.fileinputformat.input.dir.recursive", "true")
sc.wholeTextFiles(path).map(_._1)

Вот документация "wholeTextFiles":

Чтение каталога текстовых файлов из HDFS, aлокальная файловая система (доступна на всех узлах) или любой URI файловой системы, поддерживаемый Hadoop.Каждый файл читается как отдельная запись и возвращается в паре ключ-значение, где ключ - это путь к каждому файлу, значение - это содержимое каждого файла.

Параметры:

путь - каталог к ​​файлам входных данных, путь может быть разделен запятыми в качестве списка входных данных.

minPartitions - рекомендуемое значение минимального числа разбиения для входных данных.

Возвращает:

СДР, представляющий кортежи пути к файлу и соответствующее содержимое файла

Примечание: Небольшие файлы предпочтительнее, большой файл также допустим, но может привести к снижению производительности., В некоторых файловых системах .../ путь / * может быть более эффективным способом чтения всех файлов в каталоге, чем ... / путь / или ... / путь. Разделение определяется локальностью данных.Это может привести к слишком малому количеству разделов по умолчанию.

Как вы можете видеть, "wholeTextFiles" возвращает пару СДР с именами файлов и их содержимым.Поэтому я попытался отобразить его и взять только имена файлов, но я подозреваю, что он все еще читает файлы.

Причина, по которой я подозреваю, такова: если я пытаюсь считать (например) и получаю искровой эквивалент "Недостаточно памяти »(теряя исполнителей и не в состоянии выполнить задачи).

Я бы предпочел использовать Spark для достижения этой цели самым быстрым способом, однако, если есть другие способы с разумной производительностью, я быбудьте счастливы дать им попытку.

РЕДАКТИРОВАТЬ: Чтобы очистить это - я хочу сделать это с помощью Spark, я знаю, что я могу сделать это с помощью команд HDFS и тому подобное - я хотел бызнать, как это сделать с помощью существующих инструментов, предоставляемых Spark, и, возможно, объяснить, как я могу заставить «wholeTextFiles» не читать сам текст (вроде как преобразования происходят только после действия, а некоторые «команды» никогда недействительно случается).

Большое спасибо!

1 Ответ

0 голосов
/ 29 июня 2019

Это способ перечисления всех файлов до глубины последнего подкаталога .... и без использования wholetextfiles и рекурсивный вызов до глубины подкаталогов ...

val lb = new scala.collection.mutable[String] // variable to hold final list of files
def getAllFiles(path:String, sc: SparkContext):scala.collection.mutable.ListBuffer[String] = {
 val conf = sc.hadoopConfiguration
 val fs = FileSystem.get(conf)
 val files: RemoteIterator[LocatedFileStatus] = fs.listLocatedStatus(new Path(path))
 while(files.hasNext) {// if subdirectories exist then has next is true
  var filepath = files.next.getPath.toString
  //println(filepath)
  lb += (filepath)
  getAllFiles(filepath, sc) // recursive call
 }
 println(lb)
 lb
}

Вот и все.это было проверено с успехом.Вы можете использовать как есть ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...