跳轉到主要內容
Beplay体育安卓版本平台的博客

建立一個手機遊戲事件與磚三角洲的數據管道

2018年7月2日 產品

分享這篇文章

如何構建一個端到端數據和結構化流管道嗎
在磚試試這個筆記本

手機遊戲的世界是快節奏的,需要快速規模的能力。與世界各地的數百萬用戶每秒生成數以百萬計的事件通過遊戲,你需要計算關鍵指標(分數調整,購買遊戲,遊戲操作,等等)實時。同樣重要的是,一個流行的遊戲啟動或功能會增加事件交通量的數量級和您需要的基礎設施來處理這種快速的規模。

與低延遲的洞察力和快速的複雜性可伸縮的基礎設施,構建數據管道等大量用例流媒體手機遊戲分析複雜和混亂。開發人員負責這項努力會遇到一些建築問題。

  • 首先,他們應該考慮什麼技術,將會減少他們的學習曲線,整合好嗎?
  • 第二,何時可伸縮的架構將如何建造的?
  • 最後,不同的角色在一個組織將如何合作?

最終,他們將需要建立一個端到端的數據管道這三個功能組件包括:數據攝入/流媒體;數據轉換(ETL);和數據分析和可視化。

解決這些問題的一個方法是通過選擇一個統一的平台,提供了這些功能。Beplay体育安卓版本磚提供了一個統一的分析平台Beplay体育安卓版本彙集了大數據和人工智能的不同角色,並允許您的組織一起合作在一個工作區。

在這個博客中,我們將探索如何:

  • 建立一個手機遊戲數據管道使用AWS API等服務網關,λ,和運動流
  • 建立一個服務使用火花結構化流流攝入
  • 使用磚三角洲湖作為我們的水槽流操作
  • 探討分析可以直接在此表執行,數據延遲最小化
  • 說明磚三角洲解決傳統的流數據的問題

高水平的基礎設施組件

構建手機遊戲數據管道是複雜的事實,你需要迅速可伸縮的基礎設施來處理數以百萬計的事件由數以百萬計的用戶,並獲得實時可行的見解。這就是構建一個數據管道的美麗與AWS和磚。運動碎片可以動態地必須處理負荷增加,和磚自動天平的集群來處理數據的增加。

在我們的例子中,我們從移動用戶模擬遊戲事件與事件生成器。這些事件被推到一個REST端點並通過攝入到我們跟隨我們的數據管道磚三角洲的表。可以找到這個事件的代碼生成器在這裏

Amazon API網關、λ和運動流

對於本例,我們使用Amazon API構建REST端點網關。事件到達這個端點自動觸發serverless lambda函數,哪管這些事件變成了我們的運動流消費。你想要設置λ集成端點自動觸發,並調用一個函數,將寫這些事件動作。

設置一個Python lambda函數如下所示:

進口json進口boto3進口隨機進口base64進口時間deflambda_handler(事件中,上下文):打印“收到事件:{}”格式(事件)stream_name =“streamdemo_incoming”記錄= json.loads(事件(“身體”])記錄(“eventTime”]=int(time.time ())事件(“身體”]=記錄客戶= boto3.client (“運動”)客戶端。put_record (StreamName = stream_name, Data = json.dumps(事件),PartitionKey =str(random.randint (1,One hundred.)))返回沒有一個

提供動作流的吞吐量,所以你可以提供盡可能多的碎片需要處理你的預期數據吞吐量。每個碎片都提供一個吞吐量1 MB /秒的寫和讀2 MB /秒,或每秒1000條記錄。關於運動流吞吐量的更多信息,查看文檔。隨機PartitionKeys對均勻分布很重要,如果你有一個以上的碎片。

攝取從使用結構化流運動

直接是攝取運動數據流。在生產環境中,您需要設置的適合我的角色的政策確保您的集群能夠訪問你的運動流。最低權限這看起來像這樣:

{“版本”:“2012-10-17”,“聲明”:【{“效應”:“允許”,“行動”:【“運動:DescribeStream”,“運動:GetRecords”,“運動:GetShardIterator”),“資源”:“ARN_FOR_YOUR_STREAM”}]}

或者,您也可以使用AWS訪問鍵通過他們的選擇然而,我生產用例角色最佳實踐方法。在這個例子中,我們假設集群有合適我的角色設置。

首先創建一個DataFrame是這樣的:

kinesisDataFrame =火花\.readStream \格式(“運動”)\.option (“streamName”,“MY_KINESIS_STREAM_NAME”)\.option (“initialPosition”,“STREAM_POSITION”)\.option (“地區”,“KINESIS_REGION”)\.load ()

您還需要定義輸入數據的模式。動作包裝數據如下所示:

kinesisSchema=StructType () \添加(“身體”StringType ()) \添加(“資源”StringType ()) \添加(“requestContext”StringType ()) \添加(“queryStringParameters”StringType ()) \添加(“httpMethod”StringType ()) \添加(“pathParameters”StringType ()) \添加(“頭”StringType ()) \添加(“stageVariables”StringType ()) \添加(“路徑”StringType ()) \添加(“isBase64Encoded”StringType ())eventSchema=StructType ()。添加(“eventName”StringType ()) \添加(“eventTime”TimestampType ()) \添加(“eventParams”StructType () \添加(“game_keyword”StringType ()) \添加(“app_name”StringType ()) \添加(“scoreAdjustment”IntegerType ()) \添加(“Beplay体育安卓版本平台”StringType ()) \添加(“app_version”StringType ()) \添加(“device_id”StringType ()) \添加(“client_event_time”TimestampType ()) \添加(“數量”倍增式()))

這個演示,我們真的隻對的身體感興趣kinesisSchema,它將包含我們描述的數據eventSchema

someEventDF=kinesisDataFrame。選擇Expr("cast (data as STRING) jsonData") \選擇(from_json (“jsonData”kinesisSchema) .alias (“requestBody”))\選擇(from_json (“requestBody.body”eventSchema) .alias (“身體”))\選擇(“body.attr1”,“body.attr2”,“body.etc”)

實時數據管道使用磚三角洲

現在我們有流dataframe定義,讓我們來做一些簡單的轉換。事件數據通常是基於時間序列的,所以最好是分區類似事件的日期。我們輸入流並沒有一個事件日期參數,然而,所以我們將我們自己的改變eventTime列。我們還將把檢查以確保eventTime不是零:

base_path =“/道路/ / mobile_events_stream /”eventsStream = gamingEventDF。過濾器(gamingEventDF.eventTime.isNotNull ()) .withColumn (“eventDate”to_date (gamingEventDF.eventTime)) \.writeStream \.partitionBy (“eventDate”)\格式(“δ”)\.option (“checkpointLocation”base_path +' / _checkpoint ')\.start (base_path)

我們也借此機會定義表的位置。

創建如果存在mobile_events_delta_raw使用δ位置“/道路/ / mobile_events_stream /”;

實時分析、kpi和可視化

現在我們有了數據流住進我們的磚三角洲的表,我們可以去看一些kpi。傳統上,公司隻會每天看這些,但隨著結構化流和磚三角洲,你有能力想象這些實時數據磚內筆記本。

讓我們從一個簡單的例子開始。我在最後一小時多少事件嗎?

countsDF=gamingEventDF。withWatermark (“eventTime”、“180分鍾”).groupBy (窗口(“eventTime”、“60分鍾”))。()countsQuery=countsDF。writeStream \.format (“記憶”)\.queryName (“incoming_events_counts”)\開始()

我們可以想象這個筆記本說,一個柱狀圖:

也許我們可以讓事情更有趣。我在最後一個小時多少錢?讓我們檢查預訂。理解每小時預訂是一個重要的指標,因為它可以表明我們的應用程序/生產係統是如何做的。如果有訂單驟降後補丁部署一個新的遊戲,例如,我們立即知道是錯誤的。

我們可以采取同樣的dataframe,但過濾purchaseEvents、分組60分鍾的一個窗口。

bookingsDF=gamingEventDF。withWatermark (“eventTime”、“180分鍾”)。過濾器(gamingEventDF.eventName==“purchaseEvent”).groupBy (窗口(“eventTime”、“60分鍾”))。總和(“eventParams.amount”)bookingsQuery=bookingsDF。writeStream \.format (“記憶”)\.queryName (“incoming_events_bookings”)\開始()

讓我們選擇一個圖來可視化這一行:

手機遊戲事件的端到端數據管道磚

對於SQL愛好者,可以直接查詢磚三角洲表。讓我們看看一個簡單的查詢,顯示當前每日活躍用戶(道)。我知道我們看設備id,因為我們的樣本集不包含一個用戶id,那麼為了示例中,我們假設用戶和設備之間有一對一的映射(雖然在現實世界中,這並非總是如此)。

選擇(截然不同的eventParams.device_id)作為mobile_events_delta_raw在哪裏to_date (eventTime)=當前日期;

解決了傳統磚三角洲流“小文件”問題

許多共同挑戰麵對流是典型的“小文件”的問題。根據你寫的頻率被觸發,你攝入的體積流量,你可以得到很多的不同大小的文件,其中許多太小操作效率。

磚三角洲的引入解決了這個問題優化命令。這個命令有效地對這些文件進行壓縮,這樣你有更大的(1直布羅陀海峽)文件。

優化“/道路/ / mobile_events_stream /”

然而,你會發現仍然有很多小文件。這是因為磚三角洲的管理事務。你也許會查詢或長期運行的流程,還訪問您的舊文件,壓實後完成。任何新的查詢或提交的工作在這個時候結束訪問更新、更大的文件,但任何現有的工作仍將查詢舊文件。

你可以定期清理這些通過調用真空命令。

真空“/ mnt / syu / mobile_events_stream /”;

結果簡單:

默認情況下真空刪除文件超過7天。但是你可以通過指定一個手動設置自己的保留保留條款如下:

真空“/道路/ / mobile_events_stream /”保留12小時;

強烈建議你不要保留設置為0小時,除非你絕對確信沒有其他進程寫入或讀取你的表。

總結

最後,我們展示了如何建立一個數據管道的三個功能組件使用磚統一分析平台Beplay体育安卓版本:火花結構化流,磚δ,磚筆記本。我們已經闡明了不同的方式,你可以從這個實時流數據推斷關鍵性能指標,以及解決傳統與流媒體相關的問題。火花的組合結構化流和磚三角洲減少整個端到端延時和可用性的數據,使數據工程,數據分析,快速響應事件和數據科學團隊像一個訂單驟降,或增加錯誤消息事件,直接影響收入。此外,通過刪除數據工程複雜性通常伴隨著這樣的管道磚統一分析平台Beplay体育安卓版本,這使得數據工程團隊專注於高附加值的項目。

了解更多關於這個特定的例子中,我已經包括了下麵的一些資源,以及一個筆記本給你自己嚐試。

閱讀更多

磚三角洲的更多信息,結構化流,和筆記本電腦,閱讀這些來源

對開源三角洲湖感興趣嗎?
訪問在線三角洲湖中心要了解更多,請下載最新的代碼,並加入三角洲湖社區。

免費試著磚
看到所有產品的帖子
Baidu
map