• 大数据常见问题整理


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

  • 相关阅读:
    express不是内部或外部命令,也不是可运行的程序或批处理文件
    Microsoft VBScript 运行时错误 错误 '800a0046' 没有权限 解决方法
    Scripting.FileSystemObject对象的详细技巧指南
    (asp)JScript读写、复制、移动文件 asp也就那回事(4)
    SQL2000系统表、存储过程、函数的功能介绍及应用
    深入浅出:全面理解SQL Server权限体系
    SqlServer2008基础知识:安全与权限
    php-fpm
    PHP获取当前url路径的函数及服务器变量:$_SERVER["QUERY_STRING"],$_SERVER["REQUEST_URI"],$_SERVER["SCRIPT_NAME"],$_SER
    jQuery UI Datepicker中文显示
  • 原文地址:https://www.cnblogs.com/ngy0217/p/10054463.html
Copyright © 2020-2023  润新知