【问题标题】:Most efficient design for these tables in Hadoop Hive?Hadoop Hive 中这些表的最有效设计?
【发布时间】:2016-12-23 09:39:03
【问题描述】:

我已经在 HDFS 中导入了一个巨大的数据集(1.5 TB 压缩)。数据分为 3 个集合:usersitemsevents。这些集合基本上是充满.bz2 文件的文件夹,每个文件包含许多记录,采用TAB 分隔格式,每行一个。架构如下:

用户

  • id: string
  • age: string
  • sex: string

项目

  • id: string
  • data: string (JSON format)

事件

  • user_id: string
  • event_id: string
  • time: bigint
  • item_id: string
  • pos: int
  • city: string
  • state: string
  • device: string
  • property: string
  • interaction: int

我想在这个数据集上运行几个不同的查询,其中大多数涉及加入 eventsuserseventsitems 在相应的*_id 字段上(它们是所述集合的外键)。

我已经将所有这些数据导入 HDFS 并创建了外部表。查询有效,但非常昂贵。特别是在涉及 events 表时,其压缩的 .bz2 文件总计约为 1 TB。我对 Hive 的经验很少,但我读过有关分区、集群和索引的信息。似乎通过巧妙的设计,我可以加快查询速度,尤其是对于连接。

我的问题是,您对三张表的高效设计有何建议?我经常需要的查询涉及以下操作之一:

  • 加入活动用户
  • 加入活动项目
  • 加入所有三个表
  • agesexstatecityproperty(不同时)分组或过滤并聚合
  • time排序和过滤并聚合

我知道,也许并非所有这些都可以通过单一设计有效地完成,因此我愿意在必要时创建副本。我的集群中有大约 18 TB 的总可用空间(这里我没有考虑 Hadoop 的复制,所以总空间实际上更少)。

数据是静态的,即将来不会改变。如需其他参考,请参阅Yahoo Y10 News Feed dataset

奖励:理想情况下,如果数据以以后 Pig 可以轻松访问的格式存储,那就更好了!

【问题讨论】:

  • 我不认为relational-database 标签在这里是一致的!
  • 好的,已编辑。感谢您的回复。我现在正在阅读它。

标签: sql hadoop hive hiveql


【解决方案1】:

性能调优对每种情况都非常具体,没有通用的解决方案,因此您必须尝试多种方法才能获得最佳性能。

根据我的经验,这里有一些提示,它们按最重要的顺序排列:

  • 您需要构建具有最少 MR 作业数量的执行计划的查询。如果您的查询生成 4 个 MR 作业,让您的查询生成 3 个 MR 作业并不容易但非常有效,您可以使用explain 命令。
  • 考虑对表进行分区。
  • 用于查询的存储格式的不错选择是ORC,采用 SNAPPY 压缩。
  • 使用 Hive join optimization
  • 考虑使用 Impala 进行查询,使用 Hive 进行 ETL。

有一个好主意,我没有尝试过,它在 HBase 中制作维度表,在 Hive 中制作 Fact one,您可以从 Hive 读取 HBase 数据,see here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-17
    • 2012-01-13
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2022-10-22
    • 2020-03-07
    相关资源
    最近更新 更多