-
讲述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。
-
NameNode的HA
NameNode的HA一个备用,一个工作,且一个失败后,另一个被激活。他们通过journal node来实现共享数据 -
NameNode和DataNode之间有哪些操作
这个问题有些歧义。操作具体可以查看hadoop命令,应该超不出命令汇总
Hadoop Shell命令字典(可收藏)
http://www.aboutyun.com/forum.php?mod=viewthread&tid=6983
hadoop高级命令详解
http://www.aboutyun.com/forum.php?mod=viewthread&tid=14829 -
Hadoop的作业提交流程
Hadoop2.x Yarn作业提交(客户端)
http://www.aboutyun.com/forum.php?mod=viewthread&tid=9498
Hadoop2.x Yarn作业提交(服务端)
http://www.aboutyun.com/forum.php?mod=viewthread&tid=9496
更多:
hadoop作业提交脚本分析(1)
http://www.aboutyun.com/forum.php?mod=viewthread&tid=6954
hadoop作业提交脚本分析(2)
http://www.aboutyun.com/forum.php?mod=viewthread&tid=6956 -
Hadoop怎么分片
如何让hadoop按文件分片
http://www.aboutyun.com/forum.php?mod=viewthread&tid=14549
Hadoop分块与分片
http://www.aboutyun.com/blog-5994-697.html -
如何减少Hadoop Map端到Reduce端的数据传输量
减少传输量,可以让map处理完,让同台的reduce直接处理,理想情况下,没有数据传输 -
Hadoop的Shuffle
彻底了解mapreduce核心Shuffle--解惑各种mapreduce问题
http://www.aboutyun.com/forum.php?mod=viewthread&tid=7078
hadoop代码笔记 Mapreduce shuffle过程之Map输出过程((1)
http://www.aboutyun.com/forum.php?mod=viewthread&tid=10335 -
HMaster的作用
hmaster的作用
为region server分配region.
负责region server的负载均衡。
发现失效的region server并重新分配其上的region.
Gfs上的垃圾文件回收。
处理schema更新请求。
更多
region server and hmaster server -
HBase的操作数据的步骤
Hbase写数据,存数据,读数据的详细过程
http://www.aboutyun.com/forum.php?mod=viewthread&tid=10886‘ -
Innodb的二进制文件和Redo日志的区别
1 二进制日志记录所有引擎的日志,而重做日志只记录InnoDB;
2 二进制日志记录事务的具体操作内容,而后者记录每个页更改的物理情况;
3 前者用于point-in-time恢复,后者用于crash recovery;如果mysql发生介质损坏,则需要从备份中恢复然后应用binary log执行point-in-time recovery
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这几个概念:
- Driver program是全部的代码,运行所有的8个步骤。
- 第五步中的save和第八步中的collect都是Spark Job。Spark中每个action对应着一个Job,transformation不是Job。
- 其他的步骤(1、2、3、4、6、7)被Spark组织成stages,每个job则是一些stage序列的结果。对于一些简单的场景,一个job可以只有一个stage。但是对于数据重分区的需求(比如第三步中的join),或者任何破坏数据局域性的事件,通常会导致更多的stage。可以将stage看作是能够产生中间结果的计算。这种计算可以被持久化,比如可以把RDD1持久化来避免重复计算。
- 以上全部三个概念解释了某个算法被拆分的逻辑。相比之下,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上完成一个特定的事情。