【问题标题】:Hadoop File FormatsHadoop 文件格式
【发布时间】:2018-12-09 23:52:32
【问题描述】:

我需要考虑如何将我的数据写入 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-anymoreAvro v/s Parquet

但还是不知道该选什么,

有什么建议吗?

【问题讨论】:

  • 也许两者兼而有之。查看 Uber 的 Hoodie —— 为什么他们需要一个用于“热”数据的数据存储,包括突变(更新/删除操作),以及另一个用于“冷”数据的读取优化数据存储,并具有增量合并“热”与“冷”之分;加上顶部的抽象,以便在阅读时点击两者。就像 HBase 或 Cassandra 或 RocksDB 所做的那样,但用于随机键/值访问,而 Uber 需要它用于批量读取和分析。
  • 另外,JSON 很冗长。非常冗长。在大规模情况下,Kafka 可能会开始因庞大的体积而窒息——除非你切换到 AVRO 或类似的东西(Criteo 选择了 Protobuf)或者找出最好的压缩选项(CloudFlare 做过的事情,blog.cloudflare.com/squeezing-the-firehose

标签: apache-spark hadoop hive avro parquet


【解决方案1】:

如果您关心存储和查询,按顺序排列的最佳存储类型是

  • 兽人
  • 镶木地板
  • Avro
  • JSON
  • CSV/TSV(纯结构化文本)
  • 非结构化文本

如果您的磁盘空间有限并且想牺牲检索,则最好使用 Snappy 或 Bzip2,而 Bzip2 的压缩程度更高。

通常,我看到人们直接将 JSON 数据写入 Hadoop,然后每天批处理作业以将其转换为更可选的格式(例如,Hadoop 更喜欢非常大的文件而不是大量的小文件)

如果您关心检索速度,请使用 HBase 或其他一些数据库(Hive 不是数据库),但至少,您需要根据业务需求将流数据压缩成更大的时间块。

Avro 原生支持模式演变,如果您能够在现有 Kafka 集群旁边安装 Confluent Schema Registry,那么您可以使用 Kafka HDFS Connect 立即从 Avro(或 JSON,假设您在消息中有一个模式字段)与 Hive 表一起进入 HDFS。

其他选项包括 Apache Nifi 或 Streamsets。换句话说,不要重新发明轮子,编写 Spark 代码将 Kafka 拉到 HDFS

【讨论】:

  • 嗨,感谢您的回答。关于“我看到人们将 JSON 数据直接写入 Hadoop,然后批处理作业以每天进行转换”我可以将 JSON 写入一列的“temp”表吗只包含 JSON 字符串然后进行将其转换为我的表的工作?在性能方面推荐它?
  • 我建议您在 Hive 中使用 JSONSerde 而不是字符串列,但您并不“需要”表格。您可以只编写 JSON,然后使用 Spark 或 Pig,例如,自己将其处理到另一个表中
  • 你的意思是我可以将 JSON 写入我定义为带有 JSON 列的 JsonSerDe 的表,然后让 Spark/Pig 将 JSON 字段处理到另一个表?
  • 您将明文(JSON 格式)写入 HDFS。您可以选择使用 JsonSerde 创建一个 Hive 表。从那里,您可以使用任何 Hive 兼容库进行查询和解析。或者您可以使用 SparkSQL 直接在 HDFS 中读回 JSON,跳过 Hive,使用给定或推断的 Schema
  • 哦,好的,关于读取性能?最好用 JSON 字段创建表并用 SparkSQL 作为 parquet 文件编写?
猜你喜欢
  • 2017-07-13
  • 2014-06-17
  • 1970-01-01
  • 2012-08-27
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多