MR提交时是否有失败,失败了怎么办
出现错误主要有以下三种:
1、Task任务
2、JobTracker失败
3、TaskTracker失败
Task任务
1、当map或者reduce子任务中的代码抛出异常,JVM进程会在退出之前向服务tasktracker进程发送错误报告,tasktracker会将此(任务尝试)taskattempt标记为failed状态,释放一个槽以便运行另外一个任务。
2、对于流任务,如果流进程以非零退出运行,则会标记为failed。
3、子JVM突然退出(JVM错误),这时tasktracker会注意到进程己经退出,标记为failed。
4、tasktracker将子任务标记为失败后会将自身计数器减一,以便向jobtracker申请新的任务,也是通过心跳告知jobtracker本地的一个任务尝试失败。
5、jobtracker接到任务失败的通知后,会将其重新加入到调度队列重新分配给其他的tasktracker执行(避免将失败的任务分配给执行失败的tasktracker),但是这个尝试也是有次数限制的,默认情况卜任务尝试4次后仍然没有完成,就不会再重试(jobtracker会将其标记为killed),此时整个作业就执行失败了。
TaskTracker失败
1、tasktracker一旦失败,就会停止向jobtracker发送心跳。
2、同时jobtracker从任务池中将此tasktracker删除,tasktracker上运行的任务将会被移送到其他tasktracker节点上去运行。
3、如果每个tasktracker上面的任务失败次数远远高于其他节点,jobtracker就把该tasktracker放入到黑名单中。
4、如果成功完成的map任务,tasktracker节点已经失效了,那么reduce任务也无法访问到存储在tasktracker本地文件系统上的中间结果,需要在其他tasktracker节点重新被执行。
JobTracker失败
1)JobTracker失败是最严重的一种失败方式了,而在Hadoop1.x中存在单点故障的情况下是相当严重的。
2)可以通过启动多个JobTracker,在这种情况只运行一个主的jobtracker,主的jobtracker由zookeeper协调控制。但是出现故障的概率仍然比较高,因此,Hadoop2.x采用了一种全新的架构Yarn。将作业调度和任务管理完全剥离出来。
作业调度
先进先出调度器(FIFO)默认方式
公平调度器(FairScheduler)
容量调度器(CapacityScheduler)
先进先出调度器(FIFO)
1、FIFO调度器是hadoop中默认的调度器,它先遵循优先级优先,然后按照作业到来的顺序进行调度。
2、这种默认的调度器的一个缺点是:高优先级以及需要长时间运行的作业一直在被处理,而低优先级以及短作业将长时间得不到调度。
公平调度器(FairScheduler)
由fackbook开发的调度器。
1、FairScheduler的目标是让每个用户公平的共享集群。
2、作业被放在池中,在默认情况下,每个用户都有自己的池。
3、支持抢占,如果一个池在特定的时间内未得到公平的资源分配,调度器就会终止运行池中得到过多的资源的任务,以便把任务槽让给资源不足的池。
容量调度器(CapacityScheduler)
由雅虎开发的调度器。
1、支持多个队列,每个队列可以配置一定的资源量,每个队列采用FIFO调度策略。
2、为了防止同一个用户提交的作业独占队列中的资源,对同一个用户提交作业所占的资源量进行限定。
3)具有的特性:层次化的队列、资源容量保证、安全性、弹性、可操作性、基于资源的调度。
配置FairScheduler
1、修改mapred-site.xml
<property>
<name>mapred.jobtracker.taskScheduler</name>
<value>org.apache.hadoop.mapred.FairScheduler</value>
</property>
<property>
<name>mapred.fairscheduler.allocation.file</name>
<value>$HADOOP_HOME/conf/fair-scheduler.xml</value>
</property>
2、fair-scheduler.xml
以上是hadoop1.x的相关操作。
hadoop2.x对yarn-site.xml进行配置可以参考官网
http://hadoop.apache.org/docs/r2.6.0/hadoop-yarn/hadoop-yarn-site/FairScheduler.html
Hadoop YARN 附带的默认调度器是CapacityScheduler。
shuffle和sort
map端
1、map端并不是简单的把中间结果写入到磁盘,而是利用环形缓冲区的方式先把map输出到内存当中。
2、每个map都有一个环形缓冲区,默认大小100M,大小可以由属性io.sort.mb来修改。
3、一旦内存缓冲区达到一个溢写阀值。(io.sort.spill.percent),就会新建一个溢写文件。
4、多个溢写文件最终会合并成一个己分区已排序大的输出文件,写入到磁盘中,作为reduce的输入。
5、io.sort.factor控制着一次最多可以合并多少个分区。
reduce端
1、reduce端shuffle过程,分为三个阶段:复制map输出、排序合并和reduce处理。
2、由于reduce可以接收多个map的输出,所以复制map输出阶段的时候仍然需要在本地排序并合并。
3、map任务可以在不同时间完成,囚此只要有一个map任务结束,reduce任务就开始复制其输出。
4、reduce任务有少量的复制线程,可以并行取得map输出。
(mapred.reduce.parallel.copies属性来控制)
5、reduce处理阶段不会等待所有输入合并成一个大文件后进行处理,而是把部分合并后的结果直接进行处理。
是否查看过产生的日志
Hadoop HDFS只有服务日志,与Hadoop MapReduce的服务日志类似;
Hadoop MapReduce日志分为两部分,一部分是服务日志,一部分是作业日志,具体介绍如下:
1. Hadoop 1.x版本
Hadoop 1.x中MapReduce的服务日志包括JobTracker日志和各个TaskTracker日志,他们的日志位置如下(Web界面也可查看其日志,地址http://主节点IP:50030):
JobTracker:在JobTracker安装节点上,默认位置是
${hadoop.log.dir}/logs/*-jobtracker-*.log,该文件每天生成一个,旧的日志后缀是日期,当天的日志文件后缀是“.log”,其中${hadoop.log.dir}默认值是hadoop安装目录,即${HADOOP_HOME}。
TaskTracker:在各个TaskTracker安装节点上,默认位置是
$HADOOP_HOME/logs/*-tasktracker-*.log,该文件每天生成一个,旧的日志后面会跟一个日志,当天的日志文件后缀是“.log”
作业日志包括jobhistory日志和task日志两部分,其中,jobhistory日志是作业运行日志,包括作业启动时间、结束时间,每个任务的启动时间、结束时间,各种counter信息等,用户可以从这个日志中解析出作业运行的各种信息,是非常有价值的信息。默认存放位置是JobTracker所在节点的${hadoop.log.dir}/history目录下,可通过参数hadoop.job.history.location配置。每个task日志存放在task运行节点上,存放位置是${hadoop.log.dir}/userlogs/<jobid>/<attempt-id>目录下,每个task包含三个日志文件,分别是stdout、stderr和syslog,其中,stdout是通过标准输出打印出来的日志,比如System.out.println,注意,程序中通过标准输出打印的日志并不会直接显示在终端上,而是保存在这个文件中,syslog是通过log4j打印的日志,通常这个日志中包含的有用信息最多,也是错误调试中最关键的参考日志。
2. Hadoop 2.x版本
Hadoop 2.x中YARN系统的服务日志包括ResourceManager日志和各个NodeManager日志,他们的日志位置如下:
ResourceManager日志存放位置是Hadoop安装目录下的logs目录下的yarn-*-resourcemanager-*.log
NodeManager日志存放位置是各个NodeManager节点上hadoop安装目录下的logs目录下的yarn-*-nodemanager-*.log
应用程序日志包括jobhistory日志和Container日志,其中,jobhistory日志是应用程序运行日志,包括应用程序启动时间、结束时间,每个任务的启动时间、结束时间,各种counter信息等。
Container日志包含ApplicationMaster日志和普通Task日志,它们均存放在Hadoop安装目录下的userlogs目录中的application_xxx目录下,其中ApplicationMaster日志目录名称为container_xxx_000001,普通task日志目录名称则为container_xxx_000002,container_xxx_000003,….,同Hadoop 1.x一样,每个目录下包含三个日志文件:stdout、stderr和syslog,且具体含义是一样的。
数组和链表的区别
数组结构在通过索引进行查询数据时效率比较高,而对于数组插入和删除操作,则效率会比较低,在第一个位置进行插入数据,其余数据就需要依次向后移动,而第一个数据进行删除,则需要所有数据全部向前移,这样的话,就会推出第二种结构,链表结构。
简单的链表:为了保证数据插入和删除,不会影响其他数据的移动,保证线性开销,所以就引出了链接。每个表都不会连续进行存储。
链表是由一系列节点组成的,每个节点都会有一个链点,这就是next链,而next链则会执行下一个node的引用,所以我们在插入或者删除的时候,需要该表链表next链的指向地址即可,每个节点不需要内存进行连续存储,这样会减小删除和插入的线性开销。
链表结构主要分为两种链表,单向链表和双向链表 ,即单向链表只有一个next链,而双向链表会有next链和pre链。
你说一下写过的mr
map怎么给到reduce
map-reduce背后的思想很简单,就是把一些数据通过map来归类,通过reducer来把同一类的数据进行处理。