對(duì)于產(chǎn)品經(jīng)理來(lái)講,了解產(chǎn)品的使用情況是最為重要的事情之一。不過(guò),對(duì)于Hadoop平臺(tái)這樣的產(chǎn)品來(lái)講這件事情就有點(diǎn)飄忽不定了。Hadoop平臺(tái)上有各種各樣的運(yùn)維度量對(duì)任務(wù)狀態(tài)、錯(cuò)誤、計(jì)算資源、存儲(chǔ)等進(jìn)行測(cè)量,從而幫助用戶了解平臺(tái)的健康狀況,進(jìn)而提高用戶體驗(yàn)。對(duì)于消費(fèi)級(jí)互聯(lián)網(wǎng)、移動(dòng)互聯(lián)網(wǎng)公司的產(chǎn)品經(jīng)理來(lái)講,同樣的事情也是存在的。舉例來(lái)說(shuō),就消費(fèi)級(jí)產(chǎn)品來(lái)講,它們的度量通常圍繞用戶活動(dòng)、參與度、收入、轉(zhuǎn)換率、存留率等進(jìn)行的。
本文提出一些在Hadoop平臺(tái)上獲取用戶度量的基本方法,用以進(jìn)行使用模式分析;并根據(jù)分析結(jié)果進(jìn)行產(chǎn)品規(guī)劃。
Hadoop用戶度量會(huì)依據(jù)使用的Hadoop發(fā)行版有所改變,這里我使用的是Cloudera公司的Hadoop發(fā)行版。Cloudera公司提供有一個(gè)不錯(cuò)的工具,叫Cloudera Navigator。該工具提供事件的配置、收集、查看等審計(jì)功能,從而更好的了解數(shù)據(jù)使用人員及其使用方式。對(duì)于大多數(shù)應(yīng)用場(chǎng)景的需求該工具均能滿足,使得平臺(tái)的查看和審計(jì)變得容易許多。Cloudera Navigator是Cloudera Manager的一部分,后者提供了一系列的健壯的API,用來(lái)與已有的監(jiān)控工具進(jìn)行整合。另外,Cloudera Manager還提供了可配置的控制面板,對(duì)每個(gè)度量均能進(jìn)行可視化的近實(shí)時(shí)跟蹤。
ClouderaManager API使用介紹可能會(huì)有產(chǎn)品經(jīng)理覺(jué)得Navigator提供的功能遠(yuǎn)遠(yuǎn)不夠,他們想要在控制面板上展現(xiàn)更多定制化的度量、以及更多更豐富的可視化功能,那么Cloudera Manager API(CMAPI)是絕佳工具。REST API提供了大量的度量,你想要的KPI都可以通過(guò)它進(jìn)行聚合和匯總。正如文檔中提及的,所有接入點(diǎn)均操作數(shù)據(jù)的一份公共集合,調(diào)用API返回的JSON對(duì)象適用于各種接口。
在下面的示例中,我們將會(huì)看到的是使用Cloudera Manager進(jìn)行查詢,獲得一段時(shí)間內(nèi)在Hadoop集群上執(zhí)行YARN任務(wù)的用戶狀態(tài)。使用Python腳本來(lái)展示是如何調(diào)用API的,包括傳入時(shí)間段參數(shù)以及獲得指定數(shù)量的JSON格式的結(jié)果。
注:本文使用Python 2.7版本。
我們來(lái)看一下接入點(diǎn)‘yarnApplication’——調(diào)用該接口將返回用戶運(yùn)行的YARN容器的屬性。主要包括應(yīng)用程序ID、應(yīng)用程序名稱、啟動(dòng)時(shí)間、結(jié)束時(shí)間、用戶名、資源池(應(yīng)用程序提交到的資源池)以及其他屬性均可以通過(guò)該API獲得。舉例來(lái)講,創(chuàng)建一個(gè)名為“yarnmetrics.py”的文件,打開(kāi)該文件并輸入以下內(nèi)容:
1)導(dǎo)入必需的庫(kù)
import json
import sys
importurllib2
fromdatetime import datetime, timedelta
2) 設(shè)置要返回的記錄數(shù),單個(gè)調(diào)用的記錄數(shù)最大值默認(rèn)為1000。
3) 我們還要把需要提取的時(shí)間分片提供給API。舉例來(lái)說(shuō),可以根據(jù)當(dāng)前時(shí)間取一個(gè)偏移量來(lái)設(shè)定時(shí)間分片的范圍。在這個(gè)例子中,我希望API返回的是從上午九點(diǎn)到下午五點(diǎn)的數(shù)據(jù)。
cur_time =(datetime.now() - timedelta(day = 1))
to_time =cur_time.replace(hour = 17, minute = 00, second = 00, microsecond =0).isoformat()
from_time =yes_time.replace(hour = 8, minute = 0, second = 0, microsecond = 0).isoformat()
4) 將參數(shù)傳入到該腳本中。我們傳入的參數(shù)來(lái)告訴腳本使用哪一個(gè)API接入點(diǎn)進(jìn)行調(diào)用。
limiter =20
metric =sys.argv[1]
5) API的接入點(diǎn)格式為:/api/v7/clusters/{clusterName}/services/{serviceName}/yarnApplications
該調(diào)用依賴于你集群上Cloudera Manager的具體配置。點(diǎn)擊了解更多關(guān)于服務(wù)和角色度量的信息。
此處,我們假設(shè)一個(gè)場(chǎng)景:如果傳入“applications”則執(zhí)行下面的調(diào)用。from_time、to_time應(yīng)當(dāng)是ISO格式的時(shí)間戳,包括limiter在內(nèi),三個(gè)參數(shù)均需傳入
6)根據(jù)Cloudera Manager安裝配置的不同,你需要與它的服務(wù)器進(jìn)行認(rèn)證。所以我們使用base64進(jìn)行編碼。注:由于安全環(huán)境及配置的不同,會(huì)有不同的方式進(jìn)行認(rèn)證。出于演示目的,簡(jiǎn)潔起見(jiàn)提供以下示例:
return"Basic " + (user + ":" +password).encode("base64").rstrip()
7)現(xiàn)在,我們可以進(jìn)行API調(diào)用了,調(diào)用的請(qǐng)求中包括編碼后的數(shù)據(jù)。
8)提交請(qǐng)求,并將結(jié)果輸出到JSON文件中。
req =urllib2.Request(url)
req.add_header('Accept','application/json')
req.add_header('Authorization','Basic fsfadgibberishsdfdfsfF=') #用編碼后的用戶數(shù)據(jù)進(jìn)行填充
9)這個(gè)時(shí)候,我們就能夠獲得包含特定時(shí)間段運(yùn)行的全部任務(wù)的信息的JSON文件了。
你可以通過(guò)以下命令運(yùn)行該腳本:python yarnmetrics.py applications
有了這些數(shù)據(jù),便可以根據(jù)自己喜好選擇可視化工具進(jìn)行數(shù)據(jù)分析了。
舉例來(lái)講,你可以通過(guò)impalaQueries接口得到訪問(wèn)Impala數(shù)據(jù)庫(kù)的用戶列表。
或者通過(guò)上面提到的YARN的接口來(lái)獲得日常使用情況。
這時(shí),也就不難使用Oozie或者Cron這樣的工具進(jìn)行自動(dòng)化處理,從而獲得任意時(shí)間間隔下的集群使用情況了。如果你還需要自動(dòng)化的控制面板或者用戶相關(guān)的查詢,將這些結(jié)構(gòu)化的JSON數(shù)據(jù)寫入到Hadoop上也是可以的。一個(gè)簡(jiǎn)單的工作流就可以把這些JSON文件寫入到Hive表中,然后就可以使用可視化工具訪問(wèn)Hive做進(jìn)一步的控制面板了。