大数据框架总结

hdfs

1 写数据流程

大数据框架总结_第1张图片

2 HDFS读数据流程1

大数据框架总结_第2张图片

3 HDFS副本节点选择

大数据框架总结_第3张图片

4 HDFS nn 2nn 镜像文件以及编辑日志的工作机制

注意此类机制都是先更新编辑日志,再更新内存文件block元数据。

checkpoint触发默认条件是一小时或者满足一百万条操作日志,肯定可以修改。

大数据框架总结_第4张图片

5 HDFS datanode工作机制

大数据框架总结_第5张图片

 

yarn

1 整体架构图_1

大数据框架总结_第6张图片

2 yarn工作机制mr

大数据框架总结_第7张图片

hadoop

1 hadoop--map工作流程

大数据框架总结_第8张图片

 

2 hadoop--reduce阶段
大数据框架总结_第9张图片

3 hadoop_shuffle阶段

大数据框架总结_第10张图片

 

spark

1 spark-yarn任务提交

大数据框架总结_第11张图片

1 SparkSubmit
    //启动进程
    --main
	    //封装进程启动的xxx参数
	    --new SparkSubmitArguments
		//提交
		--submit
		    //准备提交环境(返回的是自己spark程序的mainClass以及args等信息)
			--prepareSubmitEnvironment
			    //cluster提交模式
			    --childMainClass = "org.apache.spark.deploy.yarn.Client"
				//client提交模式
				--childMainClass = args.mainClass(自己打包spark程序的主类)
			//参数就是prepareSubmitEnvironment返回的结果
			--doRunMain (runMain)
			    //反射加载类
				--Utils.classForName(childMainClass)
				//查找main方法
				--mainClass.getMethod("main",new Array[String](0).getClass)
				//调用main方法
				--mainMethod.invoke

				
2 Client
    --main
		--new ClientArguments(argsString)
		--new Client
			//连接yarn的客户端,内部参数是yarn集群resourceManager的address等信息
			--yarnClient = YarnClient.createYarnClient
		--client.run()
			//产生applicationId
			--submitApplication
				//封装指令 command = /bin/java org.apache.spark.deploy.yarn.ApplicationMaster
				--createContainerLaunchContext
				--createApplicationSubmissionContext
				//向yarn提交应用
				--yarnClient.submitApplication(appcontext)
				
			
3 ApplicationMaster(yarnNM中启动)
	//启动进程
	--main
		--new ApplicationMasterArguments(args)
		//创建应用管理器对象
		--new ApplicationMaster
		--master.run()
			//Cluster
			--runDriver
				//启动用户应用
				--startUserApplication
					//获取用户类的main方法
					--userClassLoader.loadClass(args.userClass).getMethod("main", classOf[Array[String]])
					//启动线程,执行用户类的main方法,线程的名字就是driver!!!
					--new Thread().start()
				//注册AM
				--registerAM
					//获取yarn资源
					--client.register
					//分配资源
					--allocator.allocateResources()
						//考虑数据文件节点的本地化
						--handleAllocatedContainers
							//启动cachedThreadPool运行
							--runAllocatedContainers
								--new ExecutorRunnable().run()
									//rpc跟nm发送启动进程的指令, command = /bin/java  org.apache.spark.executor.CoarseGrainedExecutorBackend
									--startContainer
									
4 CoarseGrainedExecutorBackend
	--main
		--run
			--onStart
				//ref为CoarseGrainedExecutorBackend类中的Driver的rpc通信的句柄
				--ref.ask[Boolean](RegisterExecutor)
				
			--receive
				//rpc通信模式匹配executor后台的操作
				--case RegisteredExecutor
					--new Executor
				--case launchTask
					--executor.launchTask

 2 spark​​​​​​ sortshufflemanager bypass机制相对于普通机制的异同

普通机制产生磁盘小文件的个数: 2*M(map task的个数)索引文件-和磁盘文件

bypass 机制触发条件
1)shuffle reduce 端的 task 数量小于 spark.shuffle.sort.bypassMergeThreshold 参数值的时候;
2)不是聚合类的shuffle算子(比如reduceByKey)mapSideCombine即map端预聚合;

该机制下,当前 stage 的每个 task 会将数据的 key 进行 hash,然后将相同 hash 的 key 锁对应的数据写入到同一个内存缓冲区,缓冲写满后会溢写到磁盘文件,这里和 HashShuffleManager一致。然后会进入 merge 阶段,将所有的磁盘文件合并成一个磁盘文件,并创建一个索引文件。

相比较于普通机制,这里有两个地方不同:

1)将数据写入内存时候,普通模式是将数据写入 Map 或者 Array 这样的内存数据结构中,这里是根据 key 的 Hash 值直接写入内存;
2)该模式下在写入磁盘之前不会排序;
3)磁盘写机制不同

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的