Arhn - архитектура программирования

Загрузка файла hdf5 больше памяти в pyspark

У меня есть большой файл (скажем, 20 Гб), хранящийся в формате HDF5. Файл представляет собой набор 3D-координат, изменяющихся во времени (траектория молекулярного моделирования). Это в основном массив формы (8000 (frames), 50000 (particles), 3 (coordinates))

В обычном питоне я бы просто загрузил файл данных hdf5, используя для h5py или pytables, и проиндексировал файл данных, как если бы это был numpy (библиотека лениво загружает все необходимые данные).

Однако, если я попытаюсь загрузить этот файл в Spark с помощью SparkContext.parallelize, он явно забивает память:

sc.parallelize(data, 10)

Как я могу справиться с этой проблемой? Есть ли предпочтительный формат данных для огромных массивов? Могу ли я сделать так, чтобы rdd записывался на диск без прохождения по памяти?


  • Я не совсем знаком с hdf5, но можно ли прочитать его построчно? Если это так, вы можете прочитать sc.textFile('hdf5_file') чтобы прочитать файл, а затем использовать какую-то функцию карты для декодирования каждой строки 24.06.2015
  • @anant, к сожалению, это двоичный файл (иногда сжатый формат), я считаю, что его невозможно прочитать построчно 24.06.2015

Ответы:


1

Spark (и Hadoop) не поддерживает чтение частей двоичных файлов HDF5. (Я подозреваю, что причина этого в том, что HDF5 является контейнерным форматом для хранения документов и позволяет указывать древовидную иерархию для документов).

Но если вам нужно прочитать файл с локального диска - это выполнимо с помощью Spark, особенно если вы знаете внутреннюю структуру вашего файла HDF5.

Вот пример - предполагается, что вы будете запускать локальное искровое задание, и вы заранее знаете, что ваш набор данных HDF5 '/mydata' состоит из 100 фрагментов.

h5file_path="/absolute/path/to/file"

def readchunk(v):
    empty = h5.File(h5file_path)
    return empty['/mydata'][v,:]

foo = sc.parallelize(range(0,100)).map(lambda v: readchunk(v))
foo.count()

Идя дальше, вы можете изменить программу, чтобы определить количество фрагментов, используя f5['/mydata'].shape[0]

Следующим шагом будет перебор нескольких наборов данных (вы можете перечислить наборы данных с помощью f5.keys()).

Также есть другая статья "От наборов данных HDF5 к Apache Spark RDD", которые описывают аналогичный подход.

Тот же подход сработает и в распределенном кластере, но он малоэффективен. h5py требует, чтобы файл находился в локальной файловой системе. Таким образом, этого можно добиться несколькими способами: скопировать файл на все рабочие процессы и сохранить его в одном и том же месте на диске рабочих процессов; или поместите файл в HDFS и смонтируйте HDFS с помощью fusefs, чтобы рабочие могли получить доступ к файлу. Оба способа имеют некоторую неэффективность, но этого должно быть достаточно для специальных задач.

Вот оптимизированная версия, которая открывает h5 только один раз на каждом исполнителе:

h5file_path="/absolute/path/to/file"

_h5file = None    
def readchunk(v):
    # code below will be executed on executor - in another python process on remote server
    # original value for _h5file (None) is sent from driver
    # and on executor is updated to h5.File object when the `readchunk` is called for the first time
    global _h5file
    if _h5file is None:
         _h5file = h5.File(h5file_path)
    return _h5file['/mydata'][v,:]

foo = sc.parallelize(range(0,100)).map(lambda v: readchunk(v))
foo.count()
24.06.2015
  • Это довольно хороший способ решить проблему 25.06.2015
  • Отличный ответ! Но почему бы не переместить h5.File(h5file_path) за пределы функции readchunk()? Поскольку файл hdf5 открывается несколько раз в процессе карты. 26.08.2016
  • @american-curl Хорошая мысль - скрипт открывает один и тот же файл для каждого фрагмента. Но это нужно делать осторожно, когда функция отображения будет выполняться на удаленных исполнителях. Также pyspark не сможет сериализовать объект h5.File. Итак, вам нужен ленивый код, который бы открывал h5 только один раз и сохранял его в глобальной переменной. Дайте мне знать, если вам нужна помощь в написании такого кода. 28.08.2016
  • @vvladymyrov Спасибо! Мне очень нужна помощь с проблемой. И я столкнулся с подобной проблемой сериализации в pyspark. Мой код подобен чтению hdf5.file и набора данных hdf5 в глобальных переменных, а затем переходит к методу чтения фрагментов. Но на этапе карты pyspark он возвращает ошибку типа h5py/h5py/objects.c: __cinit_() принимает ровно 1 позиционный аргумент (дан 0). Похоже, что набор данных hdf5 не поддерживает прямой параллельный ввод-вывод без предварительного открытия файла. 28.08.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..