Hive on Mapreduce
执行流程如下图示
- Step 1:UI(user interface) 调用 executeQuery 接口,发送 HQL 查询语句给 Driver
- Step 2:Driver 为查询语句创建会话句柄,并将查询语句发送给 Compiler, 等待其进行语句解析并生成执行计划
- Step 3 and 4:Compiler 从 metastore 获取相关的元数据
- Step 5:元数据用于对查询树中的表达式进行类型检查,以及基于查询谓词调整分区,生成计划
- Step 6 (6.1,6.2,6.3):由 Compiler 生成的执行计划是阶段性的 DAG,每个阶段都可能会涉及到 Map/Reduce job、元数据的操作、HDFS 文件的操作,Execution Engine 将各个阶段的 DAG 提交给对应的组件执行。
- Step 7, 8 and 9:在每个任务(mapper / reducer)中,查询结果会以临时文件的方式存储在 HDFS 中。保存查询结果的临时文件由 Execution Engine 直接从 HDFS 读取,作为从 Driver Fetch API 的返回内容。
Hive on Spark
hive on Spark是由Cloudera发起,由Intel、MapR等公司共同参与的开源项目,其目的是把Spark作为Hive的一个计算引擎,将Hive的查询作为Spark的任务提交到Spark集群上进行计算。通过该项目,可以提高Hive查询的性能,同时为已经部署了Hive或者Spark的用户提供了更加灵活的选择,从而进一步提高Hive和Spark的普及率。
SparkSQL
SparkSQL作为Spark生态的一员继续发展,而不再受限于Hive,只是兼容Hive;而Hive on Spark是一个Hive的发展计划,该计划将Spark作为Hive的底层引擎之一,也就是说,Hive将不再受限于一个引擎,可以采用Map-Reduce、Tez、Spark等引擎。
SparkSQL的两个组件
- SQLContext:Spark SQL提供SQLContext封装Spark中的所有关系型功能。可以用之前的示例中的现有SparkContext创建SQLContext。
- DataFrame:DataFrame是一个分布式的,按照命名列的形式组织的数据集合。DataFrame基于R语言中的data frame概念,与关系型数据库中的数据库表类似。通过调用将DataFrame的内容作为行RDD(RDD of Rows)返回的rdd方法,可以将DataFrame转换成RDD。可以通过如下数据源创建DataFrame:已有的RDD、结构化数据文件、JSON数据集、Hive表、外部数据库。
注意:hive on spark大体与SparkSQL结构类似,只是SQL引擎不同,但是计算引擎都是spark!
Spark On Hive
Hive只作为存储角色,Spark负责sql解析优化,执行。其实是Spark 通过Spark SQL使用Hive 语句操作Hive表,底层运行的还是 Spark RDD。具体步骤如下:
- 通过SparkSQL,加载Hive的配置文件,获取到Hive的元数据信息
- 获取到Hive的元数据信息之后可以拿到Hive表的数据
- 通过SparkSQL来操作Hive表中的数据
我现在公司所用的spark模式,其实就是spark on hive,底层依赖hive元数据,用Spark自身的SQL引擎解析和优化SQL,用Spark作为计算引擎。
参考