基于Blink構建親聽項目以及全鏈路debug項目實時響應能力

案例與解決方案匯總頁:
阿里云實時計算產品案例&解決方案匯總

本文全面總結了大數據項目組在親聽項目以及全鏈路debug項目上進行的實時流處理需求梳理,架構選型,以及達成效果

一、背景介紹

1.1親聽項目

親聽項目專注于幫助用戶收集、展示、監控和處理用戶體驗問題,是保證產品的主觀評價質量的利器,關于其具體功能可參考在ata搜索"親聽"查看系列文章。目前親聽項目的實時流處理需求來自算法效果監控,算法效果監控需要對上游TimeTunnel日志進行解析后經過處理得到一些關鍵指標,親聽通過對這些指標的前端展示和閾值監控報警達到算法效果監控目的。

需求要點可以總結如下:

  1. 上游需要處理的TimeTunnel日志的實時數據量大約在日常峰值每秒數萬條記錄,大促峰值每秒幾十萬條記錄
  2. 從用戶搜索行為到親聽系統得到搜索行為指標數據秒級的低延時
  3. 數據的處理邏輯較為復雜且會隨著算法迭代需要發生變化

1.2全鏈路debug

全鏈路debug專注于幫助用戶在線上搜索結果出現異常和問題時幫助開發者復現搜索后端各子系統的中間結果,定位并解決子系統存在的問題,是系統層級質量保證和測試的有力工具。關于其具體功能可參考在ata搜索"全鏈路debug"查看系列文章。全鏈路debug的實時流處理需求是實時從TimeTunnel日志中提取出幫助排除搜索線上問題的關鍵內容,全鏈路debug利用這些內容幫助進行問題排查。全鏈路debug的實時流處理需求模型可以用下圖描述:

需求要點可以總結如下:

  1. 上游需要處理的TimeTunnel日志的實時數據量大約在日常峰值每秒數萬條記錄,大促峰值每秒幾十萬條記錄
  2. 需要保存的單條記錄較大,平均達到幾K左右
  3. 對上游TimeTunnel日志解析邏輯大部分為字段提取和透傳且不會頻繁變化

二、解決方案

2.1整體架構

應對以上需求,親聽以及全拉鏈路debug的實時流處理系統的最終架構如下:

親聽:

全鏈路debug:

對于親聽和全鏈路debug的實時流處理需求最終選擇上述架構主要出于實時性和擴展性兩方面考慮

2.2實時性

親聽和全鏈路debug的實時流處理需求在實時性要求上是類似的,即要對接tt日志,在tt日志記錄寫入到對于親聽和全鏈路debug的使用方可見延時要控制在秒級,這種實時性的需求可以分解為兩個部分,第一是對實時流數據的處理,而是對實時流數據處理結果的存儲和查詢服務。對于實時流數據的處理,目前公司內的中間件產品blink能很好滿足我們的需求,blink提供對接TimeTunnel的api接口,同時具備很好的實時流處理性能和運維體驗;對于實時流處理結果的存儲和查詢,需要支持幾萬到幾十萬qps的寫壓力以及在每天累計幾十T數據量情況下毫秒級延時的讀性能,hbase能夠基本滿足對讀寫的需求,但是druid和drill能夠在滿足讀寫性能的同時提供更好的數據查詢體驗和實時流處理邏輯的可擴展性,所以對于實時流數據處理結果的存儲和查詢服務我們是優先考慮druid和drill的,但是全鏈路debug的實時流處理結果有一個特點就是單條記錄數據大小平均為幾K左右,這么大的單條記錄的大小將導致druid需要的內存量過大且查詢性能低下而不可用,所以對于全鏈路debug的實時流處理結果的存儲和查詢服務選擇了hbase。

2.3擴展性

在親聽實時流處理系統的下游引入tt->druid,然后使用drill查詢druid提供查詢服務,是出于對擴展性的考慮。druid是一種支持實時流處理和查詢的olap系統(ATA),對接druid使得可以把一部分實時流數據的處理邏輯交給druid,這樣當實時流處理邏輯需要修改時,很多情況下就可以通過修改查詢邏輯(只要修改一個請求druid時的json配置文件)而不需要修改blink任務(需要修改代碼、打包、編譯、調參、上線)實現,大幅提升實時流處理系統的擴展性,而親聽實時流處理需求頻繁變化的業務特點非常需要這種擴展性;drill是高性能的SQL查詢引擎,通過drill對接druid提供查詢服務不但使查詢語法從druid的json文件變為sql可讀性大幅增強,同時drill對druid查詢結果具有的二次處理能力也進一步增強了通過修改查詢邏輯可以滿足的實時流處理邏輯變化,進一步增強系統可擴展性。

在blink和druid之間增加了TimeTunnel進行數據中轉以保證blink產出流數據被轉化為下游druid支持的流數據源形式。

2.4經驗總結

使用table api編寫

stream api作為blink的底層api,具有較高的靈活性,但是可讀性很不好,進而非常影響代碼的可維護性和擴展性,當要在實時任務中加入新需求時經常要改動很多地方并且很容易出錯,所有實時任務我們選擇使用table api編寫,table api使用類sql語法描述實時流處理邏輯,使得數據流處理邏輯變得非常清晰,可讀性大幅增強,進而節約代碼的維護和擴展成本。

進行字段歸類合并

我們通過梳理業務方最終需要使用的字段內容,將blink任務輸出到TimeTunnel中記錄的字段進行了分類合并,除了出于druid查詢性能考慮將若干需要進行group by以及count distinct查詢的原有字段保留,其余全部按照諸如搜索請求相關信息、用戶相關信息、搜索返回寶貝相關信息這樣的概念將原有字段分組后合并為多值字段,而每個合并后的多值字段又會在blink代碼中用一個udtf函數統一處理。這樣做的好處在于代碼邏輯上變得更清晰,當實時流處理需求發生變化,需要產出新的內容或修改現有內容產出邏輯時,只需找到新增內容或待修改內容對應的多值字段,修改對應udtf邏輯并重新上線blink任務即可,下游的druid build無需進行任何修改;同時用有限的幾個udtf對整個實時流輸出記錄的處理邏輯進行歸類,避免了記錄處理邏輯頻繁變化可能導致的代碼中過時字段和udf泛濫,可讀性下降,修改易出錯的問題。

drill處理邏輯前移

請看下面這個sql:

select * from druid.sqa_wireless_search_pv where INSTR(auction_tag, '15')

這個sql drill的處理邏輯是從druid表中召回druid.sqa_wireless_search_pv表中全部記錄后逐條進行auction_tag字段的比對,過濾出包含‘15’字符串的記錄,這種召回全部記錄進行處理的操作對于drill來說會造成很大的性能問題,占用集群資源急劇上升,查詢延時大幅提高,甚至導致集群oom使查詢服務中斷服務。在使用drill進行查詢時應盡量避免執行類似召回大量記錄進行處理的sql,我們對親聽算法效果監控現有sql進行了梳理,找到召回記錄數目可能會過高的sql,通過將處理邏輯前移到blink任務階段大幅優化drill查詢性能(例如上面的sql只要將比對auction_tag字段是否含有‘15’的邏輯交給blink處理,并讓blink任務新增產出一個tag字段,這樣druid就可以針對tag字段建索引,通過where tag==‘true’這樣的語句就可以直接召回需要的記錄)

三、成果總結

目前tt->blink->hbase和tt->blink->tt->druid是在公司內使用非常廣泛的兩種實時流處理架構,能以秒級延時完成線上實時日志處理,這兩種實時流處理架構比較好地滿足了親聽和全鏈路debug項目的實時數據處理需求,極大提升了項目價值

四、作者簡介

鷙鳥,來自搜索事業部-工程效率&技術質量-算法工程平臺-實時大數據平臺
15年加入阿里,主要從事電商體系實時數據研發以及實時大數據平臺研發



本文作者:付空

閱讀原文

本文為云棲社區原創內容,未經允許不得轉載。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536857.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536857.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536857.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python的重點_python知識點

"""author:lei"""import os#os.path.join() 將分離的部分合成一個整體filenameos.path.join(/home/ubuntu/python_coding,split_func)print filename#輸出為:/home/ubuntu/python_coding/split_func#os.path.splitext()將文件名和擴展…

在既有系統中打通Apache Ignite、MySQL和Node.js

為什么80%的碼農都做不了架構師?>>> 介紹 在本系列的第一篇文章中,安裝了Node.js、Ignite的Node.js瘦客戶端包,并且測試了一個示例應用。在本文中,可以看一下Ignite在處理其它數據源(比如關系數據庫&#…

java hashmap 的api_JAVA基礎--JAVA API集合框架(ArrayList、HashSet、HashMap使用)

一、集合Collection1. 集合介紹變量:表示的內存中的一個空間,只能保存確定類型的單個數據數組:表示的是內存中的多個連續的空間,這些空間中可以存儲多個同類型的數據。后期繼續學習面向對象技術,我們在程序中開始創建對…

Vue進階知識筆記

利用v-for循環出的多個li標簽&#xff0c;點擊不同的li變換顏色 方法一 <ul v-for"(item,index) in list" :key"index" class"details"><li ref"lisd" click"faillist(index)" :class"{active:ind index}&qu…

teamcity mysql 配置_CentOS 7 上 TeamCity 安裝

CentOS 7 上 TeamCity 安裝非入門教程, 初次接觸centos/docker的朋友需要謹慎一. 安裝 MySQL為了后續的需要, 這里安裝了 Docker, 當然如果你已經有了 MySQL 或者其它推薦的數據庫[MySQL, PostgreSQL, Oracle, MS SQL], 則可忽略1. 安裝 Docker補充:# 啟動dockersudo systemctl…

Python網絡請求庫Requests,媽媽再也不會擔心我的網絡請求了(二)

本文同步發表于我的微信公眾號&#xff0c;掃一掃文章底部的二維碼或在微信搜索 極客導航 即可關注&#xff0c;每個工作日都有文章更新。 一、概況 接著上篇說&#xff0c;如果你真以為Requests網絡請求庫只有Get請求和Post請求&#xff0c;那就大錯特錯了。它還一些其他用法&…

dbunit java_java - 錯誤地拋出了Java DBUnit AmbiguousTableNameException - 堆棧內存溢出

我正在嘗試DBUnit(2.6.0)&#xff0c;我正在嘗試導出我的完整數據庫(PostgreSQL)。 但是拋出以下異常&#xff1a;線程“main”中的異常org.dbunit.database.AmbiguousTableNameException&#xff1a;FLYWAY_SCHEMA_HISTORY這是正確的行為&#xff0c;因為我有兩個具有相同名稱…

Docker 命令詳解(run篇)

參考&#xff1a;https://www.cnblogs.com/yfalcon/p/9044246.html 命令格式&#xff1a;docker run [OPTIONS] IMAGE [COMMAND] [ARG...]Usage: Run a command in a new container中文意思為&#xff1a;通過run命令創建一個新的容器&#xff08;container&#xff09; 常用選…

java 同步 lock_關于java:同步是否像Lock.lock()一樣駐留并發線程?

當我們調用lock.lock()或嘗試輸入synchronized塊時&#xff0c;如果其他某個線程已經獲得了該鎖&#xff0c;則我們的線程將阻塞。 現在我的問題是&#xff0c;當我們查看lock.lock()的實現時&#xff0c;它會將獲取鎖委托給AQS&#xff0c;而AQS實際將當前線程駐留在該線程中(…

Idea項目中常見錯誤及筆記(Old)

1、Idea基礎設置&#xff1a; File-->settings--> 1>修改字體&#xff1a;Font 2>修改編碼格式&#xff1a;File Encodings(全部UTF-8,右下方復選框勾中--防止程序中的漢字轉為ASCII碼) 3>修改行號&#xff1a;Appearance&#xff1a;show line numbers show me…

java接口服務編排_GOKU API Gateway CE V3.1.0 發布:新增服務編排、配置版本管理等...

Goku API Gateway (中文名&#xff1a;悟空 API 網關)是一個基于 Golang 開發的微服務網關&#xff0c;能夠實現高性能 HTTP API 轉發、服務編排、多租戶管理、API 訪問權限控制等目的&#xff0c;擁有強大的自定義插件系統可以自行擴展&#xff0c;并且提供友好的圖形化配置界…

maxcompute 2.0復雜數據類型之array

2019獨角獸企業重金招聘Python工程師標準>>> 1. 含義 類似于Java中的array。有序、可重復。 2. 場景 什么樣的數據&#xff0c;適合使用array類型來存儲呢&#xff1f;這里列舉了幾個我在開發中實際用到的場景。 2.1 標簽類的數據 為什么說標簽類數據適合使用array類…

java中匿名數組_Swagger UI:數組中的多個匿名對象

對象數組的定義如下&#xff1a;type: arrayitems:type: objectproperties:prop1:type: stringprop2:type: integer# etc.在您的示例中&#xff0c;響應包含具有屬性 balanceDisplaySettings 的對象&#xff0c;并且此屬性包含對象數組 . 這可以定義如下&#xff1a;paths:/Pat…

java ioutils 寫入文件_文件輸入輸出流工具: IOUtils使用總結

序言以前寫文件的復制很麻煩&#xff0c;需要各種輸入流&#xff0c;然后讀取line&#xff0c;輸出到輸出流...其實apache.commons.io里面提供了輸入流輸出流的常用工具方法&#xff0c;非常方便。下面就結合源碼&#xff0c;看看IOUTils都有什么用處吧&#xff01;常用的靜態變…

權限組件(6):權限分配的角色管理

效果圖&#xff1a; 為了方便開發&#xff0c;先把中間件注釋掉&#xff0c;要不還要在角色-權限表中添加對應關系。又因為二級菜單和面包屑導航需要中間件的變量&#xff0c;所以要在layout.html里面把這兩個也注釋掉。setting.py# rbac.middlewares.rbac.RbacMiddleware layo…

java 面試700問_JAVA面試700問(一)

1、Java環境中的字節碼是什么&#xff1f;由Java 編譯器生成的一種代碼。由JVM生成的一種代碼。Java源文件(Java Source File)的別名。一種寫在類的實例方法中的代碼。答案&#xff1a;由Java 編譯器生成的一種代碼。2、什么是Java垃圾回收機制&#xff1f;操作系統周期性的刪除…

02-Django基礎知識

一、內容回顧 1、web應用程序 2、HTTP協議 a、http協議特性 b、http請求格式 c、http響應格式 3、wsgiref模塊 4、Django下載與簡單應用 a、Django簡介&#xff08;MTV&#xff09; b、下載django命令 c、創建項目命令 d、創建app應用 e、啟動項目   二、今日概要 1、路由層&…

java條碼大小_java - ML Kit條形碼掃描:無效的圖像數據大小

我想在捕獲的圖像中檢測條形碼。我使用android的camera2捕獲圖像。此后&#xff0c;將檢索圖像的元數據并將圖像保存到設備。元數據全部傳遞到下一個活動&#xff0c;該活動是應用程序嘗試檢測條形碼的地方。下一個活動是從先前保存的文件創建一個byte []。接下來&#xff0c;使…

MongoDB數據庫泄露8億電郵地址;微軟開源Windows計算器;Linux 5.0 Kernel發布丨Q新聞...

本周要聞&#xff1a;華為正式宣布起訴美國政府&#xff1b;360 首席安全官譚曉生宣布離職&#xff1b;阿里開源 Flutter 應用框架 Fish Redux&#xff1b;微軟開源 Windows 計算器&#xff1b;Linux 5.0 Kernel 發布&#xff1b;電郵驗證服務泄漏 8 億電郵地址&#xff1b;Chr…

mysql 視圖 分頁_mysql查看所有存儲過程,函數,視圖,觸發器,表,分頁

查詢數據庫中的存儲過程和函數方法一&#xff1a;select name from mysql.proc where db your_db_name and type PROCEDURE //存儲過程select name from mysql.proc where db your_db_name and type FUNCTION //函數方法二&#xff1a;show procedure status; //存儲過程sh…