Corona 初探
本周关注了一下另一种号称下一代MapReduce的框架:Corona。它是facebook的开源框架,代码在:
https://github.com/facebook/hadoop-20/tree/master/src/contrib/corona
Cornna的设计需求与Apache的YARN框架十分相似,它的发布文档:
“Under the Hood: Scheduling MapReduce jobs more efficiently with Corona”
其中提到,当前Map-Reduce所使用的single Job Tracker在Facebook的运行环境下已经遇到瓶颈,在Hadoop Corona中,集群的资源是由central Cluster Manager统一分配调度,每个job拥有各自单独的Corona Job Tracker,这些与YARN框架的设计思路非常相近,解决了Map-Reduce中存在的扩展性、单点故障等不足。
相比于YARN,Corona似乎更贴近Map-Reduce的原版,其代码在原版Map-Reduce基础上修改而来,似乎更贴近原有Map-Reduce的用户;另一大优势在于Corona所采用的Push-based通信机制,在原版Map-Reduce和YARN中,采用轮询方式使client获取信息,比如心跳机制,当规模过大后,会产生一定延迟,而Corona采用Push-based通信机制,server直接把信息推送至client,为实现这一通信机制,Corona似乎采用了更多的通信协议(待考证)。
Corona相比与Yarn的缺点也是由于它更贴近原版所产生,比如Corona不能提供Yarn的用户设置所需内存、CPU等特性;任务调度中仍采用slot作为资源分配元,资源利用率不如Yarn;Corona也不支持Yarn那种灵活的多计算框架支持,因为它的TaskTracker还是执行Map和Reduce task。 总的来说,Corona更像是对原版Map-Reduce的升级,从代码量上也可见一斑,Yarn的代码 十五万行代码完全重构,与原版Map-Reduce没有任何复用,而Corona相对原版有大量的重复,更接近与改进了部分框架的升级。
Corona说明书上宣称的特点:
- Better scalability and cluster utilization
- Lower latency for small jobs
- Ability to upgrade without disruption
- Scheduling based on actual task resource requirements rather than a count of map and reduce tasks
Corona的基本组件
Corona架构:
- Cluster Manager 类似于YARN中的Resource Manager,负责资源分配和调度。Cluster Manager掌握着各个节点的资源使用情况,并将资源分配给各个作业(默认调度器为Fair Scheduler)。同YARN中的Resource Manager一样,Resource Manager是一个高度抽象的资源统一分配与调度框架,它不仅可以为MapReduce,也可以为其他计算框架分配资源。
- Corona Job Tracker 类似于YARN中的Application Master,用于作业的监控和容错,它可以运行在两个模式下:1) 作为JobClient,用于提交作业和方便用户跟踪作业运行状态 2) 作为一个Task运行在某个TaskTracker上。与MRv1中的Job Tracker不同,每个Corona Job Tracker只负责监控一个作业。
- Corona Task Tracker 类似于YARN中的Node Manager,它的实现重用了MRv1中Task Tracker的很多代码,它通过心跳将节点资源使用情况汇报给Cluster Manager,同时会与Corona Job Tracker通信,以获取新任务和汇报任务运行状态。
- Proxy Job Tracker 用于离线展示一个作业的历史运行信息,包括Counter、metrics、各个任务运行信息等。
Corona框架的搭建(single node)
Source:
https://github.com/facebook/hadoop-20/tree/master/src/contrib/corona
Building
Start in the hadoop-20 parent path and compile the code with:
ant -Dversion=0.20 clean jar bin-package
Starting up the cluster
-
First, set up the required environment and useful aliases.
source singleNodeHadoop/singleNodeSwitch.sh corona
-
If this is the first time, format the namespace in /tmp with
hadoop namenode -format Start HDFS: start-dfs Start Corona: start-corona
-
There are corresponding commands to stop the clusters stop-dfs
stop-corona
At this point you will be able to look at the local Corona Cluster Manager UI.
Example Job
export HADOOP_CLASSPATH=$HADOOP_HOME/build/contrib/corona/lib/libthrift-0.7.0.jar hadoop jar build/hadoop-0.20-examples.jar sleep -Dmapred.fairscheduler.pool=group_a.pool_sla -m 10 -r 2