董的博客 ? Apache Twill—YARN上應(yīng)用程序開發(fā)包 http://dongxicheng.org/mapreduce-nextgen/apache-twill-for-yarn/
盡管YARN自帶的編程API已經(jīng)得到了極大的簡化,但從頭開發(fā)一個(gè)YARN應(yīng)用程序仍是一件非常困難的事情。在YARN上編寫一個(gè)應(yīng)用程序,你需要開發(fā)Client和ApplicationMaster兩個(gè)模塊,并了解涉及到的幾個(gè)協(xié)議的若干API和參數(shù)列表,其中ApplicationMaster還要負(fù)責(zé)資源申請,任務(wù)調(diào)度、容錯(cuò)等,總之,整個(gè)過程非常復(fù)雜。
Apache Twill(官方首頁:Apache Twill)這個(gè)項(xiàng)目則是為簡化YARN上應(yīng)用程序開發(fā)而成立的項(xiàng)目,該項(xiàng)目把與YARN相關(guān)的重復(fù)性的工作封裝成庫,使得用戶可以專注于自己的應(yīng)用程序邏輯。
下面代碼示例是使用Apache Twill開發(fā)一個(gè)運(yùn)行在YARN上的helloworld程序:
public class HelloWorld {
static Logger LOG = LoggerFactory.getLogger(HelloWorld.class);
static class HelloWorldRunnable extends AbstractTwillRunnable {
@Override
public void run() {
LOG.info("Hello World");
}
}
public static void main(String[] args) throws Exception {
YarnConfiguration conf = new YarnConfiguration();
TwillRunnerService runner = new YarnTwillRunnerService(conf, "localhost:2181");
runner.startAndWait();
TwillController controller = runner.prepare(new HelloWorldRunnable()).start();
Services.getCompletionFuture(controller).get();
}
Twill所做的事情是開發(fā)了一個(gè)通用的Client和ApplicationMaster實(shí)現(xiàn),并提供了一套編程API,使得用戶可直接實(shí)現(xiàn)這套API便可以編寫運(yùn)行在YARN上的分布式程序。Twill應(yīng)用程序運(yùn)行在YARN上的流程跟普通程序一樣,流程圖下:

為極大地方便用戶編寫運(yùn)行在YARN上的分布式應(yīng)用程序,Twill做了大量通用模塊和特性,包括:
(1)實(shí)時(shí)日志收集
基于kafka實(shí)現(xiàn)了日志收集功能,可將應(yīng)用程序產(chǎn)生的日志實(shí)時(shí)收集起來,便于集中化分析和展示。
(2)資源匯報(bào)
可實(shí)時(shí)收集任務(wù)占用的各類資源,包括cpu利用率,物理內(nèi)存等。
(3)資源彈性擴(kuò)展
可動(dòng)態(tài)改變應(yīng)用程序占用的資源,比如將container數(shù)目在線由5個(gè)增長為10個(gè)。
(4)狀態(tài)恢復(fù)
當(dāng)客戶端失去與應(yīng)用程序鏈接后,可通過API重構(gòu)一個(gè)新的客戶端,重新獲取狀態(tài)。
(5)服務(wù)發(fā)現(xiàn)
應(yīng)用程序可向zookeeper注冊一些信息,便于其他服務(wù)或者客戶端發(fā)現(xiàn)該應(yīng)用程序的位置,以便與之通信。
隨著YARN越來越成熟,它必將成為一個(gè)基礎(chǔ)核心系統(tǒng),屆時(shí)與Apache Twill類似的項(xiàng)目顯得尤為重要。