大数据 | Hadoop Hive Spark简介

1 前言

之前就一直想总结这个系列,但由于种种原因拖延至今,昨晚京东深圳电话二面就问到了Map-Reduce原理,所以赶紧总结一波!

2 什么是Hadoop?

2.1 定义

  • Hadoop是一个开源的框架,可编写和运行分布式应用处理大规模数据,是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式。
  • Hadoop=HDFS(文件系统,数据存储技术相关)+ Mapreduce(数据处理)
  • Hadoop的数据来源可以是任何形式,在处理半结构化和非结构化数据上与关系型数据库相比有更好的性能,具有更灵活的处理能力,不管任何数据形式最终会转化为key/value,key/value是基本数据单元
  • 用函数式变成Mapreduce代替SQL,SQL是查询语句,而Mapreduce则是使用脚本和代码,而对于适用于关系型数据库,习惯SQL的Hadoop有开源工具hive代替。
  • 总结:Hadoop就是一个分布式计算的解决方案.

在这里插入图片描述

2.2 解释Map-Reduce的原理

通过上述定义可以知道,Hadoop的框架最核心的设计就是:HDFS和MapReduce

  • HDFS(Hadoop的分布式文件系统 Hadoop Distributed File System)为海量的数据提供了存储
  • MapReduce则为海量的数据提供了计算

那究竟MapReduce是什么样一个计算过程呢?

首先上两张图展示MapReduce的过程:
在这里插入图片描述
在这里插入图片描述
结合上述两张图可以看出MapReduce的过程:
在这里插入图片描述

首先将任务分成不同的子任务,最后再将子任务的结果进行合并!对于每一个子任务都需要进行下面的3步操作:

  1. map操作。将单词进行切分,然后建立一个key-value的map。map的输出结果则是k-v,key为词汇,value则是词汇的个数
  2. shuffle操作。将相同的key对应的k-v对输出到同一个工作节点。
  3. reduce操作。对k-v对中同一个key对应的value值进行合并,并输出。
    在这里插入图片描述
    在这里插入图片描述

更加具体一点,可以分为5步操作:

  • 任务分解。Hadoop将输入数据切分成不同部分,并将每个split交给一个map task处理
  • Map操作。Map后会得到这个task里面每个词以及它出现的次数。即一个k-v对
  • Shuffle操作。将相同的词放在一起,并对他们进行排序,分成若干个部分。即将同一个key的k-v对分发到同一个work节点
  • Reduce操作。将上述Shuffle的输出结果进行汇总。即对同一个k的value值进行求和汇总并输出。
  • 统计结果。统计reduce task的结果,输出到文件。

注:Map -> Shuffle -> Reduce 的中间结果,包括最后的输出都是存储在本地磁盘上。

2.3 MapReduce的优缺点

优点:

  • 极强的扩展能力,可以在数千台机器上并发的执行。
  • 有很好的容错性
  • 向上的接口简洁。用户只需要写map和reduce函数,即可完成大规模数据的并行处理。

缺点:

  • 不适合对实时性要求比较高的场景,比如交互式查询或者是流式计算(因为mapreduce的启动时间比较长)
  • 不适合迭代类的计算(比如机器学习类的应用)(因为mapreduce一次执行的过程里面,往往涉及到多次磁盘读写,以及网络的传输,迭代过程需要这样的开销多次,明显降低效率)

2.4 什么是HBase?

  • Hbase是基于Hadoop的数据库
  • HBase是一种构建在HDFS之上的分布式、面向列的存储系统。在需要实时读写、随机访问超大规模数据集时,可以使用HBase。

3 Hive是啥?

3.1 为什么有SQL还要Hive?

当我们接触到Hive的时候,会发现它的语句和SQL非常类似,实现的功能也是一致,所以我们就有疑问了,为什么有了SQL还要Hive呢?

  • 为什么有了SQL还需要hive查询?因为数据量太大了,直接SQL太慢了,所以开发了Hadoop框架,但是Hadoop的mapper和readucer函数太难写了,所以转为了友好的hive,直接写HiveQL,但是底层是MapReduce的过程

3.2 什么是Hive?

那究竟什么是Hive呢?

  • Hive是基于Hadoop的数据仓库工具,可以存储,查询,分析数据,方便决策人员和数据分析人员统计分析历史数据
  • Hive可以借助查询语言SQL将HDFS上存储的结构化文件映射成一张数据库表,并提供类SQL查询功能
  • 本质是将浅学易懂的SQL转换为MapReduce程序,避免编写复杂的MapReduce程序

3.3 Hive优缺点

那么Hive的优缺点是啥呢?

优点:

  • 简单容易上手:提供了类SQL查询语言HQL。
  • 定位是数据仓库偏向数据分析和计算方向
  • 可扩展:为超大数据集设计了计算/扩展能力(MR作为计算引擎,HDFS作为存储系统)
  • 延展性:Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数
  • 容错:良好的容错性,节点出现问题SQL仍可完成执行。有主有从。当主机挂掉,备机马上启动。即【高可用】单点故障。
  • 多接口。Beeline,JDBC,Thrift,Python,Rest

缺点:

  • hive的效率比较低,延迟较高。默认为M/R为执行引擎,启动有延迟
  • hive的HQL表达能力有限。(迭代式算法无法表达,比如pagerank)

3.4 Hive应用场景

应用场景:

  • 数据挖掘
    • 用户行为分析
    • 兴趣分区
    • 区域展示
  • 非实时分析
    • 日志分析
    • 文本分析
  • 数据汇总
    • 每天/周用户点击情况
    • 流量统计
  • 作为数据仓库
    • 数据抽取
    • 数据加载
    • 数据转换

4 Spark又是啥?

4.1 基本定义

在这里插入图片描述

  • Spark是一个基于内存计算的开源的集群计算系统,目的是让数据分析更加快速。
  • spark的一个主要特点是能够在内存中进行计算,及时依赖磁盘进行复杂的运算,Spark依然比MapReduce更加高效
  • Spark拥有多种语言的函数式编程API,提供了除map和reduce之外更多的运算符,这些操作是通过一个称作弹性分布式数据集(resilient distributed datasets, RDDs)的分布式数据框架进行的
  • 由于RDD可以被缓存在内存中,Spark对迭代应用特别有效,因为这些应用中,数据是在整个算法运算过程中都可以被重用。大多数机器学习和最优化算法都是迭代的,使得Spark对数据科学来说是个非常有效的工具

4.2 Spark的核心组件

Spark库本身包含很多应用元素,这些元素可以用到大部分大数据应用中,其中包括对大数据进行类似SQL查询的支持,机器学习和图算法,甚至对实时流数据的支持。核心组件如下:

  • Spark Core:包含Spark的基本功能;尤其是定义RDD的API、操作以及这两者上的动作。其他Spark的库都是构建在RDD和Spark Core之上的。
  • Spark SQL:提供通过Apache Hive的SQL变体Hive查询语言(HiveQL)与Spark进行交互的API。每个数据库表被当做一个RDD,Spark SQL查询被转换为Spark操作。对熟悉Hive和HiveQL的人,Spark可以拿来就用。
  • Spark Streaming:允许对实时数据流进行处理和控制。很多实时数据库(如Apache Store)可以处理实时数据。Spark Streaming允许程序能够像普通RDD一样处理实时数据。
  • MLlib:一个常用机器学习算法库,算法被实现为对RDD的Spark操作。这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作。之前可选的大数据机器学习库Mahout,将会转到Spark,并在未来实现。
  • GraphX:控制图、并行图操作和计算的一组算法和工具的集合。GraphX扩展了RDD API,包含控制图、创建子图、访问路径上所有顶点的操作。

由于这些组件满足了很多大数据需求,也满足了很多数据科学任务的算法和计算上的需要,Spark快速流行起来。不仅如此,Spark也提供了使用Scala、Java和Python编写的API;满足了不同团体的需求,允许更多数据科学家简便地采用Spark作为他们的
大数据解决方案。

4.3 Spark的优势

总结:

  • 中间结果输出:基于MapReduce的计算引擎通常会将中间结果输出到磁盘上,进行存储和容错。出于任务管道承接的,考虑,当一些查询翻译到MapReduce任务时,往往会产生多个Stage,而这些串联的Stage又依赖于底层文件系统(如HDFS)来存储每一个Stage的输出结果。

  • Spark是MapReduce的替代方案,而且兼容HDFS、Hive,可融入Hadoop的生态系统,以弥补MapReduce的不足

具体来说:

  • Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。
  • Spark 是为集群计算中的特定类型的工作负载而设计,即那些在并行操作之间重用工作数据集(比如机器学习算法)的工作负载。为了优化这些类型的工作负载,Spark 引进了内存集群计算的概念,可在内存集群计算中将数据集缓存在内存中,以缩短访问延迟
  • 引进了名为弹性分布式数据集(RDD) 的抽象。RDD 是分布在一组节点中的只读对象集合。这些集合是弹性的,如果数据集一部分丢失,则可以对它们进行重建。重建部分数据集的过程依赖于容错机制,该机制可以维护 “血统”(即允许基于数据衍生过程重建部分数据集的信息)。RDD 被表示为一个 Scala 对象,并且可以从文件中创建它;一个并行化的切片(遍布于节点之间);另一个 RDD 的转换形式;并且最终会彻底改变现有 RDD 的持久性,比如请求缓存在内存中。
  • Spark基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的map reduce的算法

四大特性:

  • 高效性。比Hadoop运行速度提高100倍。
  • 易用性。Spark支持Java、Python和Scala的API,还支持超过80种高级算法,使用户可以快速构建不同的应用。
  • 通用性。Spark提供了统一的解决方案。Spark可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)。这些不同类型的处理都可以在同一个应用中无缝使用。
  • 兼容性。Spark可以非常方便地与其他的开源产品进行融合。

4.4 Spark和Hadoop的对比?

  • 迭代运算效率更高。Spark的中间数据放到内存中,对于迭代运算效率更高。即Spark更适合于迭代运算比较多的ML(机器学习)和DM(数据挖掘)运算。因为在Spark里面,有RDD的抽象概念。
  • Spark比Hadoop更通用
  • Spark提供的数据集操作类型有很多种,不像Hadoop只提供了Map和Reduce两种操作。比如map, filter, flatMap, sample, groupByKey, reduceByKey, union, join, cogroup, mapValues, sort,partionBy等多种操作类型,Spark把这些操作称为Transformations。同时还提供Count, collect, reduce, lookup, save等多种actions操作。

Spark与Hadoop的结合:

  • Spark可以直接对HDFS进行数据的读写,同样支持Spark on YARN。
  • Spark可以与MapReduce运行于同集群中,共享存储资源与计算,数据仓库Shark实现上借用Hive,几乎与Hive完全兼容。

4.5 应用场景

  • 适用于机器学习迭代算法。Spark是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。需要反复操作的次数越多,所需读取的数据量越大,受益越大,数据量小但是计算密集度较大的场合,受益就相对较小(大数据库架构中这是是否考虑使用Spark的重要因素
  • 由于RDD的特性,Spark不适用那种异步细粒度更新状态的应用,例如web服务的存储或者是增量的web爬虫和索引。就是对于那种增量修改的应用模型不适合

5 案例补充思考

如果想统计下过去10年统计学论文出现最多的几个单词,看看大家都在研究些什么,那收集好论文后,该怎么办呢?

  • 方法1:遍历所有论文统计单词次数

    • 操作:写一个程序,把所有论文按顺序遍历一遍,统计每一个遇到的单词的出现次数,最后就可以知道哪几个单词最热门了。
    • 评价:数据集比较小时,是非常有效的,而且实现最简单,用来解决这个问题很合适。 但数据集大了效率太低。
  • 方法2:Python多进程的方式进行处理

    • 操作:采用多进程,一个进程处理一部分论文,多进程同时开始计数,最后将各自统计结果进行汇总!
    • 评价:保证电脑是有多个GPU;但是代码实现难度会有一些
  • 方法3: 把作业交给多个计算机去完成

    • 操作:可以使用方法1的程序,部署到N台机器上去,然后把论文集分成N份,一台机器跑一个作业。
    • 评价:这个方法跑得足够快,但是部署起来很麻烦,我们要人工把程序copy到别的机器,要人工把论文集分开,最痛苦的是还要把N个运行结果进行整合(当然我们也可以再写一个程序)。
  • 方法4:MapReduce进行处理

参考

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值