Hive,SQL,MapReduce,Hadoop,Spark等这些关系及理解

    由于数据量巨大,单机无法存储,所以我们需要将用很多台机器存储数据,HDFS(Hadoop Distributed FileSystem)就应用而生,它是专门负责管理这么多台单机之间的数据,你存取数据都是和单机一样的操作流程,但实际上这些数据都是在多台单机上存储的,相当于HDFS是一个帮你管理大数据的界面,你不用管它后面是怎么的关系,只需要在它这儿操作就可以了。光有数据也不行啊,数据我们是要提取信息的,也就是需要计算的,那怎么实现这么多单机之间的协同计算呢?MapReduce / Tez / Spark 就出来了,它说,这种小事我来做,MapReduce是第一代计算引擎,Tez和Spark是第二代。MapReduce虽然好用,但是其代码就像汇编语言一样,为了解放我们的大脑,一种更简单的语言应用而生,这就是Pig和Hive。Pig是接近脚本方式去描述MapReduce,Hive则用的是SQL。但是MapReduce的计算速度确实是非常慢的,对于一些实时性比较强的数据处理,MapReduce计算速度就有点太差劲,于是Impala,Presto,Drill 三个系统就出来了,三个系统的核心理念是,MapReduce引擎太慢,因为它太通用,太强壮,太保守,我们SQL需要更轻量,更激进地获取资源,更专门地对SQL做优化,而且不需要那么多容错性保证(因为系统出错了大不了重新启动任务,如果整个处理时间更短的话,比如几分钟之内)。这些系统让用户更快速地处理SQL任务。

Hive:

1)hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 sql 查询功能,可以将 sql 语句转换为 MapReduce 任务进行运行。可以通过类 SQL 语句快速实现简单的 MapReduce 统计,不必开发专门的 MapReduce 应用,十分适合数据仓库的统计分析。

(2)Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载,这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。

使用 hive 的命令行接口,感觉很像操作关系数据库,但是 hive 和关系数据库还是有很大的不同,下面我就比较下 hive 与关系数据库的区别,具体如下:

  1. Hive 和关系数据库存储文件的系统不同,Hive 使用的是 hadoop 的 HDFS(hadoop 的分布式文件系统),关系数据库则是服务器本地的文件系统;

  2. hive 使用的计算模型是 mapreduce,而关系数据库则是自己设计的计算模型;

  3. 关系数据库都是为实时查询的业务进行设计的,而 Hive 则是为海量数据做数据挖掘设计的,实时性很差;实时性的区别导致 Hive 的应用场景和关系数据库有很大的不同;

  4. Hive 很容易扩展自己的存储能力和计算能力,这个是继承 hadoop 的,而关系数据库在这个方面要比数据库差很多。  

Hive的特点:     

1.Hive不存储数据,Hive需要分析计算的数据,以及计算结果后的数据实际存储在分布式系统上,如HDFS上。

 2.Hive某种程度来说也不进行数据计算,只是个解释器,只是将用户需要对数据处理的逻辑,通过SQL编程提交后解释成MapReduce程序,然后将这个MR程序提交给Yarn进行调度执行。所以实际进行分布式运算的是MapReduce程序。

 3.因为Hive为了能操作HDFS上的数据集,那么他需要知道数据的切分格式,如行列分隔符,存储类型,是否压缩,数据的存储地址等信息。为了方便以后操作所以他需要将这些信息通过一张表存储起来,然后将这张表(元数据)存储到mysql中。

Spark和hive的区别?

Spark现在发展成了一个生态群:spark sql ,spark core,spark mllib,sparkR,spark Graphx

spark是一个独立自主的家伙,它是一个运算引擎,它可以从各种各样的数据源读取数据,来做运算,然后可以将运算结果写入各种各样的存储系统中,hive是一个资源整合者,它自己并不没有核心的功能,它提供sql语法的解析,然后转成MapReduce或者spark或者tez等程序,去执行。

spark sql和hive是同一性质的

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可以部署。

二、关于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表、外部数据库。

hive是分布式又是数据仓库,同时又是查询引擎,Spark SQL只是取代的HIVE的查询引擎这一部分,企业一般使用Hive+spark SQL进行开发, Hive:负责廉价的数据仓库存储,Spark Sql:负责高速的计算

使用示例

编写简单的scala程序,从文本文件中加载用户数据并从数据集中创建一个DataFrame对象。然后运行DataFrame函数,执行特定的数据选择查询。

文本文件customers.txt中的内容如下:

Tom,12
Mike,13
Tony,34
Lili,8
David,21
Nike,18
Bush,29
Candy,42

编写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/data/input2.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()

        // 将DataFrame注册为一个表
        people.registerTempTable("people")

        // 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/data/input2.txt' 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大致上都是做了上面这样的工作。

需要理解的是,Hiveql和SparkSQL都不负责计算,它们只是告诉Spark,你需要这样算那样算,但是本身并不直接参与计算。

 

Presto和MySQL的区别?

Presto本身不存储数据,但是可以接入多种数据源,并且支持跨数据源的级联查询。MySQL首先是一个单点关系型数据库,其具有存储和计算分析能力,而Presto只有计算分析能力;在数据量方面,MySQL不能满足当前大数据量的分析需求,Hive是一个数据仓库,只能访问hdfs的数据;Presto是一个交互式查询引擎,可以在很短的时间内返回查询结果,但是Presto是取代不了Hive的,因为Presto全部的数据都是在内存中,限制了在内存中的数据集大小,实际应用中,对于在Presto的查询是有一定规定条件的,比如说一个查询在Presto查询超过30分钟,说明不适合在Presto上使用,主要原因是,查询过大的话,会占用整个集群的资源,这会导致你后续的查询是没有资源进行查询的,这跟Presto的设计理念是冲突的,就像是你进行一个查询,但是要等个5分钟才有资源继续查询,这是很不合理的,交互式就变得弱了很多。当数据量较大时,可用SparkSQL进行建表,查询,关联等;

Hadoop是什么呢?

Hadoop的核心是HDFS和MapReduce,一个提供了存储,一个提供了计算,核心框架如下所示:

 

Hadoop的生态图 

hadoop的详细介绍可以参考:https://www.zhihu.com/question/23036370 

参考:https://cloud.tencent.com/developer/article/1042387

          https://www.maiyewang.com/archives/19387

         https://blog.csdn.net/yilulvxing/article/details/86220888

          https://www.zhihu.com/question/329052025/answer/979123167

          https://blog.csdn.net/qq_38603049/article/details/100712580

https://blog.csdn.net/yeruby/article/details/51448188

 

 

 

 

 

 

 

  • 10
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值