zoukankan      html  css  js  c++  java
  • 大数据常见问题整理

    • 讲述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上完成一个特定的事情。

  • 相关阅读:
    HDU4529 郑厂长系列故事——N骑士问题 —— 状压DP
    POJ1185 炮兵阵地 —— 状压DP
    BZOJ1415 聪聪和可可 —— 期望 记忆化搜索
    TopCoder SRM420 Div1 RedIsGood —— 期望
    LightOJ
    LightOJ
    后缀数组小结
    URAL
    POJ3581 Sequence —— 后缀数组
    hdu 5269 ZYB loves Xor I
  • 原文地址:https://www.cnblogs.com/ngy0217/p/10054463.html
Copyright © 2011-2022 走看看