hive中与hbase外部表join时内存溢出(hive处理mapjoin的优化器机制)

标签: hive hbase 外部 | 发表时间:2014-11-29 01:03 | 作者:longshenlmj
出处:http://blog.csdn.net
与hbase外部表(wizad_mdm_main)进行join出现问题:
CREATE TABLE wizad_mdm_dev_lmj_edition_result as
select * 
from  wizad_mdm_dev_lmj_20141120 as w 
JOIN wizad_mdm_main as a ON (a.rowkey = w.guid);

程序启动后,死循环,无反应。最后在进行到0.83时,内存溢出失败。
原因:
默认情况下,Hive会自动将小表加到DistributeCache中,然后在Map扫描大表的时候,去和DistributeCache中的小表做join,这称为Mapjoin。
这里wizad_mdm_main是基于HBase的外部表,而这张表在HDFS上的源路径为 /hivedata/warehouse/wizad.db/wizad_mdm_main,实际这个目录为空,
因此,Hive优化器认为它是小表,所以,会将这张表数据加到DistributeCache中,造成内存溢出。




解决办法:
SET hive.auto.convert.join=false; 关闭自动转化MapJoin,默认为true;
SET hive.ignore.mapjoin.hint=false; 关闭忽略mapjoin的hints(不忽略,hints有效),默认为true(忽略hints)。
然后在查询时候使用hints,/*+ mapjoin(w) */ 将小表w (wizad_mdm_dev_lmj_edition_20141120) 加入到DistributeCache,
Map task在扫描HBase中的大表阶段,就可以完成join操作:
SET mapred.job.queue.name=queue3;
SET hbase.client.scanner.caching=5000;
SET hbase.zookeeper.quorum=datanode06,datanode07,datanode08;
SET zookeeper.znode.parent=/hbase;
set hbase.regionserver.lease.period=180000;
SET hive.auto.convert.join=false;
SET hive.ignore.mapjoin.hint=false;
 
INSERT OVERWRITE LOCAL DIRECTORY '/home/wizad/lmj/'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
select /*+ mapjoin(w) */ cookie_id,rowkey,fixeddim_map
from wizad_mdm_dev_lmj_edition_20141120 as w JOIN wizad_mdm_main as a
ON (w.guid = a.rowkey);
 
作者:longshenlmj 发表于2014-11-28 17:03:17 原文链接
阅读:66 评论:0 查看评论

相关 [hive hbase 外部] 推荐:

hive中与hbase外部表join时内存溢出(hive处理mapjoin的优化器机制)

- - CSDN博客云计算推荐文章
与hbase外部表(wizad_mdm_main)进行join出现问题:. 最后在进行到0.83时,内存溢出失败. 默认情况下,Hive会自动将小表加到DistributeCache中,然后在Map扫描大表的时候,去和DistributeCache中的小表做join,这称为Mapjoin. 这里wizad_mdm_main是基于HBase的外部表,而这张表在HDFS上的源路径为 /hivedata/warehouse/wizad.db/wizad_mdm_main,实际这个目录为空,.

hive中udf读写hbase

- - CSDN博客推荐文章
在大数据开发过程中经常会遇到,将hive中处理后的结果写入hbase中,每次都要写java程序会非常浪费时间,我们就想了一个办法 ,用hive的udf来实现. 只需要调用同一个udf,将表名字段名以及每一个字段的值作为udf的参数,就可以实现写hbase了. 这样大大的节省了开发时间,提升了开发效率.

从hbase(hive)将数据导出到mysql

- - CSDN博客云计算推荐文章
在上一篇文章《 用sqoop进行mysql和hdfs系统间的数据互导》中,提到sqoop可以让RDBMS和HDFS之间互导数据,并且也支持从mysql中导入到HBase,但从HBase直接导入mysql则不是直接支持,而是间接支持. 要么将HBase导出到HDFS平面文件,要么将其导出到Hive中,再导出到mysql.

Hive部署(包括集成Hbase和Sqoop)

- - ITeye博客
Hive部署(包括集成Hbase和Sqoop) .     主要是选择软件版本. 将解压后的hive-0.8.1文件放在系统的/home/hadoop/hive/中. 4.1 设置HADOOP_HOME. 修改hive-0.8.1目录下/conf/hive-env.sh.template中的HADOOP_HOME为实际的Hadoop安装目录.

Hive集成HBase详解 - MOBIN - 博客园

- -
Hive提供了与HBase的集成,使得能够在HBase表上使用HQL语句进行查询 插入操作以及进行Join和Union等复杂查询. 将ETL操作的数据存入HBase. HBase作为Hive的数据源. 从Hive中创建HBase表. 使用HQL语句创建一个指向HBase的Hive表. 通过HBase shell可以查看刚刚创建的HBase表的属性.

实时分析系统(HIVE/HBASE/IMPALA)浅析

- - 数据库 - ITeye博客
1. 什么是实时分析(在线查询)系统. 大数据领域里面,实时分析(在线查询)系统是最常见的一种场景,通常用于客户投诉处理,实时数据分析,在线查询等等过. 因为是查询应用,通常有以下特点:. b. 查询条件复杂(多个维度,维度不固定),有简单(带有ID). c. 查询范围大(通常查询表记录在几十亿级别).

Hive 中内部表与外部表的区别与创建方法

- - 互联网 - ITeye博客
先来说下Hive中内部表与外部表的区别:. Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,. 在删除表的时候,内部表的元数据和数据会被一起删除,. 而外部表只删除元数据,不删除数据. 这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据. 需要注意的是传统数据库对表数据验证是 schema on write(写时模式),而 Hive 在load时是不检查数据是否.

Hive 中内部表与外部表的区别与创建方法

- - 数据库 - ITeye博客
    先来说下Hive中内部表与外部表的区别:. Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,. 在删除表的时候,内部表的元数据和数据会被一起删除,. 而外部表只删除元数据,不删除数据. 这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据.

hive调优

- - 互联网 - ITeye博客
一、    控制hive任务中的map数: . 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改);.

hive 优化 tips

- - CSDN博客推荐文章
一、     Hive join优化. 也可以显示声明进行map join:特别适用于小表join大表的时候,SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a join b on a.key = b.key. 2.     注意带表分区的join, 如:.