用于报告的 Hive 或 HBase?
Posted
技术标签:
【中文标题】用于报告的 Hive 或 HBase?【英文标题】:Hive or HBase for reporting? 【发布时间】:2017-10-11 18:01:08 【问题描述】:我想了解什么是用于报告目的的最佳大数据解决方案?
目前我将其缩小到 HBase 与 Hive。
用例是我们拥有数百 TB 的数据和数百个不同的文件。数据是实时的,并且一直在更新。我们需要提供最有效的报告方式。我们有几十个不同的报告页面,其中每个报告都包含不同类型的数字和图形数据。例如:
-
显示过去一小时内登录系统的所有用户和
他们的起源是美国。
显示一个图表,其中包含最常玩的游戏
最少玩的游戏。
来自系统中所有用户的显示百分比
付费用户与非付费用户的比较。
对于给定的用户,显示他的全部历史记录。他打了多少场比赛?他玩过什么样的游戏。他在每场比赛中的得分是多少?
在我看来,有3个解决方案:
将所有数据存储在 Hadoop 中并在 Hive 中执行查询。这可能有效,但我不确定性能。当数据为 100 TB 时它会如何表现?另外,以 Hadoop 作为主数据库可能不是最好的解决方案,因为更新操作很难实现,对吧?
将所有数据存储在 HBase 中并使用 Phoenix 进行查询。这个解决方案很好,但 HBase 是一个键/值存储。如果我加入一个没有索引的键,那么 HBase 将进行一次完整扫描,这可能会比 Hive 更糟糕。我可以在列上放置索引,但这需要在几乎每一列上放置一个索引,我认为这不是最好的建议。
将所有数据存储在 HBase 中,并在 Hive 中使用专有桥与 HBase 进行通信进行查询。
【问题讨论】:
你应该看看 Phoenix 二级索引。 这可能更适合网站管理员 【参考方案1】:对您建议的解决方案的相应回复(基于我个人遇到类似问题的经验):
1) 你不应该想到Hive as a regular RDMS,因为它最适合不可变数据。因此,如果您想使用 Hive 进行更新,这就像杀死您的盒子一样。
2) 正如 Paul 所建议的,在 cmets 中,您可以使用 Phoenix 创建索引,但我们尝试了它,但对于您建议的数据量,它会非常慢(我们在 Hbase 中看到约 100 GB 数据的速度很慢。 )
3) 带 Hbase 的 Hive 比 Phoenix 慢(我们尝试过,Phoenix 为我们工作得更快)
如果您要进行更新,那么 Hbase 是您拥有的最佳选择,您可以使用 Phoenix。但是,如果您可以使用 Hbase 进行更新,将数据转储到 Parquet 中,然后使用 Hive 进行查询,将会非常快。
【讨论】:
【参考方案2】:您可以使用 lambda 结构,即 hbase 以及一些流计算工具,例如 spark 流。您将数据存储在 hbase 中,当有新数据到来时,通过流计算更新原始数据和报告。创建新报告时,您可以从 hbase 的全扫描生成它,之后,可以通过流计算更新报告。您还可以使用 map-reduce 作业定期调整流计算结果。
【讨论】:
【参考方案3】:第一个解决方案(将所有数据存储在 Hadoop 中并在 Hive 中执行查询)不允许您更新数据。您可以只插入到配置单元表中。普通蜂巢非常慢,对我来说最好使用 Hive LLAP 或 Impala。我用过 Impala,它的性能非常好,但效率很高,每次只有一个查询。当然,在 Impala 中更新行也是不可能的。
第三种解决方案将获得非常缓慢的连接性能。我已经用 HBase 尝试过 Impala,并且加入工作非常缓慢。
关于 Impala 处理数据大小和集群大小比例,https://www.cloudera.com/documentation/enterprise/5-8-x/topics/impala_cluster_sizing.html
如果你需要更新行,你可以试试 Apache Kudu。 在这里您可以找到 Kudu 与 Impala 的集成指南:https://www.cloudera.com/documentation/enterprise/5-11-x/topics/impala_kudu.html
【讨论】:
以上是关于用于报告的 Hive 或 HBase?的主要内容,如果未能解决你的问题,请参考以下文章