背景
隨著互聯網服務的廣泛普及與技術應用的深入發展,日志數據作為記錄系統活動、用戶行為和業務操作的寶貴資源,其價值愈發凸顯。然而,當前海量日志數據的產生速度已經遠遠超出了傳統數據分析工具的處理能力,這不僅要求我們具備高效的數據收集和存儲機制,更呼喚著強大、靈活且易用的數據分析平臺的誕生。在此背景下,Apache Spark,這一專為大規模數據處理而設計的計算引擎,成為了構建高性能日志分析應用的理想選擇。
阿里云 EMR Serverless Spark 版是一款全托管、一站式的數據處理平臺,基于Spark Native Engine構建,專為大規模數據處理和分析設計,提供彈性、高效的服務,讓用戶無需關注基礎設施管理,100%兼容Spark,簡化從開發到運維的全鏈路工作流程。
本文將以 OSS 日志處理場景為例,演示使用 EMR Serverless Spark 產品快速搭建日志分析應用。
OSS-HDFS 審計日志簡介
阿里云的 OSS-HDFS 服務,是專為大數據處理和云原生數據湖存儲設計的產品。該服務由阿里云的JindoFS提供技術支持,旨在無縫橋接阿里云對象存儲(OSS)與 HDFS 生態系統,為 Apache Hadoop、Hive、Spark、Flink 等大數據處理框架提供高性能、高兼容性的存儲解決方案。
在阿里云 OSS 控制臺創建一個新的 OSS Bucket 時可以選擇開通 HDFS 服務,創建完成后新的 OSS Bucket 即可支持 HDFS 接口訪問:
HDFS審計日志(Audit Log)是Hadoop分布式文件系統(HDFS)的一個重要組成部分,它詳盡地記錄了所有用戶對 HDFS 執行的操作信息。這些日志對于系統管理員監控、安全審計以及故障排查至關重要。每當用戶通過 HDFS 的 NameNode 執行操作(如讀取、寫入、刪除文件或目錄等),NameNode 就會生成一條審計日志記錄。類似于開源版 HDFS,OSS-HDFS 默認就支持 auditlog 日志,在根目錄下的 /.sysinfo/auditlog 目錄下保存了近一個月的審計日志,并且按照日期目錄進行切分。
審計日志條目通常包含一些關鍵信息,比如操作時間、操作人、操作成功與否、來源IP、操作命令、操作目標文件等。下面三條日志分別記錄了delete、getfileinfo和mkdir操作詳情:
EMR Serverless Spark 工作空間簡介
使用 EMR Serverless Spark 產品之前,需要了解工作空間相關的概念,工作空間是 EMR Serverless Spark 為業務開發劃分的基本單元,是任務、資源和權限的集合。
接下去就可以參考產品的快速入門文檔來體驗:
1. 阿里云賬號角色授權:開通工作空間的前置操作
2. 創建Spark工作空間:需要提前開通 OSS 和 DLF 等阿里云服務
3. SQL任務快速入門:接下去的 EMR Serverless Spark 任務開發會使用 SQL 任務
EMR Serverless Spark 任務開發
下面我們來演示如何通過EMR Serverless Spark搭建一個日志分析應用。日志分析的一個很常見的需求是分析前一天訪問 OSS-HDFS Bucket 的來源IP,比如希望找到有來自某些IP的異常突發流量,或者在事后調查敏感文件是否被異常IP所訪問。
因為SQL是在數據分析中最常用的工具,所以使用 Spark SQL 來分析OSS-HDFS的審計日志。前面我們已經通過《SQL任務快速入門》對 SparkSQL 類的任務有了簡單的了解,這部分內容會針對數據倉庫源數據層、明細層、匯總層分別創建一個 SQL 任務。
源數據層
首先是日志文件的來源,我們要建立一個源數據層(ODS)的表,因為審計日志已經被歸檔到OSS-HDFS的系統目錄里,所以我們可以通過Spark SQL建一個CSV外表:
1. 表路徑指向系統目錄 oss://<BUCKET_NAME>.<REGION_ID>.oss-dls.aliyuncs.com/.sysinfo/auditlog/ (在操作的時候需要將 BUCKET_NAME 和 REGION_ID 替換為實際使用的 OSS Bucket 名稱和所在地域)
2. 日志條目中的不同字段用制表符(tab)分隔,所以指定 sep = '\t'
3. ${ds} 是 Serverless Spark開發和調度平臺使用的內置變量,代表業務日期(T-1)。比如在2024年5月21日運行的SQL任務,業務時間是指前一天,${ds}=2024-05-20(在這里無需手動替換 ds 值)
把這個SQL文件(s_oss_hdfs_audit_tmp.sql)保存后,點擊發布。
數倉明細層
其次,我們要基于這個ODS外表創建一張數據倉庫明細層(DWD)表,以Parquet格式存儲,并按天進行分區。我們需要對 ODS 表進行簡單的清晰和轉換,比如把access_time從字符串轉換timestamp成類型,將字段內容 ip=172.16.0.99 轉換為 IP 地址 172.16.0.99 等。這個SQL里同樣使用了 ${ds} 內置變量。
把這個SQL文件(dwd_oss_hdfs_audit_di.sql)保存后,點擊發布。
數倉匯總層
最后,我們對數倉明細層數據做一個簡單的分析,取出前一天請求量最大的20個IP地址,我們會創建一張 DWS 匯總表:
把這個SQL文件(dws_oss_hdfs_ip_ana.sql)保存后,點擊發布。
EMR Serverless Spark 任務編排
創建工作流
在前面的章節中,我們已經分別在數據倉庫源數據層、明細層、匯總層各創建一個 SQL 任務,這些任務都處于“已發布”狀態。接下去我們需要創建一個工作流把這三個SQL任務進行適當的編排,并且讓工作流能在每天的固定時間進行調度。
在 Serverless Spark 工作空間的導航欄中找到“任務編排”鏈接,點擊“創建工作流”后進入新建工作流 oss_hdfs_auditlog 的配置界面。在這個界面里需要填寫工作流名稱和資源隊列,同時可以選擇調度類型是“調度器”,調度周期是每天的 00:05。
編輯節點
在編輯工作流的頁面,鼠標左鍵雙擊節點,或者單擊下方的添加節點,進入節點編輯頁面。我們需要按順序選擇s_oss_hdfs_audit_tmp、dwd_oss_hdfs_audit_di、dws_oss_hdfs_ip_ana節點,加入到工作流中。
同時也需要配置節點依賴關系,比如 dwd_oss_hdfs_audit_di 節點的上游節點是 s_oss_hdfs_audit_tmp,dws_oss_hdfs_ip_ana 節點的上游節點是 dwd_oss_hdfs_audit_di。
三個節點編輯完成之后,自動生成如下 DAG,完成工作流的編輯。
發布工作流
在工作流編輯頁面右上角,點擊“發布工作流”,在輸入發布信息后點擊“確認”,完成工作流的發布。
發布工作流之后自動跳轉回到工作流列表,我們可以看到新創建的工作流。打開“調度狀態”開關,之后工作流會根據調度器的設置進行按天調度。
點擊工作流名稱,進入工作流調度實例列表,在這里可以看到每次調度運行的成功或失敗的任務節點,也可以點擊右上角的“手動運行”按鈕進行一次手動調度。
在每天凌晨的定時調度完成之后或者一次手動調度成功之后,我們可以回到 SQL 任務開發界面,在編輯器中輸入如下 SQL 查詢語句,可以快速獲取到前一天請求 OSS-HDFS 數量最多的前 20 個 IP 地址:
總結
本文演示了使用 Serverless Spark 產品搭建一個日志分析應用的全流程,包括數據開發和生產調度以及交互式查詢等場景。
EMR Serverless Spark 在 2024年5月正式開啟公測,在公測期間可以免費使用最高 100 CU 計算資源,歡迎試用。如果您在使用 EMR Serverless Spark 版的過程中遇到任何疑問,可釘釘掃描以下二維碼加入釘釘群(群號:58570004119)咨詢。
快速跳轉
1. EMR Serverless Spark 版官網:https://www.aliyun.com/product/bigdata/serverlessspark
2. 產品控制臺:https://emr-next.console.aliyun.com/
3. 產品文檔:https://help.aliyun.com/zh/emr/emr-serverless-spark/
4. SQL 任務快速入門:https://help.aliyun.com/zh/emr/emr-serverless-spark/getting-started/get-started-with-sql-task-development