SparkSQL与HiveonSpark的⽐较
简要介绍了SparkSQL与Hive on Spark的区别与联系
⼀、关于Spark
简介
在Hadoop的整个⽣态系统中,Spark和MapReduce在同⼀个层级,即主要解决分布式计算框架的问题。
架构
Spark的架构如下图所⽰,主要包含四⼤组件:Driver、Master、Worker和Executor。
Spark特点
Spark可以部署在YARN上
Spark原⽣⽀持对HDFS⽂件系统的访问
使⽤Scala语⾔编写
部署模型
1. 单机模型:主要⽤来开发测试。特点:Driver、Master、Worker和Executor都运⾏在同⼀个JVM进程之中。
2. 伪集模型:主要⽤来开发测试。特点:Master、Worker都运⾏在同⼀个JVM进程之中;Master、Worker和Executor都运⾏于同
⼀台机器,⽆法跨机器运⾏;
3. 独⽴集(⼜叫做原⽣集模式):在集规模不是⾮常⼤的情况下,可⽤于⽣产环境。特点:Master、Worker和Executor都运⾏
于独⽴的JVM进程。
4. YARN集:YARN⽣态中的ApplicationMaster⾓⾊使⽤Apache开发好的Spark ApplicationMaster代替,每⼀个YARN⽣态中的
NodeManager⾓⾊相当于⼀个Spark⽣态中的Worker⾓⾊,由NodeManger负责Executor的启动。
5. Mesos集:暂⽆详细调研。
测试
经过测试,在宿主系统为CentOS6.5上(3个节点),hadoop2.7.1 + hive1.2.1(pg为元数据库) + sqoop + flume1.6.0 + spark1.5.0可以部署。hive trim函数
⼆、关于Spark SQL
简介
它主要⽤于结构化数据处理和对Spark数据执⾏类SQL的查询。通过Spark SQL,可以针对不同格式的数据执⾏ETL操作(如
JSON,Parquet,数据库)然后完成特定的查询操作。⼀般来说,Spark每⽀持⼀种新的应⽤开发,都会引⼊⼀个新的Context及相应的RDD,对于SQL这⼀特性来说,引⼊的就是SQLContext和SchemaRDD。注意:在Spark1.3之后,SchemaRDD已经更名为DataFrame,但它本质就类似⼀个RDD,因为可以将DataFrame⽆缝的转换成⼀个RDD。
架构
Spark要很好的⽀持SQL,要完成解析(parser)、优化(optimizer)、执⾏(execution)三⼤过程。
处理顺序⼤致如下:
1. SQlParser⽣成LogicPlan Tree;
2. Analyzer和Optimizer将各种Rule作⽤于LogicalPlan Tree;
3. 最终优化⽣成的LogicalPlan⽣成SparkRDD;
4. 最后将⽣成的RDD交由Spark执⾏;
Spark SQL的两个组件
1. SQLContext:Spark SQL提供SQLContext封装Spark中的所有关系型功能。可以⽤之前的⽰例中的现有SparkContext创建
SQLContext。
2. DataFrame:DataFrame是⼀个分布式的,按照命名列的形式组织的数据集合。DataFrame基于R语⾔中的data frame概念,与关
系型数据库中的数据库表类似。通过调⽤将DataFrame的内容作为⾏RDD(RDD of Rows)返回的rdd
⽅法,可以将DataFrame转换成RDD。可以通过如下数据源创建DataFrame:已有的RDD、结构化数据⽂件、JSON数据集、Hive表、外部数据库。
使⽤⽰例
编写简单的Scala程序,从⽂本⽂件中加载⽤户数据并从数据集中创建⼀个DataFrame对象。然后运⾏DataFrame函数,执⾏特定的数据选择查询。
⽂本⽂件中的内容如下:
Tom,12
Mike,13
Tony,34
Lili,8
David,21
Nike,18
Bush,29
Candy,4
编写Scala代码:
import org.apache.spark._
object Hello {
// 创建⼀个表⽰⽤户的⾃定义类
case class Person(name: String, age: Int)
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("SparkSQL Demo")
val sc = new SparkContext(conf)
// ⾸先⽤已有的Spark Context对象创建SQLContext对象
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
// 导⼊语句,可以隐式地将RDD转化成DataFrame
import sqlContext.implicits._
// ⽤数据集⽂本⽂件创建⼀个Person对象的DataFrame
val people = sc.textFile("/Users/urey/").map(_.split(",")).map(p => Person(p(0), p(1).Int)).toDF()
// 将DataFrame注册为⼀个表
// SQL查询
val teenagers = sqlContext.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19")
// 输出查询结果,按照顺序访问结果⾏的各个列。
teenagers.map(t => "Name: " + t(0)).collect().foreach(println)
sc.stop()
}
}
如上所⽰,Spark SQL提供了⼗分友好的SQL接⼝,可以与来⾃多种不同数据源的数据进⾏交互,⽽且所采⽤的语法也是团队熟知的SQL 查询语法。这对于⾮技术类的项⽬成员,如数据分析师以及数据库管理员来说,⾮常实⽤。
⼩结
我们了解到Apache Spark SQL如何⽤熟知的SQL查询语法提供与Spark数据交互的SQL接⼝。Spark SQL是⼀个功能强⼤的库,组织中的⾮技术团队成员,如业务分析师和数据分析师,都可以⽤Spark SQL执⾏数据分析。
三、关于Hive on Spark
背景
Hive on Spark是由Cloudera发起,由Intel、MapR等公司共同参与的开源项⽬,其⽬的是把Spark作为Hive的⼀个计算引擎,将Hive的查询作为Spark的任务提交到Spark集上进⾏计算。通过该项⽬,可以提⾼Hive查询的性能,同时为已经部署了Hive或者Spark的⽤户提供了更加灵活的选择,从⽽进⼀步提⾼Hive和Spark的普及率。
简介
Hive on Spark是从Hive on MapReduce演进⽽来,Hive的整体解决⽅案很不错,但是从查询提交到结果返回需要相当长的时间,查询耗时太长,这个主要原因就是由于Hive原⽣是基于MapReduce的,那么如果我们不⽣成MapReduce Job,⽽是⽣成Spark Job,就可以充分利⽤Spark的快速执⾏能⼒来缩短HiveQL的响应时间。
Hive on Spark现在是Hive组件(从Hive1.1 release之后)的⼀部分。
与SparkSQL的区别
SparkSQL和Hive On Spark都是在Spark上实现SQL的解决⽅案。Spark早先有Shark项⽬⽤来实现SQL层,不过后来推翻重做了,就变成了SparkSQL。这是Spark官⽅Databricks的项⽬,Spark项⽬本⾝主推的SQL实现。Hive On Spark⽐SparkSQL稍晚。Hive原本是没有很好⽀持MapReduce之外的引擎的,
⽽Hive On Tez项⽬让Hive得以⽀持和Spark近似的Planning结构(⾮MapReduce的DAG)。所以在此基础上,Cloudera主导启动了Hive On Spark。这个项⽬得到了IBM,Intel和MapR的⽀持(但是没有Databricks)。
使⽤⽰例
⼤体与SparkSQL结构类似,只是SQL引擎不同。部分核⼼代码如下:
val hiveContext = new HiveContext(sc)
import hiveContext._
hql("CREATE TABLE IF NOT EXIST src(key INT, value STRING)")
hql("LOAD DATA LOCAL PATH '/Users/urey/' INTO TABLE src")
hql("FROM src SELECT key, value").collect().foreach(println)
⼩结
结构上Hive On Spark和SparkSQL都是⼀个翻译层,把⼀个SQL翻译成分布式可执⾏的Spark程序。⽐
如⼀个SQL:
SELECT item_type, sum(price)
FROM item
GROUP item_type;
上⾯这个SQL脚本交给Hive或者类似的SQL引擎,它会“告诉”计算引擎做如下两个步骤:读取item表,抽出item_type,price这两个字段;对price计算初始的SUM(其实就是每个单独的price作为⾃⼰的SUM)因为GROUP BY说需要根据item_type分组,所以设定shuffle的key为item_type从第⼀组节点分组后分发给聚合节点,让相同的item_type汇总到同⼀个聚合节点,然后这些节点把每个组的Partial Sum再加在⼀起,就得到了最后结果。不管是Hive还是SparkSQL⼤致上都是做了上⾯这样的⼯作。
需要理解的是,Hive和SparkSQL都不负责计算,它们只是告诉Spark,你需要这样算那样算,但是本⾝并不直接参与计算。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。