1. 程式人生 > >《Apache Kylin在OA日誌結構化中的應用》

《Apache Kylin在OA日誌結構化中的應用》

1、生產場景

OA非結構化日誌通過kafka傳來,已有一程式實現將其結構化並存放至Hdfs上,並且在Hive中之於這個檔案做了外表關聯。需要通過對kylin 的二次開發,實現其每天的日誌分析需求。

2、問題剖析

OA日誌結構化通過kylin來分析,和之前的OA資料匯入還是有區別的,首先每天只需要刷一天的資料,不需要擔心或者處理之前的資料,其次Refresh功能也只是針對當日的資料,過了今日就不會對之前的資料進行refresh了。理清了這兩點,發現問題並沒有之前的那麼棘手了,之前還有segment忙時等待設計,現在我只要讓kylin定時的刷那個segment,就不需要刻意的記錄什麼了。

3、方案設計

①方案設計一

根據系統時間定時,segment按天來,且均為當日的零點到次日零點,比如要刷今天了,segment的時間區間為:2016-10-07 08:00:00~2016-10-08 08:00:00,每隔一個小時刷一次,每次刷,先去向kylin請求,看日誌對應的cube中是否存在今天的segment,沒有就去hive中查,看當天的資料是否來了,來了則去刷,並且是add操作,資料沒來則不去刷,非第一次刷,且有資料則進行refresh操作,當初這樣設計的,是想著業務上可能到23:00:00後就沒資料了(後來證明,小夥子想的挺美的哈),因為oa日誌資料是人觸發的,通過點選生成,23:00:00不就早下班了嘛,後來老大提醒了我,萬一加到23:59:59分了,對哦,確實忽視了,所以方案一撲街

,不過後來又細細想了想,其實還是可以稍作改動就可以繼續正常的,因為方案一的設計唯一的盲區是在當天的23:00:00~24:00:00,只要我第二天把前一天的這段盲區加到例行檢查不就ok了,實現起來,也不需太大的改動。

②方案設計二

方案設計二,不基於系統時間,而是基於oa日誌的最大時間,有兩份配置檔案,其中一份配置檔案存放兩列,第一列為cube名稱,第二列為最近一批更新的oa日誌的最大時間,還有一份配置檔案有三列,第一列為cube名,第二列為對應的主表名,第三列為主表對應的時間欄位。

具體設計思路如下,存放最大時間的配置檔案每次會更新,每處理完一批日誌,把處理的這批日誌中的最大時間覆蓋更新至該配置檔案。與Hive互動的有兩條SQL,第一條用來查詢hive中存放的資料中大於配置檔案中最大時間的資料,並以(yyyy-MM-dd)格式存放至Set集合中,第二條用來存放,當前hive中的最大時間,並以(yyyy-MM-dd hh:mm:ss)格式寫入配置檔案中。

更新的時候,就遍歷相應cube中的相應的set,通過kylin返回的buf如果有exception,說明是需要add的資料,否則統統refresh。具體實現程式碼如下:

查詢需要重新整理資料的SQL語句:

<span style="font-family:Microsoft YaHei;font-size:14px;">String queryPeriodTime="select distinct(substr("+timeColumn+",0,10)) from "+ tableName+ " where substr("+timeColumn+",0,19) > "+'\"'+lastMaxTime+'\"';</span>
查詢最大時間的SQL語句:
<span style="font-family:Microsoft YaHei;font-size:14px;">	String queryMaxTime = "select MAX(substr("+timeColumn+",0,19)) from "+ tableName;</span>

總體業務邏輯:

<span style="font-family:Microsoft YaHei;font-size:14px;">/**
 * 擬定每30分鐘執行一次
 */
public void run(){
			OaLog oa = new OaLog();
			JavaHive jh = new JavaHive();
			cubeSet=rw.readConfigFile(PropertyUtil.prop.getProperty("configFile"));
			rw.readTimeFile(PropertyUtil.prop.getProperty("timeFile"));
			StringBuffer  newMaxTimeBuf = new StringBuffer();
				for(String cubeName:cubeSet){
					System.out.println(cubeName);
					jh.queryDataTime(cubeName,rw.cubeMax.get(cubeName), rw.cubeTime.get(cubeName),rw.cubeTable.get(cubeName),PropertyUtil.prop.getProperty("hiveIp"));
					newMaxTimeBuf=jh.queryMaxTime(cubeName,rw.cubeTime.get(cubeName),rw.cubeTable.get(cubeName),PropertyUtil.prop.getProperty("hiveIp"));
					Map<String,LogTime> logTimeMap=jh.initMap.get(cubeName);
					  if (logTimeMap!=null) {
					      Set<String> logTimeSet=logTimeMap.keySet();
					      for (String logTime1:logTimeSet) {
								if(je.isSegmentExist(oa.refreshCube(logTime1,time.getNextDate(logTime1),cubeName,PropertyUtil.prop.getProperty("kylinIp")).toString())){
									oa.addSegment(logTime1,time.getNextDate(logTime1),cubeName,PropertyUtil.prop.getProperty("kylinIp"));
							}	  
					      }
					  }
					}	
				if(newMaxTimeBuf.toString()!="\t\r\n"){
				  rw.writeToFile(PropertyUtil.prop.getProperty("timeFile"),newMaxTimeBuf.toString());
				}
		}</span>

先讀取兩份配置檔案,然後同hive互動,通過兩條sql查詢待刷資料以及最大時間,並且將最大時間放至newMaxTimeBuf中,等遍歷完所有的cube後,一次性覆蓋寫入至time.properties檔案中,待重新整理的資料放到logTimeSet中,直接拿去refresh,通過isSegmentExist方法判斷返回buf中是否存在exception,進而判斷對應的segment是否存在,如果isSegmentExist返回true,就進行if判斷,說明返回buf中有exception,進而說明對應segment不存在,剛好執行if中的addSegment操作,如果isSegmentExist返回false,不執行if判斷中的內容,判斷條件中已經包含refresh語句,此時cube已經刷了起來。

4、優化設計

較之前資料匯入那塊,將資料匯入以及守護程序的檢測j錯誤狀態的job分為兩個project,執行時比較繁瑣,對於OA日誌結構化,採取的是通過任務排程,開闢兩個執行緒,守護程序擬定8分鐘執行一次,整合到了對接kylin的程式中。

相關推薦

Apache Kylin在OA日誌結構應用

1、生產場景 OA非結構化日誌通過kafka傳來,已有一程式實現將其結構化並存放至Hdfs上,並且在Hive中之於這個檔案做了外表關聯。需要通過對kylin 的二次開發,實現其每天的日誌分析需求。

Odoo10學習筆記三:模型(結構應用數據)、視圖(用戶界面設計)

其他 描述 用戶界面 列表 支持 字段 界面設計 允許 學習 一:模型 1:創建模型 模型屬性:模型類可以使用一些屬性來控制它們的一些行為: _name :創建odoo模型的內部標識符,必含項。 _description :當用戶界面顯示模型時,一個方便用戶的模型記錄標題。

《java併發程式設計實戰》筆記(一) 結構併發應用程式

下載地址 連結:https://pan.baidu.com/s/1i6FlscH 密碼:m21n 1.任務執行 任務是一組邏輯執行單元,執行緒是使得任務非同步執行的機制 不可取的所謂執行緒開啟的方式: 1.所有任務放在單個執行緒中序列執行 2.每一個任務都開啟一個執行緒,無限

日誌結構,SQL來查詢

通常,日誌檔案都是文字格式,其中的內容是非結構化的文字串。這就使得我們查詢日誌資訊時,一般只能使用文字編輯軟體的搜尋功能,輸入關鍵字後,靠眼力去偵查每處匹配結果。在日誌量不大,或者只是偶爾查一下時,這麼操作倒也無妨。不過,再簡單的事情也怕多次重複。如果需要頻繁查詢,量變就可能

Java併發程式設計之結構併發應用程式

任務執行    有三種任務執行的方式    1.序列地執行任務,在任務執行策略裡,最簡單的就是在單個執行緒裡面序列地執行各項任務,但是這種策略理論上是正確的,在實際的生產環境裡的執行性非常的糟糕,因為它每次只能執行一個請求。主執行緒在執行的不同操作之間不斷地交替執行,而當單執

基於視覺配置的日誌結構轉換實現

導讀:資料匯流排DBus的總體架構中主要包括六大模組,分別是:日誌抓取模組、增量轉換模組、全量抽取程式、日誌運算元處理模組、心跳監控模組、Web管理模組。六大模組各自的功能相互連線,構成DBus的工作原理:通過讀取RDBMS增量日誌的方式來實時獲取增量資料日誌(支援全量拉取);基於Logstash,flume

[AI開發]視訊結構應用的侷限性

演算法不是通用的,基於深度學習的應用系統不但做不到通用,即使對於同一類業務場景,還需要為每個場景做定製、特殊處理,這樣才能有可能到達實用標準。這種侷限性在計算機視覺領域的應用中表現得尤其突出,本文介紹基於深度學習的交通行業視訊結構化類應用在實際使用場景中遇到的一些問題。計算機視覺處理的目標是圖片,因此圖片直接

[AI開發]零程式碼分析視訊結構應用結構設計

視訊結構化類應用涉及到的技術棧比較多,而且每種技術入門門檻都較高,比如視訊接入儲存、編解碼、深度學習推理、rtmp流媒體等等。每個環節的水都非常深,單獨拿出來可以寫好幾篇文章,如果沒有個幾年經驗基本很難搞定。本篇文章簡單介紹視訊結構化類應用涉及到的技術棧,以及這類應用常見結構,因為是實時視訊分析,因此這類應用

匯編試驗七:尋址方式在結構數據訪問應用

知識 分享 logs 訪問 alt nbsp mage 結構化數據 div 預備知識: (1)尋址方式 《匯編語言》P169 (2)div指令 被除數 dx + ax,除數 bx ,商 ax,dx 余數; (3)dd :雙字數據 (4)dup :重復賦值指令

Asp.Net Core利用Seq組件展示結構日誌功能

eve 發布 哪裏 HA 快速 inf ron void 級別 在一次.Net Core小項目的開發中,掌握的不夠深入,對日誌記錄並沒有好好利用,以至於一出現異常問題,都得跑動服務器上查看,那時一度懷疑自己肯定沒學好,不然這一塊日誌不可能需要自己扒服務器日誌來查看,果然,很

(王爽版)彙編實驗7 定址方式在結構資料訪問應用

題目如下: 彙編程式碼如下: assume cs:codesg ;資料段 data segment db '1975','1976','1977','1978','1979','1980','1981','1982','1983' db '1984'

組合語言(王爽第三版)實驗7 定址方式在結構資料訪問應用

這個實驗我自己摸索了好幾個小時才弄出來,最後想通了發現自己把問題想複雜了。 1、個人認為最簡單的方法 assume cs:code,ds:data data segment db '1975','1976','1977','1978','1979','1980','19

王爽 組合語言 實驗7 定址方式在結構資料訪問應用,用棧實現

assume cs:codesg data segment db '1975','1976','1977','1978','1979','1980','1981','1982','1983' db

.Net語言 APP開發平臺——Smobiler學習日誌:在手機應用開發如何實現跳轉地圖

demo hand 操作 窗體 clas com ps1 ati void 一、目標樣式 我們要實現上圖中的效果,需要如下的操作: 二、跳轉地圖代碼 VB: Private Sub Button1_Click(sender As Object, e As Ev

.NET下使用 Seq結構日誌系統

eof 檢索 fig 直連 自定義 兩個 img 性能 collect 前言 我們公司在日誌管理方面一直沒有統一,主要痛點有: 每個開發人員都是各用各的,存儲日誌的形式也是五花八門,如:本地文件,數據庫,Redis,MongoDB 由於公司訪問服務器要通過堡壘機

大數據時代的結構存儲—HBase在阿裏的應用實踐

拆分 體系 you 要點 保持 子集 異步 判斷 容量 摘要: # 前言 時間回到2011年,Hadoop作為新生事物,在阿裏巴巴已經玩得風生水起,上千臺規模的"雲梯"是當時國內名聲顯赫的計算平臺。 這一年,Hadoop的好兄弟HBase由畢玄大師帶入淘

Category 特性在 iOS 元件應用與管控

背景 iOS Category功能簡介 Category 是 Objective-C 2.0之後新增的語言特性。 Category 就是對裝飾模式的一種具體實現。它的主要作用是在不改變原有類的前提下,動態地給這個類新增一些方法。在 Objective-C(iOS 的開發語言,下文用 OC 代替)中

結構的指標,用malloc初始時,沒有分配足夠的記憶體空間,造成下述錯誤

      對結構體中的指標,初始化和釋放,遇到堆損壞問題(附連結點選開啟連結)點選開啟連結) out_defect.texturing = (TEXTURING *)malloc(sizeof(TEXTURING

基於ELK 的 Apache 日誌視覺分析

Apache日誌視覺化分析 專案地址:https://github.com/whirlys/Elastic-In-Practice/tree/master/apache_log_demo 在網站的運營過程中,網站訪問者的各種資訊對於網站運營者來說,是非常有價值的資訊

node通過模板引擎模擬Apache訪問目錄結構的功能

要點: 1.頁面的渲染方式分為客戶端渲染和伺服器渲染兩種方式,這個例項中實現的就是服務端的渲染。 2.在fs核心模組中,fs.readFile()方法使用相對路徑,是從啟動伺服器的目錄下出發使用"./"是為了區別核心模組。 3.通過node引入npm中新增的包,可以直接通過require