我需要考虑如何将数据写入Hadoop。
我正在使用Spark,我从Kafka主题中收到一条消息,每条消息都在JSON记录中。
我每天大约有200B条记录。
数据字段可能会更改(不是很多,但将来可能会更改)
我需要快速写入和快速读取,并且磁盘空间小。
我应该选择什么?是Avro还是Parquet?
我还阅读了以下https://community.hitachivantara.com/community/products-and-solutions/pentaho/blog/2017/11/07/hadoop-file-formats-its-not-just-csv-anymore和Avro v/s Parquet
但仍然不知道该选择什么,
有什么建议吗?
答案 0 :(得分:1)
如果您关心存储和查询,则最佳存储类型顺序为
如果磁盘空间有限,并且想牺牲检索量,那么Snappy或Bzip2将是最好的选择,而Bzip2的压缩程度更高。
通常,我看到人们直接将JSON数据写入Hadoop,然后分批处理作业以将其每天转换为例如更可选的格式(例如Hadoop倾向于使用非常大的文件,而不是很多小的文件)
如果您关心检索速度,请使用HBase或其他数据库(Hive不是数据库),但是至少,您将需要根据业务需要将流数据压缩为更大的时间块。
Avro原生支持架构演化,如果您能够在现有的Kafka集群旁边安装Confluent Schema Registry,那么您可以使用Kafka HDFS Connect立即从Avro(或JSON,我认为是假设您)编写Parquet在消息中有一个架构字段)连同Hive表一起进入HDFS。
其他选项包括Apache Nifi或Streamsets。换句话说,不要重新发明编写Spark代码以将Kafka拉到HDFS的轮子