Моя команда должна создать базу данных HIVE
для обработки и доступа к очень большому количеству данных.Данные имеют формат json
, поэтому мы хотели бы сжать данные в табличный формат (например, таблицу csv), чтобы удалить избыточность, и хотим выполнить некоторую постобработку, чтобы в дальнейшем данные были легко доступны / обрабатывались.У нас ограниченный опыт создания таких больших систем, поэтому мне хотелось бы знать ряд различных вариантов, которые необходимо рассмотреть, прежде чем мы начнем строить систему.
Допущения :
- Конфигурация системы: кластер из 25 узлов, каждый узел имеет 20 ЦП и хранилище по 20 ТБ.
HDFS
, Spark
, HIVE
установлено. - Подача данных: каждый день 2000 файлов,каждый файл (
json.gz
) составляет 1 ГБ (1 МБ записей), поэтому ежедневный объем данных составляет 2 ТБ. - Формат данных: формат JSON.{
userID
: val1, timestamp
: val2;key1
; val3, key2
: val4 ...} количество пользователей (всего) составляет 10 МБ, а количество ключей - 1000. - Требуемые проанализированные выходные данные
csv
в табличном формате (Я предполагаю, что это наиболее удобный способ для постобработки и HIVE
): данные смешаны с 10 различными типами, поэтому желательно разбить данные на 10 независимых таблиц (csv
) с различным количеством столбцов: - Таблица A: столбец 10
- Таблица B: столбец 20
- Таблица C: столбец 6
- Таблица D: столбцы 30…
- Таблица J: столбцы 14
- Данные
csv
нуждаются в некоторой постобработке: каждая таблица будет содержать записи по 10 миллионов пользователей, и у каждого пользователя будет 100 записей с отметками времени: нам нужноотсортировать таблицу по UserID
и timestamp
;затем вычислите некоторые значения для каждого userID
.(например, примените функцию сравнения к столбцу A1 и удалите отрицательные значения). - Объем постобработки в день составляет 500 МБ несжатого csv, поскольку он устраняет значительные накладные расходы из ключей
json
и избыточных данных.Затем будет * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * её;} {НЕ о Е о * * * * * *: НЕ ТИП;Сохранение данных: распакуйте gz.json
файлы и сохраните json
файлы в hdfs
папке "/day1"
. json
при разборе: используйте pyspark
для разбора каждого json
файла в csv
отформатируйте и сохраните их в hdfs
папке "/proc_0/day1/"
.
Обработайте каждый файл и запишите, разбейте их на 10 разных файлов в соответствии с типом данных (разные таблицы).
общее количество выходных файлов / день: 2000 * 10 = 20000 файлов.
(ref: https://www.supergloo.com/fieldnotes/spark-sql-json-examples-python-using-world-cup-player-data/)
df =sqlContext.read.json('test.json')
Постобработка: используйте pyspark
и для каждой таблицы примените сортировку к таблице иприменить обработку каждого столбца, а затем сохранить выходные файлы csv
в hdfs "/ proc / day1".
Hive: для доступа к данным используйте файлы csv
в "/proc/"
.
(необязательный процесс): сохраните файлы csv
в таблице ORC
и удалите исходные файлы json
и временные csv
. Это еще больше сократит выходные данныеобъем.