Hadoop,Spark,Hive的一些知识复习

Hadoop包括两个部分:分布式存储(HDFS)和分布式计算mr
Spark与Hadoop最大的区别是mapreduce的job的中间输出结果可以保存在内存中,不需要读写HDFS,是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。

mapreduce作业运行机制

经典的mapreduce(mapreduce1)


客户端,提交mapreduce作业;jobtracker,协调作业的运行;tasktracker,运行作业划分后的任务;分布式文件系统,如HDFS。

失败:任务运行失败;tasktracker失败;jobtracker失败,单点故障,没有处理机制。

Yarn(mapreduce2)

YARN将jobtracker的职能划分为多个独立的实体,jobtracker负责作业调度和任务进度监视,追踪任务、重启失败或过慢的任务和进行任务登记。YARN将这两种角色划分为两个独立的守护进程:管理集群资源使用的资源管理器(resource manager,RM)和管理集群上运行任务生命周期的应用管理器(application master,AM)。节点管理器node manager,管理每个节点上的资源和任务:定期向RM汇报该节点的资源使用情况和各个container(Yarn为资源隔离提出的框架,每一个任务对应一个Container,且只能在该container中运行)的运行状态;接受并处理AM的作业启动、停止等请求。


与jobtracker不同,应用的每个实例(指一个mapreduce作业)有一个专用的应用master,运行在应用的运行期间。

提交MapReduce作业的客户端;YARN资源管理器,负责协调集群上计算资源的分配;YARN节点管理器,负责启动和监视集群中机器上的计算容器;Mapreduce应用程序master负责协调运行MapReduce作业的任务,它和mapreduce任务在容器中运行,这些容器由资源管理器分配并由节点管理器进行管理;分布式文件系统。

失败:任务运行失败,application master失败,节点管理器,资源管理器失败

shuffle和排序 


MapReduce确保每个reducer的输入都是按键排序的。系统执行排序的过程(即将map输出作为输入传给reducer)称为shuffle。map函数开始产生输出时,并不是简单地将它写到磁盘,利用缓冲的方式写到内存并出于效率的考虑进行预排序。每个map任务都有一个环形内存缓冲区用于存储任务输出。在默认情况下,缓冲区大小为100MB,可以通过修改io.sort.mb来调整。一旦缓冲内容达到阈值(0.8/80%),一个后台线程便把内容溢出到(spill)磁盘。在溢出写到磁盘过程中,map输出继续写到缓冲区,但是如果在此期间缓冲去被填满,map会被阻塞直到写磁盘过程完成。在写磁盘之前,线程首先根据数据最终要传的reducer把数据划分成相应的分区(partition)。在每个分区中,后台线程按键进行内排序,如果有一个combiner,它就在排序后的输出上运行。每个map任务的完成时间可能是不同的,因此只要有一个任务完成,reduce任务就开始复制其输出,这是reduce任务的复制阶段。reduce任务有少量分复制线程能并行取得map输出。复制完所有map输出后,reduce任务进入排序阶段,合并map输出,维持其顺序排序。在最后阶段,直接把数据输入reduce函数省略一次磁盘往返,此阶段的输出直接写到文件系统,一般为HDFS。

Spark运行架构


Spark使用主从架构,有一个中心协调器和许多分布式worker,中心协调器被称为driver。Driver和被称为executor的大量分布式worker通信。Driver运行在它自己的Java进程,而每个executor是单独的java进程。Driver和它所有executor一起被称为spark应用。spark打包了一个内置的集群管理器standalong,也可以工作于Hadoop YARN和Apache Mesos这两个开源的集群管理器。

Driver是程序main()方法所在的进程。该进程运行用户代码创建SparkContext,创建RDD,执行变换和动作。driver终止,整个应用就结束了。当driver运行时 ,它有两个职责:1.转换用户程序到任务。每个stage由一组task组成,task是spark处理中最小的单元。2.调度task到executor。当executor启动后,它们将会自己注册到driver,所以driver随时都能看到完整的executor视图。每个executor表现为能执行任务和保存RDD的数据的进程。Spark driver会寻找当前的executor组,然后基于数据分布尝试调度每个task到合适的位置。

Executors是worker进程,其职责是运行给定的spark作业中单个任务。executor在spark应用开始的时候被启动一次,一般会在应用的整个生命周期都运行。executor有两个任务:1,运行构成应用的任务并返回结果到driver。2,通过每个executor中都存在的被称为块管理器的服务为用户程序中缓存的RDD提供内存存储。

Cluster Manager集群管理器,spark依赖于集群管理器来启动executor,并且有时候也启动driver。

Worker节点:从节点,负责控制计算节点,启动Executor或者Driver。

Stage:每个job会被拆分成多组Task,作为一个TaskSet,其名称为stage,stage的划分和调度是有DAGScheduler来负责的.

job:包含多个task的

RDDs弹性分布式数据集

Spark的核心概念是 Resilient Distributed Dataset(RDD):一个可并行操作的有容错机制的数据集合。有两种方式创建RDDs:第一种是在驱动程序中并行化一个已经存在的集合;另一种是引用外部存储系统的数据集,例如共享的文件系统,HDFS,HBase或其他Hadoop数据格式的数据源。

基本容错语义:

1)一个RDD是不可变的、确定可重复计算的、分布式数据集。每个RDD记住一个确定性操作的系谱(lineage),这个系谱用在容错的输入数据集上来创建该RDD;2)如果任何一个RDD的分区因为节点故障而丢失,这个分区可以通过操作系谱从源容错的数据集中重新计算得到;3)假定所有的RDD transformation是确定的,那么最终转换的数据是一样的,不论spark机器中发生何种错误。

Spark运行在像HDFS或S3等容错系统的数据上,因此,任何从容错数据而来的RDD都是容错的。

参数切片数,默认情况下,Spark为每个文件块(HDFS默认文件块大小是64M)创建一个切片,也可以通过一个更大的直来设置更高的切片数据,但是不能设置一个小于文件块数目的切片值。

RDD支持2种类型的操作:转换(transformations)从已经存在的数据集种创建一个新的数据集,动作(actions)在数据集上进行计算之后返回一个值到驱动程序。例如,map是一个转换操作,它将每个数据集元素传递给一个函数并且返回一个新的RDD。另一方面,reduce是一个动作,它使用相同的函数来聚合RDD的所有元素,并且将最终的结果返回到驱动程序。在Spark中所有的转换(transformations)都是惰性(lazy)的,它们不会马上计算它们的结果。相反的,它们仅仅记录转换操作是应用到哪些基础数据集上的。转换仅在动作需要一个结果返回的时候计算。这个设计能让Spark默认情况下,每个转换过的RDD会在每次执行动作的时候重新计算一次。然而,我们也可以使用persist(或cache)方法持久化一个RDD到内存中。在这个情况下,Spark会在集群上保存相关的元素,你下次查询的时候会变得更快。这里也同样支持持久化RDD到磁盘或在多个节点间复制。




Spark把计算分成多个任务(task),并且让它们运行在多个机器上。每台及其都运行自己的map部分和reduce部分,仅仅将结果返回驱动程序。

虽然很多Spark操作工作在包含任意类型对象的RDDs上,但是少数几个特殊操作仅仅在键值(key-value)对RDDs上可用。最常见的是分布式"shuffle"操作,根据一个key对一组数据进行分组和聚合。

RDD持久化,Spark最重要的一个功能是它可以通过各种操作持久化或者缓存一个集合到内存。当你持久化一个RDD的时候,每一个节点都将存于计算的所有分区数据存储到内存中,并且这些数据可以被这个集合以及这个集合衍生的其他集合的动作重复利用。这个能力使后续的动作速度更快。可以通过persist()或者cache()方法持久化一个RDD。首先在action中计算得到rdd,然后将其保存在每个节点的内存中。Spark的缓存是一个容错的技术,如果rdd的任何一个分区丢失,它可以通过原有的转换操作自动重复计算并且创建这个分区。有不同的存储级别,cache方法默认存储级别storagelevel.MEMORY_ONLY。


spark也会自动持久化一些shuffle操作(如reducebykey)中的中间数据,即使没调用persist().

Spark优化指南

Spark checkpoint

checkpoint就是建立检查点,类似于快照,例如在spark计算里面,计算流程DAG特别长,服务器需要将整个DAG计算完成得到结果,但是如果在这很长的计算流程中突然中间算出的数据丢失了,spark又会根据RDD的依赖关系从头到尾计算一遍,这样子就很费性能,当然我们可以将中间的计算结果通过caceh或者persist放到内存或者磁盘中,但是这样也不能保证数据完全不会丢失,存储这个的内存出问题了或者磁盘坏了,也会导致spark从头根据RDD计算一遍,所以有了checkpoint,其中checkpoint的作用就是将DAG中比较重要的中间数据做一个检查点将结果存储到一个高可用的地方(通常为HDFS)

Spark streaming :构建在Spark上处理Stream数据的框架,基本的原理是将Stream数据分成小的时间片段(几秒),以类似batch批处理方式来处理着小部分数据。Spark Streaming构建在Spark上,一方面是因为Spark的低延迟执行引擎(100ms+)可以用于实时计算,另一方面相比基于Record的其他处理框架(如storm),RDD数据集更容易做高效的容错处理。此外小批量处理的方式使得它可以同时兼容批量和实时数据处理的逻辑和算法。方便了一些需要历史数据和实时数据联合分析的特定应用场合



SparkStreaming支持一个高层的抽象,离散流或者Dstream,代表连续的数据流。Dstream内部由一系列RDDs组成。Dstreams中的每个RDD都是包含确定时间间隔内的数据。任何对DStreams的操作都转换成了对DStreams隐含的RDD的操作

transform操作允许在DStream运行任何RDD-to-RDD函数,能用被用来应用任何没在DStream API中提供的RDD操作。例如连接数据流中的每个批和另外一个数据集的功能并没有在DStream API中提供,可以用简单的transform方法做到。

窗口操作


窗口在源DStream上华东,合并和操作落入窗内的源RDDs,产生窗口化的DStream的RDDs。在这个具体的例子中,程序在三个时间单元的数据上进行窗口操作,并且每两个时间单元滑动一次,这里有两个参数:窗口长度即窗口的持续时间;滑动时间间隔即窗口操作执行的时间间隔。这两个参数必须是源DStream的批时间间隔的数倍。

Dstreams上的输出操作允许DStream的操作推到如数据库、文件系统等外部系统中。foreachRDD(func),在从流中生成的每个RDD上应用函数func的最通用输出操作。

与RDD相似,DStreams也允许持久化流数据到内存。在DStream上使用persist()方法可以自动地持久化DStream中的RDD到内存中。reducebywindow,updatestatebykey等操作,持久化是默认的。与RDD不同的是,DStreams默认持久化级别是存储序列化数据到内存。

Checkpointing,包括metadata checkpointing:保存流计算的定义信息到容错存储系统如HDFS,用来汇入应用程序中运行worker的节点的故障;data checkpointing:保存生成的RDD到可靠的存储系统中。

Spark Streaming性能调优

主要考虑1)高效地利用集群资源减少批数据的处理时间2)设置正确的批容量,使数据的处理速度能够赶上数据的接受速度

1.减少批数据的执行时间

1)数据接受的并行水平:通过网络如(Kafka,flume,socket等)接收数据需要这些数据反序列化并被保存到spark中。如果数据接受成为系统的瓶颈,就要考虑并行地接收数据。注意,每个输入DStream创建一个receiver(运行在worker机器上)接受单个数据流。创建多个输入DStream并配置它们可以从源中接收不同分区的数据流,从而实现多数据流接收。例如,接收两个topic数据的单个输入DStream可以被切分为两个kafka输入流,每个接收一个topic。这将在两个worker上运行两个receiver,因此允许数据并行接收,提高整体的吞吐量。多个DStream可以被合并生成单个DStream,这样运用在单个输入DStream的transformation操作可以运用在合并的DStream上。另外一个需要考虑的参数是reveiver的阻塞时间。对于大部分的receiver,在存入Spark内存之前,接收的数据都被合并成一个大的数据块。2)数据处理的并行水平:如果运行在计算stage上的并发任务数不足够大,就不会充分利用集群的资源。例如,对于分布式reduce操作如reduceByKey和reduceByKeyAndWindows,默认的并发任务数通过配置属性来确定spark.default.parappelism.3)数据序列化:Spark中RDD的序列化;输入数据的序列化,从外部获取数据存到Spark中,获取的byte数据需要从byte序列化,然后再按照spark的序列化格式重新序列化到spark中。因此,输入数据的反序列化花费可能是一个瓶颈。4)任务的启动开支:每秒钟启动的任务数是非常大的。发送任务到slave的花费明显,这使请求很难获得亚秒级别的反应。可以通过以下减小开支:任务序列化,执行模式。

2.设置正确的批容量

为了Spark Streaming应用程序能够在集群中稳定运行,系统应该能够以足够的速度处理接收的数据(即处理速度应该大于或等于接收数据的速度)。根据流计算的性质,批间隔时间可能显著影响数据处理速率。这个速率可以通过应用程序维持。以单词计数为例,如果系统的批间隔时间为2s,就无法500ms打印一次单词计数。找出正确的批容量的一个好的办法是用一个保守的批间隔(5-10,s)和低数据速率来测试你的应用程序。

3.内存调优

1)Default persistence level of DStreams:和RDDs不同的是,默认的持久化级别是序列化数据到内存中(DStream是storagelevel.MEMORY_ONLY_SER,RDD是storagelevel.MEMORY_ONLY).虽然保存数据为序列化形态回增加序列化/反序列化的开销,但是可以明显的减少垃圾回收的暂停。2)Clearing persistent RDDs:默认情况下,通过Spark内置策略(LUR),Spark streaming生成的持久化RDD将会从内存中清理掉。如果spark.cleaner.ttl已经设置了,比这个时间存在更老的持久化RDD将会被定时的清理掉。3)Concurrent garbage conlletor:使用并发的标记-清除垃圾回收可以进一步减少垃圾回收的暂停时间。

容错语义

因为Spark Streaming的数据大部分情况下是从网络中得到的,为了获得生成的RDD相同的容错属性,接收的数据需要重复保存在worker node的多个spark ececutor(默认为2),这导致了当出现错误事件时,有两类数据需要被恢复:1)Data received and replicated,在单个worker节点的故障中,这个数据会幸存下来,因为有另外一个节点保存有这个数据的副本。2)Data received but buffered for replication:因为没有重复保存,所以为了恢复数据,唯一的方法是从源中重新读取数据。有两种错误我们需要关心:1)worker节点故障:任何运行executor的worker节点都有可能出故障,那样在这个节点中的所有内存数据都会丢失,如果有任何receiver运行在错误节点,它们的缓存数据将会丢失。2)Driver节点故障:如果运行Spark Streaming应用程序的Driver节点出现故障,很明显SparkContext将会丢失,所有执行在其上的ececutor也会丢失。

Hive与传统数据库比较

查询语言HQLSQL
数据存储位置HDFS 
数据格式用户定义系统决定
数据更新不支持支持
索引
执行MapReduceExecutor
执行延迟低 
可扩展性
数据规模

1.数据存储位置:hive是建立在Hadoop之上的,所有hive的数据都是存储在HDFS中的。而数据库则可以将数据保存在块设备或者本地文件系统中。

2.数据格式:hive没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符、行分隔符以及读取文件数据的方式(默认有三个TextFile,SequenceFile,RCFile)。由于在加载数据的过程中,不需要从用户数据格式到Hive定义的格式转换,因此hive加载过程不会对数据本身修改,而是将数据内容复制或者移动到相应的HDFS目录中。而数据库中不同的数据库有不同的引擎,定义自己的数据格式。

3.数据跟新:hive是针对数据仓库设计的,而数据仓库是读多写少的。因此,hive中不支持对数据的改写和添加,所有的数据都是在加载的时候确定好的。而数据库中的数据通常是需要经常进行修改的。

4.索引:hive没有对数据建立索引,hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于mapreduce的引入,hive合一并行访问数据,因此即使没有索引,对于大量数据的访问,hive仍然有优势。数据库中通常会针对一个或几个列建立索引。数据的访问延迟较高决定了hive不适合在线查询数据。

5.执行:hive中大多数查询的执行是通过Hadoop的mapreduce来实现的(类似 select * from db的查询不需要maprecue)数据库通常有自己的执行引擎。

6.执行延迟:hive在查询数据时由于没有索引,需要扫描整个表,另外mapreduce框架本身具有较高的延迟。数据库延迟较低,在数据规模较小的时候。

7.可扩展性:hive是建立在Hadoop上的,其可扩展性和Hadoop是一致的。数据库由于ACID严格限制,扩展有限。

8.数据规模:hive建立在集群上并且可以利用mr并行计算,可以支持大规模数据;数据库则小

hive的内部表(管理表)与外部表(external):1.内部表数据由hive自身管理,外部表数据由HDFS管理。2.内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定。3.删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除。4.对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进修修改,则需要修复。

hive数据导入:1)本地文件导入到hive表,load data local inpath '/home/hadoop/sourceA.txt' into table testA partition() 2)hive表导入hive表,insert into table testA partition() select * from testB

hive数据导出:1)导出到本地文件系统,insert overwrite local directory '/home/hadoop/output' row format delimited fields terminated by '.' select * from testA; 2)导出到HDFS,insert overwrite directory '/home/hadoop/output' select * from testA 去掉local

数据仓库是面向主题的(数据仓库中的数据是按照一定的主题域进行组织),集成的(指相对原有分散的数据库数据经过系统加工,整理得到的消除源数据中的不一致),相对稳定的(指一旦某个数据进入数据仓库以后只需要定期的加载、刷新),反映历史变化的(指通过这些信息,对企业的发展和未来趋势作出定量分析预测)的数据集合,用于支持管理决策。和数据库的主要区别在于1.数据库是面向事务的设计,数据仓库是面向主题的设计;2.数据库一般存储在线交易数据,数据仓库存储的一般是历史数据。3.数据库设计是尽量避免冗余,数据仓库设计是有意引入融入;4.数据库是为了捕获数据而设计,数据仓库是为分析数据而设计。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker是一种容器化技术,用于创建、部署和管理应用程序的容器。Hadoop是一个分布式计算框架,用于处理大数据集并在集群中进行高速计算。HBase是一个面向列的分布式数据库,用于存储和管理大规模的结构化数据。Hive是一个基于Hadoop的数据仓库基础架构,用于提供简化的查询和分析大数据的能力。而Spark是一个高级的分布式计算系统,用于加速大规模数据处理和分析。 在使用这些技术时,Docker可以用于快速搭建和部署容器化的Hadoop、HBase、HiveSpark环境。使用Docker容器,我们可以轻松地在任何机器上部署这些组件,而无需担心环境配置的问题。 Hadoop是一个开源的分布式计算框架,它可以容纳大规模数据并以可靠的方式在集群中进行处理。通过用Docker容器来运行Hadoop,我们可以更快地搭建和管理Hadoop集群,并且容易进行监控和维护。 HBase是一个分布式数据库系统,以表的形式存储数据,并提供高效的读写操作。通过Docker容器,我们可以轻松地部署HBase集群,并且可以根据需求进行水平扩展,以满足不同规模的数据存储需求。 Hive是一个基于Hadoop的数据仓库基础架构,它提供了类似于SQL的查询接口,方便用户进行大规模数据的查询和分析。使用Docker容器,我们可以轻松地搭建Hive环境,并通过对容器进行配置和管理,优化Hive的性能。 Spark是一个高级的分布式计算系统,它强调内存计算和迭代计算的能力,从而加速大规模数据处理和分析。通过Docker容器,我们可以快速部署和管理Spark集群,并且可以根据需求进行资源配置和任务调度,以实现高性能和高吞吐量的数据处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值