HAR-файл Hadoop: фаза перемешивания
Файлы Hadoop Archive (HAR) позволяют объединять несколько файлов в Hadoop, чтобы избежать проблемы с массивными небольшими файлами. HAR использует инфраструктуру Hadoop MapReduce для создания своих файлов и требует от пользователя загружать все файлы в HDFS ранее. Как только мы загрузим наши файлы в HDFS, мы можем запустить задание HAR MapReduce, чтобы создать файл HAR.
* Я сделал несколько поисков в Google, чтобы увидеть, как работает HAR, но многие мои вопросы остаются без ответа. *
Мои вопросы:
- Как HAR MapReduce Job выбирает входные для него задачи карты.
- Объединяет ли каждая задача карты входные файлы в промежуточный файл, который представляет выходные данные задачи карты?
- И, наконец, как выполняется этап перемешивания задания HAR MapReduce.
Я провел несколько экспериментов, и после того, как я понял, что создание файла HAR чрезвычайно медленное по сравнению с созданием SequenceFile или MapFile. Это кажется мне абсурдным, потому что с MapReduce создание файла HAR идет параллельно, в отличие от SequenceFiles и MapFile, где файлы обрабатываются один за другим.
Столкнувшись с этим, я посмотрел на возможную причину медленного создания файла HAR.
Чтобы создать мой SequenceFile и мой MapFile, я не загружал все файлы в кластер Hadoop. Оценивая время создания каждого файла, я не учел в случае HAR время, которое потребовалось мне для загрузки всех файлов в HDFS. Поскольку HAR использует MapReduce, я посмотрел, как работает MapReduce, и перечислил 6 дисковых операций:
Для каждой задачи карты входные данные задачи, загруженные с диска, и выходные данные задачи записываются обратно на диск. Это заставляет меня предположить, что HAR Job на этом этапе читает некоторые файлы на входе и объединяет их для генерации выходных данных задачи карты.
Когда начинается этап перемешивания и сортировки, данные извлекаются из выходных данных задачи карты, отправляются через сеть и записываются на узел, который должен выполнить диск восстановления.
Сокращение выполняется путем считывания на диске выходных данных фазы тасования и сортировки, которые составляют входные данные фазы сокращения, которые генерируют конечный выходной сигнал. После того, как я проанализирую также, как выполняется создание MapFile (это папка, содержащая файлы последовательности буксировки: данные и индекс): данные добавляются в SequenceFile парой ключ-значение, где ключ и значение должны иметь тип Writable, Для каждого файла, который я хочу добавить в свой SequenceFile, я создаю объект Text, используя имя файла, и из двоичного содержимого файла я создаю BytesWritable, который добавляю в SequenceFile, как показано на следующем коде:
public long creatMapFile () выбрасывает IOException {
Path path = new Path(mapFilePath); if (fs.exists(path)) { fs.delete(path, true); } MapFile.Writer.Option wKeyOpt = MapFile.Writer.keyClass(Text.class); SequenceFile.Writer.Option wValueOpt = SequenceFile.Writer.valueClass(BytesWritable.class); long currentTimeMillis = System.currentTimeMillis(); try (MapFile.Writer writer = new MapFile.Writer(conf, path, wKeyOpt, wValueOpt)) { List<FileStatus> fses = Arrays.asList(lfs.listStatus(new Path(localDataPath))); fses.sort((x, y) -> x.getPath().getName().compareTo(y.getPath().getName())); for (FileStatus status : fses) { if (status.isFile()) { byte[] bs = new byte[(int) status.getLen()]; lfs.open(status.getPath()).readFully(bs); writer.append(new Text(status.getPath().getName()), new BytesWritable(bs)); } } } return = System.currentTimeMillis() - currentTimeMillis;
}
Для Sequence и MapFiles я думаю, что они требуют только двух дисковых операций: при чтении небольшого файла и при добавлении содержимого файла в большой файл. Если мои предположения верны, то являются ли многочисленные операции с дисками, требуемые MapReduce, замедляющими создание файла HAR по сравнению с архивными файлами других типов?
В противном случае, почему создание файла HAR медленнее, чем MapFile, несмотря на то, что HAR использует MapReduce.