我是Hadoop Hive的新手,我正在开发一个报告解决方案。问题是查询性能非常慢(hive 0.10,hbase 0.94,hadoop 1.1.1)。其中一个问题是:
select a.*, b.country, b.city from p_country_town_hotel b
inner join p_hotel_rev_agg_period a on
(a.key.hotel = b.hotel) where b.hotel = 'AdriaPraha' and a.min_date < '20130701'
order by a.min_date desc
limit 10;
需要相当长的时间(50s)。我知道我知道,连接是在字符串字段而不是整数,但数据集不大(cca 3300和100000记录)。我尝试了这个SQL的提示,但结果并没有变得更快。 MS SQL Server上的相同查询持续1秒。表中的简单计数(*)持续7-8s,令人震惊(该表有3300条记录)。我真的不知道是什么问题?任何想法或我是否误解了Hadoop?
答案 0 :(得分:14)
是..你误解了Hadoop。 Hadoop和Hive也不适合实时的东西。它们最适合离线,批处理等类型的东西。它们根本不是RDBMS的替代品。虽然你可以做一些微调,但“绝对实时”是不可能的。当你运行一个hive查询时会发生很多事情,我认为你并不知道。首先,您将Hive查询转换为相应的MR作业,然后进行其他一些操作,例如拆分创建,记录生成,映射器生成等。如果您有实时需求,我绝不会建议Hadoop(或Hive)。
您可能希望了解Impala以了解实时需求。
答案 1 :(得分:4)
Hive不适合实时工作,但如果您想利用实时或快速数据访问的Hadoop基础架构,请查看HBase
。它的增值就是快速访问。不知道你为什么选择Hadoop作为你的解决方案,但是Hbase位于HDFS之上,有些人喜欢HDFS,因为HDFS提供了固有的冗余(你在那里复制一个文件并且它是自动复制的),这可能是其中一个你正在研究Hadoop的原因。
了解更多信息:read this question
答案 2 :(得分:1)
我不确定你对hadoop有多新.Hive并没有以交互的速度给你带来表格有多小的结果。如果你已经知道这一点并试图调整查询, 你可以在下面试试:
select a.*, b.country, b.city from
(select * from p_country_town_hotel where hotel= 'AdriaPraha') b
inner join
(select * from p_hotel_rev_agg_period where min_date < '20130701') a
on
a.key.hotel = b.hotel
order by a.min_date desc
limit 10;
如果您知道其中一个表足够小以适合内存,则可以尝试映射侧连接。
答案 3 :(得分:1)
使用http://phoenix.apache.org/进行此类实时查询