JAVA进程、核心的Hadoop类
1.HDFS:数据存储
org.apache.hadoop.hdfs.server.namenode.NameNode
org.apache.hadoop.hdfs.server.datanode.DataNode
org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode
2.YARN:MapReduce 作业的调度执行
org.apache.hadoop.yarn.server.resourcemanager.ResourceManager
org.apache.hadoop.yarn.server.nodemanager.NodeManager
初始化:
1.RM 收到submitApp()后将请求转给调度器Yarn scheduler
2.scheduler分配container
3.RM在该container启动app master , 并交由节点管理器NM管理。
4.app master创建多个记录对象跟踪job进度,它将接受task的进度或完成报告。
5.检索输入切割 inputsplit
6.为每个split创建map任务和一定数量的reduce任务(setNumRed..()),此时分配jobid
7.app master判断如何运行task,如果是小job,app master会在同一节点jvm中运行
uber task就是指这一点,因为开启新容器分配和运行程序更耗费资源。
小job的衡量标准是map<10,只有reduce=1,而且input size < block size。这些值可以修改。
mapreduce.job.ubertask.maxmaps
mapreduce.job.ubertask.maxreduces
mapreduce.job.ubertask.enable
8.最后,App master调用OutputCommitter的setupJob()方法,默认是FileOutputCommimter,主要是创建output目录和临时工作目录。
远程调试:
1.远程服务器启动jvm的远程调试:
a.运行java程序时,直接指定参数 java -xxxx -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000
b.先设置环境变量,再启动jvm,直接变环境附加在jvm启动参数之后
export xxx="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000"
java yyy $xxx
c.${hadoop_home}\bin\yarn
$YARN_RESOURCEMANAGER_OPTS
2.编写脚本
enable_yarn-remotedebug.sh
export YARN_RESOURCEMANAGER_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000"
3.执行脚本,source环境变量生效
4.启动资源管理器RM:start-yar.sh
5.启动多个NM,但是RM暂停在监听8000端口的过程中
6.到客户端中设置断点,连接到远程的RM程序,
a.在RM的main函数设置断点
b.在类上选择run--> debug configuration...->new remote deug..->socket attach-> 指定远程服务器ip和端口 ip:xx | port:8000
c.点击debug