Hive SQL解析/执行计划生成流程分析
最近在研究Impala,还是先回顾下Hive的SQL执行流程吧。 Hive有三种用户接口: cli (Command line interface) bin/hive或bin/hive –service cli 命令行方式(默认) hive-server/hive-server2 bin/hive –service hiveserver 或bin/hive –service hiveserve
最近在研究Impala,还是先回顾下Hive的SQL执行流程吧。
Hive有三种用户接口:
cli (Command line interface) | bin/hive或bin/hive –service cli | 命令行方式(默认) |
hive-server/hive-server2 | bin/hive –service hiveserver 或bin/hive –service hiveserver2 | 通过JDBC/ODBC和Thrift访问(Impala通过这种方式借用hive-metastore) |
hwi (Hive web interface) | bin/hive –service hwi | 通过浏览器访问 |
在hive shell中输入“show tables;”实际执行的是:
bin/hadoop jar hive/lib/hive-cli-0.9.0.jar org.apache.hadoop.hive.cli.CliDriver -e 'SHOW TABLES;'
CLI入口函数:cli.CliDriver.main()
读入参数->建立SessionState并导入配置->处理输入文件中指令CliDriver.processFile();或交互型指令CliDriver.processLine()->解析输入CliDriver.processCmd()
(1) 如果是quit或者exit,退出
(2) 以source开头的,读取外部文件并执行文件中的HiveQL
(3) !开头的命令,执行操作系统命令(如!ls,列出当前目录的文件信息)
(4) list,列出jar/file/archive
(5) 其他命令,则生成调用相应的CommandProcessor处理,进入CliDriver.processLocalCmd()
下面看看CliDriver.processLocalCmd()这个函数:
set/dfs/add/delete指令交给指定的CommandProcessor处理,其余的交给org.apache.hadoop.hive.ql.Driver.run()处理
org.apache.hadoop.hive.ql.Driver类是查询的起点,run()方法会先后调用compile()和execute()两个函数来完成查询,所以一个command的查询分为compile和execute两个阶段。
Compile
(1)利用antlr生成的HiveLexer.java和HiveParser.java类,将HiveQL转换成抽象语法树(AST)。
首先使用antlr工具将srcqlsrcjavaorgapachehadoophiveqlparsehive.g编译成以下几个文件:HiveParser.java,?Hive.tokens,?Hive__.g,?HiveLexer.java
HiveLexer.java和HiveParser.java分别是词法和语法分析类文件,Hive__.g是HiveLexer.java对应的词法分析规范,Hive.tokens定义了词法分析后所有的token。
然后沿着“Driver.compile()->ParseDriver.parse(command, ctx)->HiveParserX.statement()->antlr中的API”这个调用关系把输入的HiveQL转化成ASTNode类型的语法树。HiveParserX是由antlr生成的HiveParser类的子类。
(2)利用对应的SemanticAnalyzer类,将AST树转换成Map-reduce task。主要分为三个步骤:
a) AST -> operator DAG
b) optimize operator DAG
c) oprator DAG -> Map-reduce task
首先接着上一步生成的语法树ASTNode,?SemanticAnalyzerFactory会根据ASTNode的token类型生成不同的SemanticAnalyzer (所有这些SemanticAnalyzer都继承自BaseSemanticAnalyzer)
1) ExplainSemanticAnalyzer
2) LoadSemanticAnalyzer
3) ExportSemanticAnalyzer
4) DDLSemanticAnalyzer
5) FunctionSemanticAnalyzer
6) SemanticAnalyzer
然后调用BaseSemanticAnalyzer.analyze()->BaseSemanticAnalyzer. analyzeInternal()。
下面以最常见的select * from table类型的查询为例,进入的子类是SemanticAnalyzer. analyzeInternal(),这个函数的逻辑如下:
1) doPhase1():将sql语句中涉及到的各种信息存储起来,存到QB中去,留着后面用。
2) getMetaData():获取元数据信息,主要是sql中涉及到的 表 和 元数据 的关联
3) genPlan():生成operator tree/DAG
4) optimize:优化,对operator tree/DAG 进行一些优化操作,例如列剪枝等(目前只能做rule-based optimize,不能做cost-based optimize)
5) genMapRedTasks():将operator tree/DAG 通过一定的规则生成若干相互依赖的MR任务
Execute
将Compile阶段生成的task信息序列化到plan.xml,然后启动map-reduce,在configure时反序列化plan.xml
实例分析:
在hive中有这样一张表:
uid |
fruit_name |
count |
a |
apple |
5 |
a |
orange |
3 |
a |
apple |
2 |
b |
banana |
1 |
执行如下的查询:
SELECT uid, SUM(count) FROM logs GROUP BY uid
通过explain命令可以查看执行计划:
EXPLAIN SELECT uid, SUM(count) FROM logs GROUP BY uid;
依照hive.g的语法规则,生成AST如下:
ABSTRACT SYNTAX TREE: ( TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME logs))) ( TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) ( TOK_SELECT (TOK_SELEXPR (TOK_TABLE_OR_COL uid)) (TOK_SELEXPR (TOK_FUNCTION sum (TOK_TABLE_OR_COL count))) ) (TOK_GROUPBY (TOK_TABLE_OR_COL uid)) ) )
生成的执行计划operator tree/DAG如下:
STAGE DEPENDENCIES: Stage-1 is a root stage Stage-0 is a root stage STAGE PLANS: Stage: Stage-1 Map Reduce Alias -> Map Operator Tree: logs TableScan // 扫描表 alias: logs Select Operator //选择字段 expressions: expr: uid type: string expr: count type: int outputColumnNames: uid, count Group By Operator //在map端先做一次聚合,减少shuffle数据量 aggregations: expr: sum(count) //聚合函数 bucketGroup: false keys: expr: uid type: string mode: hash outputColumnNames: _col0, _col1 Reduce Output Operator //输出key,value给reduce key expressions: expr: _col0 type: string sort order: + Map-reduce partition columns: expr: _col0 type: string tag: -1 value expressions: expr: _col1 type: bigint Reduce Operator Tree: Group By Operator aggregations: expr: sum(VALUE._col0) //聚合 bucketGroup: false keys: expr: KEY._col0 type: string mode: mergepartial outputColumnNames: _col0, _col1 Select Operator //选择字段 expressions: expr: _col0 type: string expr: _col1 type: bigint outputColumnNames: _col0, _col1 File Output Operator //输出到文件 compressed: false GlobalTableId: 0 table: input format: org.apache.hadoop.mapred.TextInputFormat output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat Stage: Stage-0 Fetch Operator limit: -1
Hive优化策略:
1. 去除查询中不需要的column
2. Where条件判断等在TableScan阶段就进行过滤
3. 利用Partition信息,只读取符合条件的Partition
4. Map端join,以大表作驱动,小表载入所有mapper内存中
5. 调整Join顺序,确保以大表作为驱动表
6. 对于数据分布不均衡的表Group by时,为避免数据集中到少数的reducer上,分成两个map-reduce阶段。第一个阶段先用Distinct列进行shuffle,然后在reduce端部分聚合,减小数据规模,第二个map-reduce阶段再按group-by列聚合。
7. 在map端用hash进行部分聚合,减小reduce端数据处理规模。
参考文献:
http://fatkun.com/2013/01/hive-group-by.html
原文地址:Hive SQL解析/执行计划生成流程分析, 感谢原作者分享。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











HQL과 SQL은 Hibernate 프레임워크에서 비교됩니다. HQL(1. 객체 지향 구문, 2. 데이터베이스 독립적 쿼리, 3. 유형 안전성), SQL은 데이터베이스를 직접 운영합니다(1. 데이터베이스 독립적 표준, 2. 복잡한 실행 파일) 쿼리 및 데이터 조작).

Oracle과 DB2는 일반적으로 사용되는 관계형 데이터베이스 관리 시스템으로, 각각 고유한 SQL 구문과 특성을 가지고 있습니다. 이 기사에서는 Oracle과 DB2의 SQL 구문을 비교 및 차이점을 설명하고 구체적인 코드 예제를 제공합니다. 데이터베이스 연결 Oracle에서는 다음 문을 사용하여 데이터베이스에 연결합니다. CONNECTusername/password@database DB2에서 데이터베이스에 연결하는 문은 다음과 같습니다. CONNECTTOdataba

모바일 인터넷의 인기로 인해 Toutiao는 우리나라에서 가장 인기 있는 뉴스 정보 플랫폼 중 하나가 되었습니다. 많은 사용자는 다양한 요구 사항을 충족하기 위해 Toutiao 플랫폼에 여러 계정을 갖고 싶어합니다. 그렇다면 여러 개의 Toutiao 계정을 개설하는 방법은 무엇입니까? 이번 글에서는 터우탸오(Toutiao) 계좌를 여러 개 개설하는 방법과 신청 과정을 자세히 소개하겠습니다. 1. Toutiao 계정을 여러 개 개설하는 방법은 무엇입니까? 여러 개의 Toutiao 계정을 개설하는 방법은 다음과 같습니다. Toutiao 플랫폼에서 사용자는 다양한 휴대폰 번호를 통해 계정을 등록할 수 있습니다. 각 휴대폰 번호는 하나의 Toutiao 계정만 등록할 수 있습니다. 즉, 사용자는 여러 휴대폰 번호를 사용하여 여러 계정을 등록할 수 있습니다. 2. 이메일 등록: 다른 이메일 주소를 사용하여 Toutiao 계정을 등록하세요. 휴대폰 번호 등록과 마찬가지로 각 이메일 주소도 Toutiao 계정을 등록할 수 있습니다. 3. 타사 계정으로 로그인

[PHP 중간점의 의미와 사용법 분석] PHP에서 중간점(.)은 두 개의 문자열이나 객체의 속성이나 메소드를 연결하는 데 사용되는 일반적으로 사용되는 연산자입니다. 이 기사에서는 구체적인 코드 예제를 통해 PHP에서 중간점의 의미와 사용법을 자세히 살펴보겠습니다. 1. 문자열 중간점 연산자 연결 PHP에서 가장 일반적인 사용법은 두 문자열을 연결하는 것입니다. 두 문자열 사이에 .을 배치하면 두 문자열을 이어붙여 새 문자열을 만들 수 있습니다. $string1=&qu

오늘날 빠르게 변화하는 사회에서 수면의 질 문제는 점점 더 많은 사람들을 괴롭히고 있습니다. 사용자의 수면 품질을 향상시키기 위해 Douyin 플랫폼에 특수 수면 앵커 그룹이 등장했습니다. 라이브 방송을 통해 사용자와 소통하고, 수면 팁을 공유하며, 편안한 음악과 사운드를 제공하여 시청자가 편안하게 잠들 수 있도록 도와줍니다. 그렇다면 이러한 수면 앵커는 수익성이 있습니까? 이 기사에서는 이 문제에 중점을 둘 것입니다. 1. Douyin 수면 앵커는 수익성이 있습니까? Douyin 수면 앵커는 실제로 특정 이익을 얻을 수 있습니다. 첫째, 생방송실 내 팁 기능을 통해 선물과 양도를 받을 수 있으며, 이러한 혜택은 팬 수와 시청자 만족도에 따라 달라집니다. 둘째, Douyin 플랫폼은 생방송의 조회수, 좋아요, 공유 및 기타 데이터를 기반으로 앵커에게 특정 공유를 제공합니다. 일부 수면 앵커는 또한

중관촌 뉴스: 4월 18일 오전, 화웨이는 갑자기 P70 시리즈 휴대폰이 파이오니어 플랜에 따라 공식적으로 판매된다고 발표했습니다. 구매를 원하는 친구들은 과거 관행에 따르면 화웨이의 주력 휴대폰을 준비해야 합니다. 인기가 많아 항상 품절 상태입니다. 이번에 Huawei P70 시리즈는 순수함을 의미하는 Pura로 이름이 변경되었습니다. 이전에 Huawei의 Yu Chengdong은 다음과 같이 말했습니다. 2012년부터 Huawei의 P 시리즈 스마트폰은 전 세계 수억 명의 사용자와 함께 수많은 소중한 순간을 보내고 삶의 아름다움과 흥분을 함께 목격하는 충실한 파트너와 같습니다. 그는 화웨이 P 시리즈를 선택하는 모든 사용자가 제공하는 신뢰와 사랑이 화웨이가 혁신의 길에서 굳건히 전진할 수 있도록 항상 격려하는 강력한 원동력과 같다고 깊이 느꼈습니다. 푸라(Pura)는 순수하다는 뜻이다.

제목: DreamWeaver CMS의 보조 디렉터리를 열 수 없는 이유와 해결 방법 분석 Dreamweaver CMS(DedeCMS)는 다양한 웹 사이트 구축에 널리 사용되는 강력한 오픈 소스 콘텐츠 관리 시스템입니다. 그러나 때로는 웹사이트를 구축하는 과정에서 보조 디렉토리를 열 수 없는 상황이 발생할 수 있으며, 이로 인해 웹사이트의 정상적인 작동에 문제가 발생할 수 있습니다. 이 기사에서는 보조 디렉터리를 열 수 없는 가능한 이유를 분석하고 이 문제를 해결하기 위한 구체적인 코드 예제를 제공합니다. 1. 예상 원인 분석: 의사 정적 규칙 구성 문제: 사용 중

Win11의 새로운 기능 분석: Microsoft 계정 로그인을 건너뛰는 방법 Windows 11이 출시되면서 많은 사용자는 Windows 11이 더 편리하고 새로운 기능을 제공한다는 사실을 알게 되었습니다. 그러나 일부 사용자는 시스템을 Microsoft 계정에 연결하는 것을 좋아하지 않아 이 단계를 건너뛰기를 원할 수도 있습니다. 이 문서에서는 사용자가 Windows 11에서 Microsoft 계정 로그인을 건너뛰고 보다 개인적이고 자율적인 환경을 달성하는 데 도움이 되는 몇 가지 방법을 소개합니다. 먼저 일부 사용자가 Microsoft 계정에 로그인하기를 꺼리는 이유를 이해해 보겠습니다. 한편으로는 일부 사용자들은 다음과 같은 걱정을 합니다.
