Что лучше выбрать для долговременного хранения (много операций записи, мало операций чтения) данных, обрабатываемых с помощью Spark Streaming: Parquet, HBase или Cassandra? Или что-то другое? Каковы компромиссы?
Как лучше всего хранить входящие потоковые данные?
Ответы (1)
По моему опыту, мы использовали Hbase в качестве хранилища данных для искровых потоковых данных (у нас также есть тот же сценарий, когда много операций записи и мало операций чтения), поскольку мы используем Hadoop, hbase имеет встроенную интеграцию с Hadoop, и все прошло хорошо.
Выше мы использовали для сохранения высокую скорость сообщений, приходящих из утешения.
HBase хорошо подходит для сканирования на основе диапазона. Касандра известна своей доступностью и многим другим...
Тем не менее, я также могу наблюдать одну общую тенденцию во многих проектах, они просто хранят необработанные данные в hdfs (паркет + avro) в разделенной структуре через потоковую передачу искры с помощью spark dataframe(
SaveMode.Append)
и обрабатывают необработанные данные с помощью Spark
Пример секционированной структуры в hdfs: completion ofbusinessdate/environment/businesssubtype/message type
и т. д.... в этом случае нет необходимости обращаться к Hbase или любому другому хранилищу данных.
Но одна общая проблема в описанном выше подходе заключается в том, что когда вы получаете маленькие и крошечные файлы через потоковую передачу, вам потребуется repartion(1
), colelese
или FileUtils.copymerge
, чтобы соответствовать требованиям к размеру блока для одного файла с разделами. Помимо этого выше подход также будет хорошо.
Вот нечто, называемое теорией CAP, на основе которой можно принять решение.
Непротиворечивость (все узлы видят одни и те же данные одновременно).
Доступность (каждый запрос получает ответ о том, был ли он успешным или нет).
Устойчивость к разделам (система продолжает работать, несмотря на произвольное разделение из-за сетевых сбоев)
Casandra поддерживает AP.
Hbase поддерживает СР.
Посмотрите подробный анализ, представленный здесь