1.Hive底层原理:explain执行计划详解
2.Hive最终都会转化成什么程序来执行?
3.7.11、Hive 元数据表结构详解
4.Hive常ç¨ç®åå®ç°åçç®è¿°--MapReduceç
Hive底层原理:explain执行计划详解
理解 Hive 中的 EXPLAIN 命令对于优化查询和理解底层逻辑至关重要。EXPLAIN 命令能展示一个查询的执行计划,对于调优、排查数据倾斜等任务很有帮助。
使用语法为:`EXPLAIN [参数] 查询语句`。地方源码常见参数有但不限于:
查看一个 Hive 查询转换为的执行计划,包含由一个或多个 stage 组成的序列,这些 stage 可以是 MapReduce、元数据存储或文件系统操作。
执行计划由两部分组成:stage dependencies 和 stage plan。stage dependencies 展示了查询中各个 stage 之间的依赖关系。stage plan 展示了每个 stage 的执行流程,如 MapReduce 的执行计划分为多个操作,包括:
Select Operator:选取操作,例如:GROUP BY、JOIN、st电机库源码FILTER 等。
Group By Operator:分组聚合操作。
Reduce Output Operator:输出到 reduce 操作。
Filter Operator:过滤操作。
Map Join Operator:join 操作。
File Output Operator:文件输出操作。
Fetch Operator:客户端获取数据操作。
了解这些操作有助于解析和优化查询。
在生产实践中,EXPLAIN 命令能解决多种问题,如:
1. **过滤 null 值**:确认 join 语句是否自动过滤 null 值,例如:
`EXPLAIN SELECT * FROM table1 JOIN table2 ON table1.id = table2.id WHERE table1.id IS NOT NULL`。
查询结果中如出现 `predicate: id is not null` 表示会过滤 null 值。
2. **分组排序**:查看 group by 语句是否自动排序,例如:
`EXPLAIN SELECT id FROM table GROUP BY id`。
结果中 `keys: id (type: int)` 和 `sort order: +` 表示按 id 正序排序。c 界面开发 源码
3. **比较查询性能**:评估不同 SQL 语句的执行效率,例如:
比较 `EXPLAIN SELECT * FROM table WHERE condition1;` 和 `EXPLAIN SELECT * FROM (SELECT * FROM table WHERE condition1) subquery;`。
结果表明,底层会自动优化,两条语句执行效率相同。
EXPLAIN 还能用于查看 stage 依赖情况、排查数据倾斜和调优等。通过实践和探索,用户能更深入地理解 Hive 查询执行流程和优化策略。
Hive最终都会转化成什么程序来执行?
hive最终都会转化为mapreduce的job来运行。用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是 Cli,Cli 启动的时候,会同时启动一个 hive 副本。Client 是如何执行java源码 hive 的客户端,用户连接至 hive Server。
在启动 Client 模式的时候,需要指出 hive Server 所在节点,并且在该节点启动 hive Server。 WUI 是通过浏览器访问 hive。
扩展资料:
hive 并不适合那些需要高实时性的应用,例如,联机事务处理(OLTP)。hive 查询操作过程严格遵守Hadoop MapReduce 的作业执行模型,hive 将用户的hiveQL 语句通过解释器转换为MapReduce 作业提交到Hadoop 集群上。
Hadoop 监控作业执行过程,然后返回作业执行结果给用户。hive 并非为联机事务处理而设计,hive 并不提供实时的查询和基于行级的数据更新操作。hive 的最佳使用场合是大数据集的批处理作业,例如,棋牌源码定制开发网络日志分析。
百度百科-hive
7.、Hive 元数据表结构详解
Hive维护一套元数据,支持通过HQL查询时将HQL翻译为MapReduce执行。本文详解Hive元数据中关键表结构及其用途,以Hive 0.为例。版本表(VERSION)
该表记录Hive版本信息,包含版本ID、版本号和版本说明,确保系统正确初始化。版本ID:主键
版本号:Hive版本
版本说明:版本描述
版本表存在问题时,Hive-Cli无法启动,若表不存在,启动Hive-Cli将报错“Table ‘hive.version’ doesn’t exist”。数据库元数据表(DBS、DATABASE_PARAMS)
DBS
存储数据库基本信息,如数据库ID、描述、HDFS路径、名称和所有者等。
数据库ID:主键
描述:数据库说明
HDFS路径:数据库在HDFS的存储位置
名称:数据库名
所有者:数据库所有者用户名
所有者角色:所有者角色
DATABASE_PARAMS
存储数据库参数,如创建用户等,关联数据库ID。数据库ID:主键
参数名:指定参数
参数值:参数值
表和视图元数据表(TBLS、TABLE_PARAMS、TBL_PRIVS)
TBLS
存储表、视图、索引的基本信息,包括创建时间、数据库ID、上次访问时间、所有者、保留字段等。TABLE_PARAMS
存储表/视图属性信息,关联表ID。TBL_PRIVS
存储表/视图授权信息,关联表ID。Hive文件存储信息元数据表(SDS、SD_PARAMS、SERDES、SERDE_PARAMS)
SDS
保存文件存储信息,如输入格式、输出格式、是否压缩等,关联表ID。SD_PARAMS
存储存储属性信息,关联存储配置ID。SERDES
存储序列化类信息。SERDE_PARAMS
存储序列化属性、格式信息,关联序列化类配置ID。表字段元数据表(COLUMNS_V2)
存储表字段信息,如字段ID、注释、名称、类型、顺序等。表分区元数据表(PARTITIONS、PARTITION_KEYS、PARTITION_KEY_VALS、PARTITION_PARAMS)
PARTITIONS
存储表分区基本信息,如分区ID、创建时间、分区名、存储ID、表ID等。PARTITION_KEYS
存储分区字段信息,如表ID、字段说明、字段名、类型、顺序等。PARTITION_KEY_VALS
存储分区字段值,如分区ID、字段值、顺序等。PARTITION_PARAMS
存储分区属性信息。其他元数据表
包括数据库权限(DB_PRIVS)、索引(IDXS)、索引属性(INDEX_PARAMS)、表字段统计(TAB_COL_STATS)、表字段授权(TBL_COL_PRIVS)、分区统计(PART_COL_STATS)、分区字段权限(PART_COL_PRIVS)以及用户函数(FUNCS、FUNC_RU)等。实例操作:
查询表ID:根据dbName和tableName查找s.CD_ID。
查询表字段:根据CD_ID查询字段信息。
表操作(增、改、删):新增、修改、删除表字段。
参考资料:
Hive常ç¨ç®åå®ç°åçç®è¿°--MapReduceç
Hiveä¸ç常ç¨ç®åå æ¬distinctãjoinãgroup byãorder byãdistribute byãsort byãcountçï¼è¿äºæä½ç¬¦å¨SQLä¸ä½¿ç¨èµ·æ¥å¾æ¹ä¾¿ï¼è½å¿«éè¾¾å°æ们æ³è¦çææï¼ä½æ¯è¿äºç®åå¨åºå±æ¯æä¹å®ç°çå¢ï¼
order byå¾å®¹ææ³å°æ§è¡åçï¼å¨ä¸ä¸ªreduceä¸å°ææè®°å½æå¼æåºå³å¯ãå æ¤order byå¨æ°æ®é大çæ åµä¸æ§è¡æ¶é´é常é¿ï¼å®¹æout of memoryï¼éç¹æ®ä¸å¡éæ±ä¸è¬ä¸ä½¿ç¨ãdistribute byä¹æ¯è¾ææ¾ï¼æ ¹æ®hashå¼å°distributeçå¼ååå°ä¸åçreduceãsort byæ¯å°å·çorder byï¼åªè´è´£å°æ¬reducerä¸çå¼æåºï¼è¾¾å°å±é¨æåºçææãsort byådistribute byé å使ç¨é£å³æ´ä½³ï¼äºè å¯ä»¥å并ç®å为cluster byãcountåæ´å ææ°ï¼å¨combineræreducerå¤æç¸åé®ç´¯å å¼å°±è½å¾å°ã
æ¯è¾å¤æçæ¯distinctãjoinãgroup byï¼æ¬æéç¹è®¨è®ºè¿ä¸ä¸ªç®åå¨MapReduceå¼æä¸ç大è´å®ç°åçãçé¨å¼æ§ï¼æç å¼çã
mapé¶æ®µï¼å°group byåçå段ç»åä½ä¸ºkeyï¼å¦ægroup byåå段é£ä¹keyå°±ä¸ä¸ªãå°group byä¹åè¦è¿è¡çèåæä½å段ä½ä¸ºå¼ï¼å¦è¦è¿è¡countï¼åvalueæ¯1ï¼å¦è¦sumå¦ä¸ä¸ªå段ï¼åvalueå°±æ¯è¯¥å段ã
shuffleé¶æ®µï¼æç §keyçä¸åååå°ä¸åçreducerã注ææ¤æ¶å¯è½å 为keyåå¸ä¸ååèåºç°æ°æ®å¾æçé®é¢ã
reduceé¶æ®µï¼å°ç¸åkeyçå¼ç´¯å æä½å ¶ä»éè¦çèåæä½ï¼å¾å°ç»æã
对group byçè¿ç¨è®²è§£çæ¯è¾æ¸ æ¥çæ¯è¿ç¯æç« /info-detail-.html å¾æ并èï¼å¾çå¨ã
å®ä¾å¦ä¸å¾ï¼å¯¹åºè¯å¥æ¯ select rank, isonline, count(*) from city group by rank, isonline;
å¦ægroup byåºç°æ°æ®å¾æï¼é¤å»æ¿æ¢key为éæºæ°ãæåæåºå¤§æ°é级keyå¼çéç¨è°ä¼æ¹æ³ï¼éç¨äºgroup byçç¹æ®æ¹æ³æ以ä¸å ç§ï¼
ï¼1ï¼set hive.map.aggr=trueï¼å³å¼å¯map端çcombinerï¼åå°ä¼ å°reducerçæ°æ®éï¼åæ¶é设置åæ°hive.groupby.mapaggr.checkinterval è§å®å¨ map 端è¿è¡èåæä½çæ¡ç®æ°ç®ã
ï¼2ï¼è®¾ç½®mapred.reduce.tasks为è¾å¤§æ°éï¼éä½æ¯ä¸ªreducerå¤ççæ°æ®éã
ï¼3ï¼set hive.groupby.skewindata=trueï¼è¯¥åæ°å¯èªå¨è¿è¡è´è½½åè¡¡ãçæçæ¥è¯¢è®¡åä¼æ两个 MR Jobã第ä¸ä¸ª MR Job ä¸ï¼Map çè¾åºç»æéåä¼éæºåå¸å°Reduce ä¸ï¼æ¯ä¸ª Reduce åé¨åèåæä½ï¼å¹¶è¾åºç»æï¼è¿æ ·å¤ççç»ææ¯ç¸åç Group By Keyæå¯è½è¢«ååå°ä¸åç Reduce ä¸ï¼ä»èè¾¾å°è´è½½åè¡¡çç®çï¼ç¬¬äºä¸ª MR Job åæ ¹æ®é¢å¤ççæ°æ®ç»ææç § Group ByKey åå¸å° Reduce ä¸ï¼è¿ä¸ªè¿ç¨å¯ä»¥ä¿è¯ç¸åç Group By Key 被åå¸å°åä¸ä¸ª Reduceä¸ï¼ï¼æåå®ææç»çèåæä½ã
Hiveä¸æ两ç§joinæ¹å¼ï¼map joinåcommon join
å¦æä¸æ¾å¼æå®map side joinï¼æè 没æè¾¾å°è§¦åèªå¨map joinçæ¡ä»¶ï¼é£ä¹ä¼è¿è¡reduce端çjoinï¼å³common joinï¼è¿ç§joinå å«mapãshuffleãreduceä¸ä¸ªæ¥éª¤ã
ï¼1ï¼Mapé¶æ®µ
读åæºè¡¨çæ°æ®ï¼Mapè¾åºæ¶å以Join onæ¡ä»¶ä¸çå为keyï¼å¦æJoinæå¤ä¸ªå ³èé®ï¼å以è¿äºå ³èé®çç»åä½ä¸ºkeyãMapè¾åºçvalue为joinä¹åæå ³å¿ç(selectæè whereä¸éè¦ç¨å°ç)åï¼åæ¶å¨valueä¸è¿ä¼å å«è¡¨çTagä¿¡æ¯ï¼ç¨äºæ ææ¤value对åºåªä¸ªè¡¨ãç¶åæç §keyè¿è¡æåºã
ï¼2ï¼Shuffleé¶æ®µ
æ ¹æ®keyçå¼è¿è¡hash,并å°key/valueæç §hashå¼æ¨éè³ä¸åçreduceä¸ï¼è¿æ ·ç¡®ä¿ä¸¤ä¸ªè¡¨ä¸ç¸åçkeyä½äºåä¸ä¸ªreduceä¸
ï¼3ï¼Reduceé¶æ®µ
æ ¹æ®keyçå¼å®æjoinæä½ï¼æé´éè¿Tagæ¥è¯å«ä¸å表ä¸çæ°æ®ã
以ä¸é¢çSQL为ä¾ï¼å¯ç¨ä¸å¾æ示è¿ç¨å¤§è´è¡¨è¾¾å ¶joinåçã
SELECT u.name, o.orderid FROM user u JOIN order o ON u.uid = o.uid;
å ³èå段æ¯uidï¼å æ¤ä»¥uid为mapé¶æ®µçè¾åºkeyï¼value为éåçå段nameåæ è®°æºè¡¨çtagãshuffleé¶æ®µå°ç¸åkeyçé®å¼å¯¹åå°ä¸èµ·ï¼reduceé¶æ®µå°ä¸åæºè¡¨ãåä¸keyå¼çè®°å½æ¼æ¥èµ·æ¥ï¼å¯è½åå¨ä¸å¯¹å¤çæ åµã
å¦ææå®ä½¿ç¨map joinçæ¹å¼ï¼æè joinçå ¶ä¸ä¸å¼ 表å°äºæ个ä½ç§¯ï¼é»è®¤MBï¼ï¼åä¼ä½¿ç¨map joinæ¥æ§è¡ãå ·ä½å°è¡¨æå¤å°ï¼ç±åæ° hive.mapjoin.smalltable.filesize æ¥å³å®ã
Hive0.7ä¹åï¼éè¦ä½¿ç¨hintæ示 /*+ mapjoin(table) */æä¼æ§è¡MapJoin,å¦åæ§è¡Common Joinï¼ä½å¨0.7çæ¬ä¹åï¼é»è®¤èªå¨ä¼è½¬æ¢Map Joinï¼ç±åæ° hive.auto.convert.join æ¥æ§å¶ï¼é»è®¤ä¸ºtrueã
以ä¸å¾ä¸ºä¾è¯´æmap joinå¦ä½æ§è¡ï¼è¯¥å¾æ¥èª /archives///.htm ï¼å主æ¯ä¸ä¸ªæ°´å¹³æ·±ååä¹äºå享çåè¾ï¼å¾çæ°´å°ä¸ä¹æå ¶ç½åã
yarnä¼å¯å¨ä¸ä¸ªLocal Taskï¼å¨å®¢æ·ç«¯æ¬å°æ§è¡çTaskï¼--Task Aï¼è´è´£æ«æå°è¡¨bçæ°æ®ï¼å°å ¶è½¬æ¢æä¸ä¸ªHashTableçæ°æ®ç»æï¼å¹¶åå ¥æ¬å°çæ件ä¸ï¼ä¹åå°è¯¥æ件å è½½å°DistributeCacheä¸ã
æ¥ä¸æ¥æ¯Task Bï¼è¯¥ä»»å¡æ¯ä¸ä¸ªæ²¡æReduceçMRï¼å¯å¨MapTasksæ«æ大表a,å¨Mapé¶æ®µï¼æ ¹æ®açæ¯ä¸æ¡è®°å½å»åDistributeCacheä¸b表对åºçHashTableå ³èï¼å¹¶ç´æ¥è¾åºç»æã
ç±äºMapJoin没æReduceï¼æ以ç±Mapç´æ¥è¾åºç»ææ件ï¼æå¤å°ä¸ªMap Taskï¼å°±æå¤å°ä¸ªç»ææ件ã
distinctä¸è¬ågroup byåæ¶åºç°ã
å½distinctä¸ä¸ªå段æ¶ï¼å°group byçå段ådistinctçå段ç»åå¨ä¸èµ·ä½ä¸ºmapè¾åºçkeyï¼value设置为1ï¼åæ¶å°group byçå段å®ä¸ºååºé®ï¼è¿å¯ä»¥ç¡®ä¿ç¸ågroup byå段çè®°å½é½åå°åä¸ä¸ªreducerï¼å¹¶ä¸mapçè¾å ¥å¤©ç¶å°±æ¯æç §ç»åkeyæ好åºçãæ ¹æ®ååºé®å°è®°å½ååå°reduce端åï¼æ顺åºååºç»åé®ä¸çdistinctå段ï¼è¿æ¶distinctå段ä¹æ¯æ好åºçãä¾æ¬¡éådistinctå段ï¼æ¯æ¾å°ä¸ä¸ªä¸åå¼ï¼è®¡æ°å¨å°±èªå¢1ï¼å³å¯å¾å°count distinctç»æãä¾å¦ä¸é¢çSQLè¯å¥ï¼è¿ç¨å¯ä»¥ä¸å¾ç¤ºæã
æææ¶æ²¡æç解è¿æ¯æä¹å®ç°çï¼å«äººåçä¹æ²¡æçæç½ãæåè¯çå¦å¯äºè½¦ç大佬æç¹ä¸ä¸åï¼