雲計算已經從根本上改變了企業經營——用戶不再受限製等本地硬件部署資源和繁重的環境升級過程的物理限製。雲服務的便利性和靈活性來挑戰如何正確監控用戶使用這些方便的可用資源。未能這樣做可能導致問題和昂貴的反模式(與雲提供商的核心資源和一個PaaS像磚)。磚進行了設計,從而與公共雲提供商緊密耦合,如微軟和亞馬遜網絡服務,充分利用這個新範式,審計日誌功能提供了管理員一個集中的方法來理解和管理活動發生在平台。Beplay体育安卓版本管理員可以使用磚審計日誌監控模式集群的數量或工作在某一天,執行這些操作的用戶,任何用戶被拒絕授權到工作區中。
在本係列的第一篇博文中,信任,但要核查磚,我們覆蓋磚管理員可以使用磚和其他雲提供商日誌審計日誌的補充他們的雲監控場景的解決方案。磚審計日誌的主要目的是讓企業安全團隊和平台管理員跟蹤數據訪問和使用中可用的各種接口數據磚工作區資源平台。Beplay体育安卓版本在這篇文章中,我們將介紹,在細節,這些角色可以如何處理和分析審計日誌跟蹤資源使用和識別潛在的昂貴的反模式。
審計日誌ETL設計
磚為所有人帶來審計日誌啟用工作區根據SLA以JSON格式交付客戶擁有的AWS S3 bucket。這些審計日誌包含為特定的行為事件相關的主要資源集群等工作,工作空間。簡化客戶交付和進一步分析,磚記錄每個事件的每一個行動都作為一個單獨的記錄並存儲所有相關參數為稀疏Sbeplay体育app下载地址tructType稱為requestParams。
為了使這些信息更容易獲得,我們建議一個ETL過程基於結構化流和三角洲湖。
- 利用結構化流允許我們:
- 離開狀態管理的構建目的構建狀態管理。而不必思考多長時間以來運行之前運行以確保我們隻添加適當的記錄,我們可以利用結構化流的檢查站和寫前日誌,確保我們隻處理新添加的審計日誌文件。我們可以設計流的查詢triggerOnce日常工作,就像pseudo-batch工作
- 利用三角洲湖允許我們做以下:
作為參考,這是磚的圖案參考架構建議:
銅:最初的著陸區管道。我們建議複製的數據盡可能接近其原始形式輕鬆回放整個管道從一開始,如果需要的話
銀:原始數據得到潔淨(認為數據質量檢查),轉換和潛在的豐富與外部數據集
黃金:工業生產數據,整個公司可以依靠商業智能,描述性統計和數據科學/機器學習
我們自己的圖案架構後,我們把它我們的審計日誌ETL設計如下:
原始數據銅表
流從磚的原始JSON文件交付使用一個基於文件的結構化流到青銅三角洲湖表。這將創建一個持久的原始數據的副本,讓我們重放ETL、我們應該在下遊找到任何問題表。
磚提供審計日誌的形式向客戶指定的AWS S3 bucket JSON。,而不是寫作的邏輯來確定我們的狀態三角洲湖表,我們要利用結構化流寫前的日誌和檢查點來保持我們的狀態表。在這種情況下,我們設計我們的ETL每天運行一次,所以我們使用源文件
與triggerOnce
用流媒體框架來模擬一個批處理工作負載。由於結構化流需要我們明確定義的模式,我們將讀取原始JSON文件一旦建立它。
streamSchema = spark.read.json (sourceBucket) . schema
我們然後實例化StreamReader
使用模式我們推斷和原始審計日誌的路徑。
streamDF =(火花.readStream .format (json) . schema (streamSchema) .load (sourceBucket))
然後實例化我們的StreamWriter
並寫出原始審計日誌到青銅三角洲湖表分區的日期。
(streamDF .writeStream .format .partitionBy(“δ”)(“日期”).outputMode .option(“追加”)(“checkpointLocation”,“{} /檢查點/青銅“.format (sinkBucket)) .option(“路徑”,“{}/流/青銅“.format (sinkBucket)) .option (“mergeSchema”,真的).trigger(一旦= True) .start ())
現在我們已經創建了表在一個AWS S3 bucket,我們需要注冊表數據磚蜂巢metastore讓最終用戶對數據的訪問更容易。我們將創建邏輯數據庫audit_logs
之前,創建一個青銅表。
如果不存在創建數據庫audit_logs火花。sql(“如果不存在audit_logs“創建表。青銅使用三角洲位置“{}/流/青銅”“”“.format (sinkBucket))
如果你在批處理或更新你的三角洲湖表pseudo-batch時尚,這是最佳實踐優化
後立即更新。
優化audit_logs.bronze
銅銀表
從青銅三角洲湖表流銀三角洲湖表,這樣它將稀疏requestParams StructType每個記錄的刪除空的鍵,以及執行等其他基本轉換解析電子郵件地址從一個嵌套的字段和解析UNIX新紀元UTC時間戳。
因為我們船審計日誌中所有磚資源類型的一個共同的JSON格式,我們定義了一個規範的結構requestParams
它包含一個聯盟的關鍵資源類型。最後,我們要創建單獨的數據表為每個服務,所以我們要拆開requestParams
為每個表字段,使它隻包含相關的資源類型的鑰匙。為此,我們定義了一個用戶定義的函數(UDF)除去所有這些鍵requestParams
有零
值。
def stripNulls(生):返回json。轉儲({我:raw.asDict()[我]我raw.asDict()如果raw.asDict()[我]! =沒有})strip_udf = udf (stripNulls, StringType ())
我們實例化一個StreamReader
從我們的青銅三角洲湖表:
bronzeDF =(火花.readStream .load(“{} /流/青銅”.format (sinkBucket)))
然後下麵的轉換應用於流媒體數據從青銅三角洲湖表:
- 去掉
零
鍵requestParams
和存儲為字符串的輸出 - 解析
電子郵件
從userIdentity
- 解析的實際時間戳/時間戳數據類型
時間戳
場和存儲date_time
- 把生
requestParams
和userIdentity
查詢= (bronzeDF .withColumn(“扁平化”,strip_udf (“requestParams”)) .withColumn(“電子郵件”,上校(“userIdentity.email”)) .withColumn (“date_time from_utc_timestamp (from_unixtime (col(“時間戳”)/ 1000),UTC)) .drop .drop (“requestParams”) (“userIdentity”))
然後我們流的記錄變成銀三角洲湖表:
(查詢.writeStream .format .partitionBy(“δ”)(“日期”).outputMode .option(“追加”)(“checkpointLocation”,“{} /檢查點/銀”.format (sinkBucket)) .option(“路徑”,“{}/流/銀”.format (sinkBucket)) .option (“mergeSchema”,真的).trigger(一旦= True) .start ())
再次,因為我們已經創建了一個表基於AWS S3 bucket,我們需要注冊到萬歲Metastore更容易訪問。
火花。sql(“如果不存在audit_logs“創建表。銀使用三角洲位置“{}/流/銀”“”“.format (sinkBucket))
雖然結構化流擔保完全處理後,我們仍然可以添加一個斷言檢查項銅牌三角洲湖表到銀三角洲湖表。
斷言(spark.table (audit_logs.bronze) .count () = = spark.table (audit_logs.silver) .count ())
至於銅表之前,我們將運行優化
在更新後的銀表。
優化audit_logs.silver
白銀和黃金表
個人黃金三角洲湖流表為每個磚服務跟蹤審計日誌
黃金審核日誌表是什麼磚管理員將利用他們的分析。通過requestParams字段精簡的服務水平,現在更容易掌握分析和相關的事情。與三角洲湖優雅地處理模式演化的能力,如磚跟蹤額外的行動為每個資源類型,黃金表將無縫地改變,消除錯誤的需要硬編碼模式或照顧。
在ETL過程的最後一步,我們首先定義一個UDF來解析從原文的精簡版本的鑰匙requestParams
字段。
def justKeys(字符串):返回(我因為我在json.loads(字符串). keys ()] just_keys_udf = udf (justKeys, StringType ())
ETL的下一大塊,我們將定義一個函數實現如下:
- 收集每個記錄對於一個給定的密鑰
名
(資源類型) - 創建一組密鑰(去除重複)
- 創建一個模式適用於一個給定的關鍵
名
(如果名沒有任何鍵requestParams
,我們給它一個關鍵的模式占位符
) - 寫出個人黃金三角洲湖表
名
在銀三角洲湖表中
def flattenTable(這是bucketName): flattenedStream = spark.readStream.load(“{} /流/銀”.format (bucketName)) =夷為平地spark.table (“audit_logs.silver”)…
我們提取所有惟一的值的列表名
用於迭代和運行上麵的每個值函數名
:
serviceNameList =[[‘名’]我在spark.table .select (“audit_logs.silver”)(“名”).distinct () .collect()]的名serviceNameList: flattenTable(這是sinkBucket)
和之前一樣,注冊蜂巢Metastore每個黃金三角洲湖表:
名的serviceNameList:火花。sql(“如果不存在audit_logs“創建表。{0}用δ位置的{1}/流/金/ {2}“”“”.format(這是sinkBucket,我))
然後運行優化
每個表:
名的serviceNameList:火花。sql(“優化audit_logs。{}”.format(名)
再次,聲稱沒有必要數量是相等的,但我們仍然做:
flattened_count = spark.table (audit_logs.silver) .count()名在serviceNameList total_count = 0: total_count + = (spark.table (“audit_logs。{}“.format(名)).count())斷言(flattened_count = = total_count)
我們現在有一個表為每個黃金三角洲湖名
(資源類型)磚跟蹤審計日誌,我們現在可以使用進行監控和分析。
審計日誌分析
在上麵的部分中,我們使用ETL過程原始審計日誌,包括一些建議關於如何簡化數據訪問您的最終用戶和更好的性能。第一個筆記本包含在本文屬於ETL過程。
第二個筆記本我們已經包括進入更詳細的分析審計日誌事件本身。對於這篇文章的目的,我們將專注於資源類型之一集群,但我們已經包括了分析登錄作為另一個例子,管理員可以做的信息存儲在審計日誌。
可能是明顯的有些為什麼磚管理員可能希望監視集群,但它強調一遍:集群的正常運行時間是最大的動力成本,我們希望確保我們的客戶獲得最大價值當他們利用磚集群。beplay体育app下载地址
集群的一個主要部分正常運行時間方程是創建的集群的數量在這個平台上,我們可以使用審計日誌確定創建的磚集群的數量在給定的一天。Beplay体育安卓版本
通過查詢集群的黃金三角洲湖表,我們可以過濾actionName在哪裏創建
按日期和執行一個計數。
選擇日期,count(*)從集群num_clusters actionName =‘創造’1訂單1 ASC組
沒什麼背景在上麵的圖表,因為我們沒有其他天的數據。但是為了簡單起見,我們假設集群的數量增加了兩倍多比正常使用模式和用戶的數量並沒有改變有意義的那段時期。如果真的是這樣的話,那麼一個合理的解釋是,創建集群以編程方式使用工作。此外,12/28/19是周六,所以我們不要期望有許多互動集群創建。
檢查cluster_creator
字段,它應該告訴我們誰創造了它。
選擇requestParams。cluster_creator, actionName, count(*) FROM clusters WHERE date = '2019-12-28' GROUP BY 1,2 ORDER BY 3 DESC
基於上述結果,我們注意到JOB_LAUNCHER
714年創造了709個集群,集群12/28/19上創建,這證實了我們的直覺。
我們的下一步是找出哪些特定的工作創造了這些集群,我們可以提取從集群名稱。磚工作的集群按照此命名約定工作- < jobId >國營< runId >
,所以我們可以解析jobId
從集群名稱。
選擇分割(requestParams。cluster_name,“-”) [1] jobId, count(*)從集群actionName =‘創造’和日期= ' 2019-12-28 ' GROUP BY 1×2 DESC秩序
這裏我們看到jobId“31303”的罪魁禍首是絕大多數集群12/28/19上創建。另一個信息,存儲在審計日誌requestParams
是user_id
用戶創建的工作。由於工作的創造者是不可變的,我們可以把第一條記錄。
選擇requestParams。user_idFROM clusters WHERE actionName = 'create' AND date = '2019-12-28' AND split(requestParams.cluster_name, "-")[1] = '31303' LIMIT 1
現在,我們有user_id
用戶創建的工作,我們可以利用SCIM API直接獲取用戶的身份和問他們什麼可能發生在這裏。
除了監控集群整體的總數,我們鼓勵磚管理員特別注意所有沒有目的計算集群autotermination啟用。原因是這樣的集群將繼續運行,直到手動終止,無論他們空閑與否。您可以識別這些集群使用以下查詢:
選擇日期,count(*)從集群num_clusters actionName =‘創造’和requestParams。autotermination_minutes = 0和requestParams。cluster_creatorIS null GROUP BY 1 ORDER BY 1 ASC
如果你使用我們的示例數據,你會發現有5個集群的cluster_creator
是零這意味著他們是由用戶而不是工作。
通過選擇創建者的電子郵件地址和集群的名字,我們可以確定哪些集群需要終止哪些用戶,我們需要討論磚資源管理的最佳實踐。
如何開始處理數據磚審計日誌嗎
靈活的ETL過程,遵循最佳實踐的大獎章架構與結構化流和三角洲湖,我們簡化磚審計日誌的分析通過創建單獨的數據表為每個數據磚資源類型。聚類分析的例子隻是其中之一的許多方麵分析審計日誌有助於識別有問題的反模式可能導致不必要的成本。請使用以下筆記本具體步驟我們包含在這篇文章試試在你結束:
更多的信息,你也可以看最近的技術討論:最佳實踐對如何處理和分析審計日誌與三角洲湖和結構化流。
稍微不同的架構,流程的審計日誌,隻要他們可用,考慮評估新自動加載程序能力,我們詳細討論博客。
我們希望我們的客戶價值最beplay体育app下载地址大化他們從我們的平台,所以請聯係你的磚賬戶團隊如果你有任何問題。Beplay体育安卓版本