Impala、Hive性能简单对比测试
一、测试环境
操作系统:CentOS6.4
大数据平台:CDH5、Hive、Impala、MapReduce
集群规模:3台服务器,每台64G内存(原谅小气的公司给了如此糟糕的开发环境)
Impala共三几个后台Impalad进程,两个正常,一个失效,如图:
一、HBase加载数据
首先,在HBase中创建一个表,表中列簇为f,有两列dn、fn;
其次,利用Java API在HBase中产生约1000万条测试数据,代码如下:
@SuppressWarnings("static-access") @Test public void testPutBasic() { for (int m = 0; m < 20; m++) { new Thread() { @Override public void run() { int j = 0; for (int i = 0; i < 1000000; i++) { Random random = new Random(); Hashtable<String, String> pColumns = new Hashtable<String, String>(); pColumns.put("dn", "dn" + random.nextInt(100)); pColumns.put("fn", "fn" + random.nextInt(100)); try { HBaseUtil.postBasic("impala_hbase_test_table", this.getName() + "a" + j++, "f", pColumns, null); } catch (Exception e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } } }.start(); } try { Thread.currentThread().sleep(1000000000l); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }3、查看HBase数据量,共10643213条,如图:
二、Impala、Hive加载HBase数据
1、Hive使用DataBase hive_hbase,如图:
2、Hive加载HBase数据,执行语句如下:
CREATE EXTERNAL TABLE impala_hbase( rk string, dn string, fn string) ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe' STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, f:dn, f:fn") TBLPROPERTIES("hbase.table.name" = "impala_hbase_test_table");
执行截图图如下:
验证表是否存在,如图所示:
之前
之后
3、Impala同步Hive元数据,并使用相同DataBase,验证表是否存在,如图:
Impala同步Hive元数据
Impala使用DataBase hive_hbase
元数据同步前
元数据同步后
三、性能对比测试
1、count
执行语句:select count(1) from impala_hbase;
Impala耗时:28.58s
Hive耗时:255.412s
Impala执行截图如下:
Hive执行截图如下:
2、group by
执行语句:select dn,count(1) from impala_hbase group by dn;
Impala耗时:60.13s
Hive耗时:257.453s
Impala执行截图如下:
Hive执行截图如下:
四、注意事项
Impala有个内存阈值的设置,如果该值设置太小,Impala执行大数据量查询时,会受限于内存阈值而无法正确执行,如下:
这个内存阈值在CDH5中Impala安装时默认为256M,将其修改为2G,如图:
很不幸,重启Impala后再次执行group by语句,依然不行,如图所示:
结果执行group by语句成功!
结论:
在以上测试环境中,Impala性能大大优于Hive!