大数据常见问题整理

  • 讲述HDFS上传文件和读文件的流程

  • HDFS 上传流程  
    过程解析:详解
    这里描述的 是一个256M的文件上传过程 
    ① 由客户端 向 NameNode节点节点 发出请求
    ②NameNode 向Client返回可以可以存数据的 DataNode 这里遵循  机架感应  原则

    ③客户端 首先 根据返回的信息 先将 文件分块(Hadoop2.X版本 每一个block为 128M 而之前的版本为 64M)
    ④然后通过那么Node返回的DataNode信息 直接发送给DataNode 并且是 流式写入  同时 会复制到其他两台机器
    ⑤dataNode 向 Client通信 表示已经传完 数据块 同时向NameNode报告
    ⑥依照上面(④到⑤)的原理将 所有的数据块都上传结束 向 NameNode 报告 表明 已经传完所有的数据块 
  • HDFS在上传文件的时候,如果其中一个块突然损坏了怎么办

    其中一个块坏了,只要有其它块存在,会自动检测还原。
  • NameNode的作用

    namenode总体来说是管理和记录恢复功能。
    比如管理datanode,保持心跳,如果超时则排除。
    对于上传文件都有镜像images和edits,这些可以用来恢复
  • NameNode在启动的时候会做哪些操作

    NameNode启动的时候,会加载fsimage,NameNode启动过程fsimage加载过程

    Fsimage加载过程完成的操作主要是为了:
    1.         从fsimage中读取该HDFS中保存的每一个目录和每一个文件
    2.         初始化每个目录和文件的元数据信息
    3.         根据目录和文件的路径,构造出整个namespace在内存中的镜像
    4.         如果是文件,则读取出该文件包含的所有blockid,并插入到BlocksMap中。
    整个加载流程如下图所示:
     

    如上图所示,namenode在加载fsimage过程其实非常简单,就是从fsimage中不停的顺序读取文件和目录的元数据信息,并在内存中构建整个namespace,同时将每个文件对应的blockid保存入BlocksMap中,此时BlocksMap中每个block对应的datanodes列表暂时为空。当fsimage加载完毕后,整个HDFS的目录结构在内存中就已经初始化完毕,所缺的就是每个文件对应的block对应的datanode列表信息。这些信息需要从datanode的blockReport中获取,所以加载fsimage完毕后,namenode进程进入rpc等待状态,等待所有的datanodes发送blockReports。

spark

mr和spark区别,怎么理解spark-rdd

Mr是文件方式的分布式计算框架,是将中间结果和最终结果记录在文件中,map和reduce的数据分发也是在文件中。

spark是内存迭代式的计算框架,计算的中间结果可以缓存内存,也可以缓存硬盘,但是不是每一步计算都需要缓存的。

Spark应用转换流程

1、spark应用提交后,经历了一系列的转换,最后成为task在每个节点上执行

2、RDD的Action算子触发Job的提交,生成RDD DAG

3、由DAGScheduler将RDD DAG转化为Stage DAG,每个Stage中产生相应的Task集合

4、TaskScheduler将任务分发到Executor执行

5、每个任务对应相应的一个数据块,只用用户定义的函数处理数据块

Spark-rdd是一个数据的分区记录集合………………

Driver运行在Worker上

通过org.apache.spark.deploy.Client类执行作业,作业运行命令如下:

作业执行流程描述:

1、客户端提交作业给Master

2、Master让一个Worker启动Driver,即SchedulerBackend。Worker创建一个DriverRunner线程,DriverRunner启动SchedulerBackend进程。

3、另外Master还会让其余Worker启动Exeuctor,即ExecutorBackend。Worker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程。

4、ExecutorBackend启动后会向Driver的SchedulerBackend注册。SchedulerBackend进程中包含DAGScheduler,它会根据用户程序,生成执行计划,并调度执行。对于每个stage的task,都会被存放到TaskScheduler中,ExecutorBackend向SchedulerBackend汇报的时候把TaskScheduler中的task调度到ExecutorBackend执行。

5、所有stage都完成后作业结束。

spark概念

术语总是难以理解的,因为它取决于所处的上下文。在很多情况下,你可能习惯于“将Job提交给一个cluster”,但是对于spark而言却是提交了一个driver程序。

也就是说,对于Job,spark有它自己的定义,如下: 
A parallel computation consisting of multiple tasks that gets spawned in response to a Spark action (e.g. save, collect); you’ll see this term used in the driver’s logs.

在这个例子中,假设你需要做如下一些事情: 
1. 将一个包含人名和地址的文件加载到RDD1中 
2. 将一个包含人名和电话的文件加载到RDD2中 
3. 通过name来Join RDD1和RDD2,生成RDD3 
4. 在RDD3上做Map,给每个人生成一个HTML展示卡作为RDD4 
5. 将RDD4保存到文件 
6. 在RDD1上做Map,从每个地址中提取邮编,结果生成RDD5 
7. 在RDD5上做聚合,计算出每个邮编地区中生活的人数,结果生成RDD6 
8. Collect RDD6,并且将这些统计结果输出到stdout

为了方便说明,我将这个例子整理成如下的一张示意图: 
这里写图片描述

其中红色虚线表示输入和输出,蓝色实线是对RDD的操作,圆圈中的数字对应了以上的8个步骤。接下来解释driver program, job和stage这几个概念:

  1. Driver program是全部的代码,运行所有的8个步骤。
  2. 第五步中的save和第八步中的collect都是Spark Job。Spark中每个action对应着一个Job,transformation不是Job。
  3. 其他的步骤(1、2、3、4、6、7)被Spark组织成stages,每个job则是一些stage序列的结果。对于一些简单的场景,一个job可以只有一个stage。但是对于数据重分区的需求(比如第三步中的join),或者任何破坏数据局域性的事件,通常会导致更多的stage。可以将stage看作是能够产生中间结果的计算。这种计算可以被持久化,比如可以把RDD1持久化来避免重复计算。
  4. 以上全部三个概念解释了某个算法被拆分的逻辑。相比之下,task是一个特定的数据片段,在给定的executor上,它可以跨越某个特定的stage。

到了这里,很多概念就清楚了。驱动程序就是执行了一个Spark Application的main函数和创建Spark Context的进程,它包含了这个application的全部代码。Spark Application中的每个action会被Spark作为Job进行调度。每个Job是一个计算序列的最终结果,而这个序列中能够产生中间结果的计算就是一个stage。

再回过头来看一下Spark Programming Guide,对于Transformations和Actions是有着明确区分的。通常Action对应了Job,而Transformation对应了Stage:

Action列表:

  • reduce
  • collect
  • count
  • first
  • take
  • takeSample
  • takeOrdered
  • saveAsTextFile
  • saveAsSequenceFile
  • saveAsObjectFile
  • countByKey
  • foreach

Transformation列表:

  • map
  • filter
  • flatMap
  • mapPartitions
  • mapPartitionsWithIndex
  • sample
  • union
  • intersection
  • distinct
  • groupByKey
  • reduceByKey
  • aggregateByKey
  • sortByKey
  • join
  • cogroup
  • cartesian
  • pipe
  • coalesce
  • repartition
  • repartitionAndSortWithinPartitions

至于task,官方文档中是这么说的:Task is a unit of work that will be sent to one executor。再结合官方对Stage的解释,可以这样理解: 
一个Job被拆分成若干个Stage,每个Stage执行一些计算,产生一些中间结果。它们的目的是最终生成这个Job的计算结果。而每个Stage是一个task set,包含若干个task。Task是Spark中最小的工作单元,在一个executor上完成一个特定的事情。

原文地址:https://www.cnblogs.com/ngy0217/p/10054463.html