`
samuschen
  • 浏览: 407727 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

hive 源码结构分析(编译器)

    博客分类:
  • hive
阅读更多

      Hive 是将 SQL 语句转换成 hadoop MapReduce 程序,通常在客户端执行 hive 命令,然后输入 SQL 语句后, hive SQL 语句生成多个 MR job ,然后将这些 job 提交给 hadoop 进行执行,完成后,再把结果放入到 hdfs 或者本地的临时文件中。 Hive 中的表结构信息都是保存在关系型数据库中,如 mysql,derby 等,可以通过 hive-site.xml 中配置数据库的 URL, 用户名,密码等。而表的实际数据内容保存在 hadoop hdfs 文件中,行和列数据分别用特殊字符串分格开,以便能够读取数据,默认是用 ctrl+a \n 来分隔。

       客户 / 服务器通信:由 org.apache.hadoop.hive.ql 包中的 Driver 类来完成,该类主要有一个 run(command) 方法,而该方法主要有二个方法组成:

int ret = compile(command); 此方法主要完成语法,语义,计划生成。

ret = execute(); 执行物理计划,即提交相应的 job hadoop 进行执行。

执行完成后,会将执行结果通过 CommandProcessorResponse 类包装返回给客户端。

另外,在hive 中,提供本地直接运行hive 命令,也提交了jdbc 访问。具体实现分别在对应的包里。

       语法分析器:将 sql 语句转换成一颗语法树,像编译原理书上讲的,其实就是一个普通树,只不过这颗保存了 sql 语句的结构,而 hive 是用 anltr 自动生成的语法树。分别由 org.apache.hadoop.hive.ql.parse 包中的HiveLexerHiveParser 完成词法和语法分析工作。

       语义分析:根据不同的类型的语句生成不同的语法,所以有个抽象语义分析类 BaseSemanticAnalyzer ,分别有以下子类,对应于不同类型的语句:

ExplainSemanticAnalyzer

ExplainSemanticAnalyzer

LoadSemanticAnalyzer

DDLSemanticAnalyzer

FunctionSemanticAnalyzer

SemanticAnalyzer

       语义分析完成后,会将语句中的相应信息放入到 org.apache.hadoop.hive .ql.plan 包中 *Desc 类中,这些类记录了相应语句的基本信息。

       然后会对语义完了的信息进行验证,比如表是否存在,字段是否存在,这时需要查询元数据,同时将表的相关信息放到 desc 对象中。

逻辑计划生成器:根据语义分析后的相关信息,将生成出逻辑操作树,抽象类为 Operator 。子类有:

ExtractOperator

FilterOperator

ForwardOperator

GroupbyOperator

LateralViewJoinOperator

LimitOperator

MapOperator

ScriptOperator

SelectOperator

TableScanOperator

TerminalOperator-Base Class

FileSinkOperator

ReduceSinkOperator

UDTFOperator

UnionOperator

计划优化器:将操作树进行一些优化,主要是基于规则的优化。这部分,这次我略过了,下次再讲解。

物理计划生成器:根据逻辑操作树生成出物理计划树,这个物理计划是由 Task 对象来包装的,而 Task 类会有一个 Work 对象, Work 类是物理计划的描述,当 task 对象执行时,通常需要用到 work 对象上的相关信息。

Work 子类有:

FetchWork 

MoveWork

MapredWork

CopyWork

DDLWork

FunctionWork

ExplainWork

ConditionalWork

物理计划执行器:就是将一颗含有 Task 类对象的树,进行从上到下执行。分别调用该对象的 execute() 方法,而该方法会完成相应的物理计划执行工作。主要有:

FetchTask

ConditionalTask

CopyTask

DDLTask

ExplainTask

MapRedTask

MoveTask

每个类都表示一种物理计划。如 FetchTask 就是从 hdfs 或者本地文件中取出表或视图的记录。

       总结, Hive 跟大多数的关系数据库类似的,有相同的步骤来完成从语句到最后物理执行。不同的是 Hive 的执行是在 hadoop MR 程序来执行。同时在这个过程中的,操作类,计划类都是由 Java 对象来包装起来,且可以序列化的,相信其他数据库的计划也是某种语言的对象来保存的。

 

分享到:
评论
1 楼 fuyanqing03 2011-12-01  
请教一个问题,当我执行下面这个HQL:
FROM (
  FROM src
   MAP value, key
USING 'java -cp ${system:build.dir}/hive-contrib-${system:hive.version}.jar org.apache.hadoop.hive.contrib.mr.example.IdentityMapper'
    AS k, v
CLUSTER BY k) map_output
  REDUCE k, v
   USING 'java -cp ${system:build.dir}/hive-contrib-${system:hive.version}.jar org.apache.hadoop.hive.contrib.mr.example.WordCountReduce'
   AS k, v;

报错:Caused by: java.io.IOException: Cannot run program "java": java.io.IOException: error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
at org.apache.hadoop.hive.ql.exec.ScriptOperator.processOp(ScriptOperator.java:279)
... 14 more


但是改成local模式的时候是没问题的。

相关推荐

    hive源码分析

    ### Hive源码分析 #### 背景与概述 Hive是Facebook开发的一款数据仓库工具,用于处理存储在Hadoop文件系统中的大量数据集。它通过提供SQL-like语言HiveQL来简化对这些数据的查询过程。本文将深入剖析Hive 0.7.1...

    hive2.0源码

    学习Hive源码有助于理解其内部运作机制,从而更好地优化查询、开发自定义功能或修复问题。通过分析`metastore/src`, `ql/src`, `serde/src`, `exec/src`等目录下的代码,我们可以逐步揭示Hive如何处理元数据、解析...

    hive1.2.2源代码

    四、Hive源码分析 深入理解Hive 1.2.2源代码有助于我们了解其内部工作机制,例如,解析器如何将SQL语句转化为执行计划,优化器如何优化查询,以及执行器如何将计划转化为实际的分布式计算任务。源代码中包含了各种...

    Hive 入门教程-Apache Hive入门介绍与HQL语法解析

    3. **获取 Hive 源码或可执行代码**:可以通过下载最新的发布包或从 Git 仓库克隆源代码。 4. **配置 Hive**:设置 Hive 如何连接到 Hadoop 和数据库。 5. **启动 Hive**:成功配置后,可以通过命令行界面启动 Hive...

    apache-hive-2.0.0

    总的来说,Apache Hive 2.0.0 是一个强大的大数据分析工具,它的源码提供了丰富的学习资源,不仅能够帮助你掌握大数据处理的基本原理,还可以深入了解分布式计算和数据仓库的设计思想。无论是为了职业发展还是个人...

    hive安装

    (1)**下载Hive**:从Apache官方网站获取最新稳定版的Hive源码或二进制包。 (2)**解压并配置Hive**: - 解压缩到指定目录,例如 `/usr/local/hive`。 - 编辑 `conf/hive-env.sh`,设置Hive的环境变量,如...

    数据仓库基础构架_-_Hive随谈

    3. 获取Hive的源码或者可执行文件,并进行解压。 4. 根据需要配置Hive,以便它能够访问数据库和Hadoop。 5. 运行Hive,并在看到提示符“Hive>”后,即可开始使用Hive执行数据仓库的相关任务。 Hive的体系结构主要...

    Ttrift 访问hive的php客户包

    7. **处理返回数据**:Ttrift会将Hive查询结果转换为PHP可读的数据结构,如数组或对象,你可以进一步处理这些数据,例如进行数据解析、展示或分析。 在实际应用中,Ttrift不仅提供了基本的查询功能,还支持更复杂的...

    apache-hive-1.1.1-src.tar

    Apache Hive 是一个基于 Hadoop 的数据仓库工具,用于查询、管理和分析大数据集。Hive 提供了一种结构化的数据模型,使得非编程背景的用户也能通过 SQL-like 的语言(称为 HiveQL)对海量数据进行操作。`apache-hive...

    apache-hive-3.1.2-src.tar.gz

    解压 `apache-hive-3.1.2-src` 后,你可以看到 Hive 的源代码结构,包括解析器、编译器、优化器和执行器等模块。通过阅读和修改源代码,开发者可以定制 Hive 行为,比如实现新的 UDF(用户定义函数)、UDAF(用户...

    大数据系列4:Hive – 基于HADOOP的数据仓库

    3. **编译器**:接收到HiveQL后,编译器会将其转化为一系列的MapReduce任务,这个过程包括词法分析、语法分析和逻辑优化。 4. **执行器**:生成的MapReduce任务由Hadoop集群执行,处理实际的数据。 5. **HDFS**:...

    HiveQL源码

    开发者可以深入研究Hive源码,学习如何与Hadoop生态中的其他组件如HDFS、YARN和Zookeeper进行交互,以及如何实现自定义函数(UDF)、自定义聚合函数(UDAF)和自定义分区函数(UDTF)。 总之,HiveQL的源码分析是...

    hadoop的数据仓库hive手册

    2. **元数据存储**: Hive 使用关系型数据库(如 MySQL 或 Derby)来存储表结构、列定义、分区信息等元数据信息。 3. **解析器、编译器、优化器和执行器**: - **解析器**: 负责将 HiveQL 查询语句解析成抽象语法树 ...

    hive 资料

    5. **Hive 源码分析**: - **解析器(Parser)**:将 SQL 语句转化为抽象语法树(AST)。 - **编译器(Compiler)**:生成执行计划,包括逻辑计划和物理计划。 - **优化器(Optimizer)**:根据成本模型选择最佳...

    源码安装hadoop需要的资源集合

    Hadoop不仅仅是HDFS和MapReduce,还包括其他组件,如HBase(分布式数据库)、Hive(数据仓库工具)、Pig(数据分析工具)等。了解整个生态系统可以帮助更好地理解和利用Hadoop。 8. **版本差异**: Hadoop 2.4.1...

    Spark2.2版本内核源码深度剖析.zip.zip

    源码分析可能涉及Spark SQL的解析器、编译器和执行器的实现,以及如何与Hive、Parquet等数据源进行交互。 Spark Streaming是Spark对实时流处理的支持,它通过微批处理来处理连续的数据流。2.2版本可能优化了流处理...

    血缘关系解析工具源码_对hql集合进行静态分析_获取hql对应的血缘图.zip

    本资源提供的是一款血缘关系解析工具的源码,它专注于对HQL(Hive Query Language)集合进行静态分析,以获取HQL查询对应的血缘图。HQL是Apache Hive的查询语言,用于处理大数据集,常用于ETL(提取、转换、加载)...

    hive:因此,我们必须关闭HIVE思维,然后再重新打开。 好吧,它通常可以在我的电脑上使用

    Hive提供了一个SQL-like接口,使得用户可以对存储在Hadoop文件系统(HDFS)上的大量结构化数据进行复杂的查询和分析,从而实现数据可视化。由于提到“孵化”,这可能意味着Hive项目在发布时可能仍处于活跃开发阶段,...

    Learning Spark SQL_source_code - Aurobindo Sarkar

    7. **源码分析**:通过对Spark SQL源码的剖析,理解其内部工作原理,如数据处理流程、查询优化、执行计划生成等。 8. **案例实践**:通过实际项目案例,演示如何在生产环境中应用Spark SQL解决大数据问题。 通过...

    spark-1.6.3.zip

    此外,Spark SQL还支持Hive的兼容性,使得Hive用户能够无缝地迁移到Spark。 3. **Spark Streaming**:Spark Streaming处理来自各种数据源的实时流数据。它使用Discretized Streams (DStreams)来表示连续的数据流,...

Global site tag (gtag.js) - Google Analytics