Как лучше всего хранить и запрашивать большой набор метеорологических данных?

Я ищу удобный способ хранить и запрашивать огромное количество метеорологических данных (несколько ТБ). Подробнее о типе данных посередине вопроса.

Раньше я искал в направлении MongoDB (я использовал его во многих своих предыдущих проектах и ​​чувствую себя комфортно с ним), но недавно я узнал о HDF5. Читая об этом, я обнаружил некоторое сходство с Mongo:

HDF5 упрощает файловую структуру и включает только два основных типа объектов: наборы данных, которые представляют собой многомерные массивы однородного типа, группы, представляющие собой контейнерные структуры, которые могут содержать наборы данных и другие группы. Это приводит к действительно иерархическому формату данных, подобному файловой системе. Метаданные хранятся в виде определенных пользователем именованных атрибутов, прикрепленных к группам и наборам данных.

Это похоже на массивы и встроенные объекты в Mongo, а также поддерживает индексы для запроса данных.

Поскольку он использует B-деревья для индексации табличных объектов, HDF5 хорошо работает для данных временных рядов, таких как ряды цен на акции, данные сетевого мониторинга и трехмерные метеорологические данные.

Данные:

Конкретный регион разделен на более мелкие квадраты. На пересечении каждого датчика находится (точка).

введите описание изображения здесь

Этот датчик каждые X минут собирает следующую информацию:

  • солнечная светимость
  • местоположение и скорость ветра
  • влажность
  • и так далее (эта информация в основном совпадает, иногда датчик не собирает всю информацию)

Он также собирает их для разной высоты (0 м, 10 м, 25 м). Не всегда высота будет одинаковой. Также у каждого датчика есть какая-то метаинформация:

  • название
  • широта, долгота
  • это в воде, и многие другие

Учитывая это, я не ожидаю, что размер одного элемента будет больше 1 МБ. Также у меня достаточно места для хранения всех данных в одном месте (насколько я понял, шардинг не требуется)

Операции с данными. Я собираюсь взаимодействовать с данными несколькими способами:

  • конвертировать как хранить большой объем данных: несколько ТБ данных будут предоставлены мне в качестве определенного момента времени в netcdf формат, и мне нужно будет их сохранить (а преобразовать его в HDF5 относительно легко). Затем будут предоставляться периодически меньшие части данных (1 Гб в неделю), и я должен добавлять их в хранилище. Просто подчеркну: у меня достаточно места для хранения всех этих данных на одном компьютере.

  • запросить данные. Часто возникает необходимость запрашивать данные в режиме реального времени. Чаще всего используются следующие запросы: скажите мне температуру датчиков из определенного региона за определенное время, покажите мне данные с определенного датчика за определенное время, покажите мне ветер для некоторого региона за определенный промежуток времени. Агрегированные запросы (какова средняя температура за последние два месяца) маловероятны. Я думаю, что Mongo вполне подходит, но альтернативой является hdf5 + pytables.

  • выполнить статистический анализ. В настоящее время я не знаю, что именно это будет, но знаю, что это не должно происходить в реальном времени. Поэтому я подумал, что использование hadoop с mongo может быть хорошей идеей, но hdf5 с R - разумный альтернатива.

Я знаю, что вопросы о лучшем подходе не приветствуются, но я ищу совета у опытных пользователей. Если у вас есть вопросы, я буду рад на них ответить и буду благодарен за вашу помощь.

PS Я просмотрел несколько интересных обсуждений, похожих на мою: hdf-forum, поиск в hdf5, сохранение метеорологических данных


person Salvador Dali    schedule 03.06.2013    source источник
comment
Я не уверен, что Hadoop - это то, что вам нужно, если вы не планируете использовать более одной машины. Существуют значительные постоянные накладные расходы, что делает его более применимым к большим кластерам.   -  person Mike Park    schedule 04.06.2013
comment
Как вы предположили, это действительно похоже на вопрос, который не подходит для формата вопросов и ответов StackOverflow.   -  person WiredPrairie    schedule 04.06.2013
comment
Тем не менее, это не подходит для StackOverflow в его нынешнем виде. Он настолько большой, как сейчас написано, что, к сожалению, только обсуждение будет работать хорошо.   -  person WiredPrairie    schedule 04.06.2013
comment
Вам также следует рассмотреть базы данных массивов, такие как SciDB, rasdaman и MonetDB.   -  person High Performance Mark    schedule 04.06.2013


Ответы (2)


Это сложный вопрос, и я не уверен, что смогу дать однозначный ответ, но у меня есть опыт работы как с HDF5 / pyTables, так и с некоторыми базами данных NoSQL.
Вот некоторые мысли.

  • HDF5 сам по себе не имеет понятия индекса. Это только иерархический формат хранения, который хорошо подходит для многомерных числовых данных. Можно расширить поверх HDF5 для реализации индекса (например, PyTables, HDF5 FastQuery) для данные.
  • HDF5 (если вы не используете версию MPI) не поддерживает одновременный доступ на запись (доступ для чтения возможен).
  • HDF5 поддерживает фильтры сжатия, которые, в отличие от распространенного мнения, могут сделать доступ к данным действительно более быстрым (однако вы должны подумать о правильном размере блока, который зависит от способа доступа к данным).
  • HDF5 - это не база данных. MongoDB имеет свойства ACID, а HDF5 - нет (может быть важно).
  • Существует пакет (SciHadoop), объединяющий Hadoop и HDF5.
  • HDF5 позволяет относительно легко выполнять вычисления ядра (т.е. если данные слишком велики для размещения в памяти).
  • PyTables поддерживает некоторые быстрые вычисления "в ядре" непосредственно в HDF5 с использованием numexpr

Я думаю, что ваши данные в целом подходят для хранения в HDF5. Вы также можете провести статистический анализ в R или Numpy/Scipy.
Но вы также можете подумать о гибридном подходе. Сохраните необработанные массовые данные в HDF5 и используйте MongoDB для метаданных или для кеширования часто используемых значений.

person Ümit    schedule 04.06.2013

Вы можете попробовать SciDB, если загрузка NetCDF / HDF5 в эту базу данных массива для вас не проблема. Обратите внимание, что если ваш набор данных очень большой, этап загрузки данных займет очень много времени. Боюсь, это проблема всех баз данных. В любом случае SciDB также предоставляет пакет R, который должен поддерживать необходимый вам анализ.

В качестве альтернативы, если вы хотите выполнять запросы без преобразования HDF5 во что-то еще, вы можете использовать этот продукт здесь: http://www.cse.ohio-state.edu/~wayi/papers/HDF5_SQL.pdf Более того, если вы хотите эффективно выполнить запрос выбора, вы должны использовать index; если вы хотите выполнить запрос агрегирования в реальном времени (в секундах), вы можете рассмотреть приблизительное агрегирование. Наша группа разработала несколько продуктов для поддержки этих функций.

Что касается статистического анализа, я думаю, что ответ зависит от сложности вашего анализа. Если все, что вам нужно, это вычислить что-то вроде энтропии или коэффициента корреляции, у нас есть продукты, позволяющие делать это в режиме реального времени. Если анализ очень сложный и специализированный, вы можете рассмотреть SciHadoop или SciMATE, которые могут обрабатывать научные данные в среде MapReduce. Однако я не уверен, может ли SciHadoop в настоящее время напрямую поддерживать HDF5.

person SciPioneer    schedule 10.12.2013