任女爾 魏金津 蔡建軍
摘要:汽車行業(yè)會產(chǎn)生大量數(shù)據(jù),需要對這些數(shù)據(jù)進行存儲與分析?;贏pacheAmbari搭建大數(shù)據(jù)基礎設施,通過Nifi可以將各種型式的數(shù)據(jù)進行處理、整合并導入大數(shù)據(jù)存儲。通過Kylin可以對存儲的大數(shù)據(jù)進行降維,提高查詢速度。基于springCloud與開發(fā)計算模塊并,對外提供Rest接口,實現(xiàn)大數(shù)據(jù)查詢功能。
關鍵詞:Amabri;Nifi;Kylin;SpringCloud
中圖分類號:TP391 文獻標識碼:A
文章編號:1009-3044(2019)31-0001-05
1概述
汽車行業(yè)的軟件項目中,經(jīng)常有這樣的業(yè)務場景。比如新能源汽車數(shù)據(jù)采集,一輛車一天的運行數(shù)據(jù)量為0.375G,這樣一年的運行數(shù)據(jù)量可達136.875G,車的數(shù)量越多數(shù)據(jù)量就越多,能達到T級甚至更大。這些數(shù)據(jù)經(jīng)常是以txt、CSV等形式提供的,有結構化的也有非結構化的,我們需要對這些數(shù)據(jù)進行存儲和分析。
為了突破數(shù)據(jù)存儲的瓶頸上限,為數(shù)據(jù)資源中心未來的數(shù)據(jù)倉庫構建做一定的技術儲備,所以我們基于Ambari建設了一個數(shù)據(jù)處理平臺,實現(xiàn)了:
1)使用Nifi,數(shù)據(jù)可配置導入,無須開發(fā)即可接入txt、CSV或是其他數(shù)據(jù)源,將CSV文件導入Hive存儲;
2)海量數(shù)據(jù)的存儲;
3)通過Kvlin將數(shù)據(jù)降維存儲到Hbase,計算模塊再調(diào)用Kvlin查詢數(shù)據(jù),效率高;
4)代碼開發(fā)計算模塊實現(xiàn)SQL的管理,能夠在uI上寫新的查詢語句,直接暴露Rest接口,供外部程序調(diào)用。
計算模塊基于SpringClould開發(fā),使用JHipster生成微服務基礎代碼,可連接Kvlin、Groovy執(zhí)行計算。支持通過docker容器運行,方便橫向擴展。
目前經(jīng)測已成功導入一份3500萬行的文件(6.4GB)。
2系統(tǒng)架構
2.1系統(tǒng)結構
該項目基于Hortonworks的HDP搭建了大數(shù)據(jù)的基礎設施?;贖DF實現(xiàn)基本的數(shù)據(jù)ETL,用于系統(tǒng)問的數(shù)據(jù)集成。通過Kvlin抽取、聚合Hive中的數(shù)據(jù),構建低維Cube表存儲與Hbase,形成降維索引層,用于支持MOLAP場景。最后,通過基于SpringClould開發(fā)的計算模塊,管理計算,該模塊可連接Postgres、Kvlin、Sqlite、Oracle、Groovy執(zhí)行計算邏輯,可實現(xiàn)鏈式計算,從而滿足復雜計算場景,為大數(shù)據(jù)可視化、機器學習、人工智能等提供支持。
2.2功能劃分與流程處理
2.3大數(shù)據(jù)基礎設施管理
大數(shù)據(jù)基礎設施的搭建是極為麻煩的,Hadoop的安裝、調(diào)試往往需要苦苦耗費好幾天,更別提Hbase、Nifi、Kylin等Ha-doop組件,所以我們通過Apache Ambari去搭建。
Ambari是開源的,作用是創(chuàng)建、管理、監(jiān)控Hadoop整個生態(tài)圈(例如Hive、Hbase、Zookeeper等)的集群,讓Hadoop以及相關的大數(shù)據(jù)軟件更容易使用的一個工具。Ambari現(xiàn)在所支持的平臺組件也越來越多,例如流行的Spark、Storm等計算框架,以及資源調(diào)度平臺ARN等,我們都能輕松地通過Ambari來進行部署。通常場景,會登錄Ambari進行故障排查、服務重啟、配置查找/修改等工作。
Ambari使大數(shù)據(jù)基礎設施安裝,官方說法是從數(shù)人天降低到一人天,運維人數(shù)從數(shù)十人降低到幾人。如圖3所示。
3Nifi
因為企業(yè)數(shù)據(jù)來源是多元化的,需要經(jīng)過整合后接入ha-doop生態(tài)圈以及各種存儲分析組件,我們希望這個過程是平滑、可視的。
Nifi是一個開源的數(shù)據(jù)處理與分發(fā)系統(tǒng),可以通過簡單的Processor對數(shù)據(jù)流進行處理,他提供可視化的uI界面,各個模塊組件之間可配置,各個數(shù)據(jù)處理模塊之間的數(shù)據(jù)流轉(zhuǎn)情況??梢詫⒏鞣N數(shù)據(jù)源的數(shù)據(jù)導入Hive、Hbase存儲。
4KyLin
Kylin簡單說就是做大數(shù)據(jù)查詢的,可以對大數(shù)據(jù)進行降維,可以幫助我們對大數(shù)據(jù)進行多維度的分析,提高查詢效率。
對于海量數(shù)據(jù),每增加一個維度,數(shù)據(jù)量就是笛卡兒積,減少維度能夠大量減少數(shù)據(jù)量,大多數(shù)計算不需要用到所有維度的。
以近SQL語句,查詢T級別大數(shù)據(jù)秒級可完成。
5數(shù)據(jù)集成
5.1創(chuàng)建Hive表
登錄Ambari集群任一服務器,執(zhí)行hive命令進去Hive命令行模式,即可運行SQL語句創(chuàng)建/查詢數(shù)據(jù)表。如圖4所示。
5.2創(chuàng)建Nifi數(shù)據(jù)流
Nifi是一個開放的數(shù)據(jù)集成開發(fā)平臺,數(shù)據(jù)處理平臺通過Apache Nifi實現(xiàn)數(shù)據(jù)ETL,通過Ambari的QuickLinks進入Nifi-uI界面,通過對圖形化數(shù)據(jù)處理流程的設計及配置,實現(xiàn)數(shù)據(jù)的ETL流程。
下圖樣例流程實現(xiàn)了:1)CSV數(shù)據(jù)文件的到達監(jiān)聽;2)CSV數(shù)據(jù)文件的解析;3)Hive的流導入;41KylinCube的增量構建。
如圖5所示。
5.3kylin多維交互查詢
通過Apache Kylin抽取、聚合Hive中的數(shù)據(jù),構建低維Cube表存儲與Hbase,形成降維索引層,用于支持MOLAP場景,如圖6所示。
KvlinCube(低維表)的創(chuàng)建過程大致過程為:創(chuàng)建project、同步Hive表、創(chuàng)建Model、創(chuàng)建Cube。
6計算模塊
6.1系統(tǒng)介紹
計算模塊可連接Postgres、Kylin、Sqlite、Oracle、Groovy等執(zhí)行計算邏輯,可實現(xiàn)鏈式計算,從而能夠滿足大多數(shù)場景的BI計算需要。
Kvlin是基于hive構建低維表,低維表就是抽取部分列,聚合度量值,形成一個小的內(nèi)存表,數(shù)據(jù)處理平臺就可以連Kylin執(zhí)行查詢了,在低維表上運行sql,返回結果,查詢速度快。
計算模塊通過Rest接口,被外部系統(tǒng)調(diào)用。為了滿足系統(tǒng)對吞吐量,性能,穩(wěn)定性的需求,而在技術上選擇基于Spring-Cloud的微服務架構與Docker容器。這個架構的好處是,服務可以開任意多實例進行橫向擴展,還可以保持服務的獨立性,屏蔽底層物理平臺的差異。為了加快開發(fā)速度,我們選用了JHipster,一個開源的SpringCloud代碼生成腳手架,可以自動化生成前后臺一套完整的微服務體系代碼,包括監(jiān)控、日志、權限等,正常情況下可以減少一半以上工作量。
計算模塊還提供了一個可輸入Kylin、Groovy等大數(shù)據(jù)操縱腳本的uI界面,將腳本傳遞到Java后臺執(zhí)行,并返回結果。
6.2進入計算模塊的數(shù)據(jù)處理界面
進人計算模塊前臺數(shù)據(jù)處理界面,點擊“添加”按鈕。
如圖7所示。
填寫基本信息:
命名控件:用于將計算分組,方便排序/搜索。
名稱:中文名稱,方便閱讀。
標識符:需全局唯一,用于外部系統(tǒng)調(diào)用該計算。
6.3計算開發(fā)
數(shù)據(jù)處理(計算)是通過順序執(zhí)行“子處理”實現(xiàn)的。
uI元素介紹:
1)基本信息:數(shù)據(jù)處理的基本信息;Rest接口決定該數(shù)據(jù)處理是否支持外部系統(tǒng)的Rest調(diào)用;“停用”/“啟用”按鈕可停用/啟用該數(shù)據(jù)處理。
2)測試參數(shù):方便子處理的開發(fā),可隨時測試運行。
3)子處理列表:用于添加/排序刪除子處理。
4)子處理信息:
名稱:子處理名稱,在該數(shù)據(jù)處理范圍內(nèi)唯一,計算結果中將用該名稱作為結果鍵值
類型:目前支持以下類型
[Sql-服務DB]代碼類型為PostgresSQL,用于查詢計算服務本身的數(shù)據(jù)庫。
[Sql-Kylin]代碼為KvlinSQL,用于查詢Kylin中的Cube表。
[Sql-Oracle]代碼為Oracle SQL,用于查詢配置中指定Ora-cle實例的數(shù)據(jù)表。
[Sql-中間結果]查詢內(nèi)存Sqlite數(shù)據(jù)庫,前置子處理需開啟“輸出表”,表名為子處理名稱。
[腳本Groovy]前置子處理需開啟“輸出對象”。
輸出表:若子處理開啟該項,結果將存儲與內(nèi)存sQLite數(shù)據(jù)庫,表明即為該子處理名稱,后續(xù)的“Sql-中間結果”子處理可編寫sql訪問該數(shù)據(jù)。
輸出對象:若子處理開啟該項,數(shù)據(jù)結果將存儲與內(nèi)部數(shù)據(jù)結果(HashMap),鍵值為該子處理名稱,后續(xù)“腳本-Groovy”子處理可編寫Groovy腳本訪問該數(shù)據(jù)集。
輸出結果:若子處理開啟該項,結果將最終返回給調(diào)用者。
代碼:子處理的具體代碼,根據(jù)子處理“類型”,填寫SQL或Groovy腳本。
如圖8所示。
5)測試子處理:
測試子處理將順序執(zhí)行子處理至“當前”子處理,傳人參數(shù)為“測試參數(shù)”,結果JSON字段說明:
success:是否成功。
error:若失敗,返回具體錯誤信息。
results:結果集,鍵值為子處理名稱,包含開啟了輸出結果的前置子處理結果和當前子處理結果。
如圖9所示。
6)外部系統(tǒng)調(diào)用
identNer:數(shù)據(jù)處理的標識符
paramMap:輸人參數(shù),類型為JSON,例:
{“paraml”:“valuel”,“param2”:100}
7總結
基于Ambari搭建大數(shù)據(jù)基礎設施,將汽車行業(yè)的大量結構化、非結構化的數(shù)據(jù)經(jīng)處理后導入Hive或Hbase存儲?;赟pringCloud腳手架JHipster開發(fā)計算模塊,開發(fā)效率可以高出50%,可以發(fā)布為Docker容器根據(jù)訪問量自由做橫向擴展。使用Kvlin對數(shù)據(jù)進行降維處理,計算模塊的大數(shù)據(jù)檢索效率更高。該項目可以被外部系統(tǒng)用來做數(shù)據(jù)分析,大數(shù)據(jù)可視化,機器學習,人工智能等。