介紹
磚三角洲湖是一個統一的數據管理係統,使數據可靠性和快速分析雲數據的湖泊。在這篇文章裏,我們將peek引擎蓋下麵檢查使磚三角洲秒內能夠篩選pb的數據。特別是,我們討論數據不和ZORDER集群。
這兩個特性使相結合磚運行時極大地減少了需要掃描的數據量為了回答高度選擇性對大型三角洲表查詢,通常轉化成數量級運行時改進和成本節約。
你可以看到這些特性在行動主旨演講從2018年火花+人工智能峰會,蘋果的多米尼克•Brezinski展示了他們的用例磚三角洲作為一個統一的解決方案的環境科學工程和數據網絡安全監控和威脅的反應。
得到的早期預覽O ' reilly的新電子書一步一步的指導你需要開始使用三角洲湖。
如何使用數據跳過和ZORDER集群
利用數據跳過,所有你需要做的就是使用磚三角洲。無論何時你的功能是自動和踢SQL查詢或數據集操作包括過濾器的形式“列op文字”,地點:
列
是一些磚三角洲的屬性表,無論是頂級或嵌套,其數據類型是字符串/數字/日期/時間戳
人事處
是一個二進製比較運算符,StartsWith / %’的模式,或
文字
是一個顯式的(列表)值(s)相同數據類型的列
和/或/不是
也支持,以及“文字op柱”謂詞。
如下我們將解釋,盡管數據不總是踢在上述條件得到滿足時,它可能並不總是非常有效。但是,如果你經常有一些列過濾器,要確保的快,那麼你可以顯式地優化你的數據布局對跳過有效性通過運行下麵的命令:
不僅僅是這樣。首先,讓我們後退一步,把東西放在上下文。
數據如何跳過和ZORDER集群工作嗎
這些特性的通用用例是提高針種查詢的性能對巨大的數據集。典型的RDBMS的解決方案,即二級索引,是不切實際的在大數據背景下由於可伸縮性方麵的原因。如果您熟悉大數據係統(Apache火花、蜂巢、黑斑羚、Vertica,等等),你可能已經思考:(水平)分區。快速提醒:在火花,就像蜂巢一樣,分區作品通過一子目錄中為每一個不同的分區列(s)的價值。分區列上查詢過濾器(s)可以從中受益分區修剪,即,avoid scanning any partition that doesn't satisfy those filters. The main question is:你分區列做什麼?和典型的回答是:你最有可能的過濾器在時間敏感的查詢。但是…如果有多個(4 +)說,同樣相關列?在這種情況下,問題是,你最終得到的大量的獨特的組合值,這意味著大量的分區,因此文件。有數據跨越許多小文件提出以下主要問題:
元數據是數據本身一樣大,導致各種駕駛員一側操作的性能問題
特別是,文件清單的影響,變得非常緩慢
壓縮效果被破壞,導致浪費空間和較慢的IO
所以當數據分區在火花一般適合於日期或分類列,不適合高聚合度列,在實踐中,它通常局限於一個或最多兩個列。
數據不
除了分區修剪,另一個用於數據倉庫的常用技術,但目前缺乏火花,I / O修剪基於小物化總量。簡而言之,我們的想法是:
跟蹤簡單的統計數據如最小和最大值在一定粒度與I / O相關的粒度。
利用這些統計數據查詢計劃時為了避免不必要的I / O。
這正是磚三角洲數據不特性是什麼。隨著新數據插入到磚δ表,文件級最小/最大統計收集所有列(包括嵌套的)支持的類型。然後,當有一個查找表查詢,磚三角洲首先谘詢這些統計數據,以確定哪些文件可以安全地忽略。但是,正如他們所說,一個GIF抵得上一千字,所以給你:
一方麵,這是一個輕量級的,靈活的(粒度可調)技術,很容易實現和思考。也是完全正交的分區:偉大的除了它工作,但不依賴於它。另一方麵,這是一個概率索引方法,像布魯姆過濾器,可能給假陽性,特別是當數據不是集群。這給我們帶來了我們的下一個技巧。
ZORDER集群
I / O是有效的數據需要修剪集群所以min-max範圍狹窄,理想情況下,重疊。這樣,對於一個給定的點查找,min-max範圍點擊的數量最小化,即跳過最大化。有時,數據恰好是自然集群:單調遞增id、列與插入時間(例如,日期/時間戳)或分區鍵(例如,pk_brand_name——model_name)。當事實並非如此,你仍然可以通過顯式地執行聚類分類範圍分區你的數據再插入。但是,假設你的工作負載由同樣頻繁/相關單列謂詞(如。n = 4)不同的列。在這種情況下,又稱為“線性”。“詞典”或“長短”排序的所有n列將強烈支持第一個指定,集群其價值觀完全。然而,它不會做太多,如果任何東西(取決於有多少重複的值在第一列),第二個,等等。因此,在所有的可能性,就沒有集群在第n列,因此沒有跳過可能涉及它的查找。那麼我們怎樣才能做得更好?更準確地說,我們如何實現類似跳過有效性以及每個個體維度?如果我們仔細想想,我們尋找的是一種將n維數據點分配給數據文件,這樣點分配給相同的文件也一起互相接近的每個單獨n維度。換句話說,我們想地圖多維分維值的方式保存位置。這是一個眾所周知的問題,不僅在數據庫中遇到的世界,但也在計算機圖形學等領域和geohash。答案是:保空間曲線,最常用的是z值和希爾伯特曲線。下麵是一個簡單的例子如何申請z值提高數據數據布局對於跳過有效性。傳說:
灰色的點=數據點如棋盤坐標
灰色的盒=數據文件;在這個例子中,我們的目標是為每個文件的4點
黃色的盒=數據文件的讀取給定查詢
綠色點=數據點通過查詢的過濾和查詢的答案
紅色的點=數據點讀,但不滿足過濾;“假陽性”
在網絡安全分析一個例子
好的,足夠的理論,讓我們回到火花+人工智能峰會主題,看看磚三角洲可用於實時網絡安全威脅的反應。說你正在使用兄弟流行的開源網絡流量分析儀,產生實時、全麵的網絡活動信息。你的產品是更受歡迎,更多你的服務習慣,因此,更多的數據兄弟開始輸出。寫這以足夠快的速度數據持久存儲在一個更結構化的方法為未來處理是第一大數據挑戰你的臉。這正是磚δ設計首先,使這個任務簡單和可靠。你可以做的是使用結構化數據流管你的兄弟康涅狄格州到date-partitioned磚三角洲的表,你會定期運行優化這樣你的日誌記錄最終均勻分布在中等數據文件。但這並不是這篇文章的重點,因此,出於演示目的,我們保持簡單和使用非,非分區數據磚三角洲表組成的均勻分布隨機數據。麵對潛在的網絡攻擊威脅,這種臨時數據分析你要運行是一係列的互動“查找”記錄網絡連接數據。例如,“找到所有最近的網絡活動涉及可疑IP地址。”We'll model this workload by assuming it's made out of基本的查找查詢與單列平等過濾器使用隨機抽樣IPs和港口。這樣的簡單查詢IO-bound,即他們的運行時線性依賴於掃描的數據量。這些查詢通常會變成全表掃描,可能運行幾個小時,這取決於你多少數據存儲和多遠你想回來。你的最終目標是可能減少的總量時間運行這些查詢,但是,出於演示目的,我們定義我們成本函數隨著總記錄數的掃描。這個指標應該是一個好的近似的總運行時和定義良好和確定性的好處,讓有興趣的讀者很容易和可靠地重現我們的實驗。我們去,我們會一起工作,具體:
情況下類ConnRecord(src_ip:字符串,src_port: Int, dst_ip:字符串,dst_port: Int)defrandomIPv4(接待員:隨機)=Seq。填滿(4)(r.nextInt (256年))。mkString(“。”)defrandomPort(接待員:隨機)=r。nextInt(65536年)defrandomConnRecord(接待員:隨機)=ConnRecord(src_ip = randomIPv4 (r),src_port = randomPort (r),dst_ip = randomIPv4 (r),dst_port = randomPort (r))
情況下類TestResult(numFilesScanned:長,numRowsScanned:長,numRowsReturned:長)deftestFilter(表:字符串,過濾器:字符串):TestResult={val查詢=年代“SELECT COUNT (*)美元的表在哪裏美元的過濾器”瓦爾(結果、指標)= collectWithScanMetrics (sql(查詢)。作為(長))TestResult (numFilesScanned =指標(“filesNum”),numRowsScanned = metrics.get (“numOutputRows”).getOrElse (0L),numRowsReturned = result.head)}/ /運行testFilter()在所有給定的過濾器和返回的行百分比跳過/ /平均代替數據跳過有效性:0不好,1是好的def skippingEffectiveness(表:字符串過濾器:Seq [字符串):雙= {…}
100年的一個隨機生成的表文件,每個1 k隨機記錄,可能看起來像:
選擇row_number()在(訂單通過文件)作為file_id,數(*)作為numRecords,最小值(src_ip),馬克斯(src_ip),最小值(src_port),馬克斯(src_port),最小值(dst_ip),馬克斯(dst_ip),最小值(dst_port),馬克斯(dst_port)從(選擇input_file_name ()作為文件,*從conn_random)集團通過文件
看到每個文件的min-max範圍覆蓋幾乎整個域的值,很容易預測,將會有很少的機會文件跳過。我們的評估功能確認:
skippingEffectiveness (connRandom singleColumnFilters)
好了,這是意料之中的,我們的數據是隨機生成的,因此不存在相關性。讓我們試著在寫作之前明確排序數據。
spark.read.table (connRandom).repartitionByRange ($“src_ip”美元,“src_port”美元,“dst_ip”美元,“dst_port”)/ /或隻是.sort(美元)“src_ip”美元,“src_port”美元,“dst_ip”美元,“dst_port”).write。格式(“δ”).saveAsTable (connSorted)
skippingEffectiveness (connRandom singleColumnFilters)
嗯,我們確實改善指標,但25%的仍然不是很好。讓我們仔細看看:
val src_ip_eff = skippingEffectiveness (connSorted srcIPv4Filters)val src_port_eff = skippingEffectiveness (connSorted srcPortFilters)val dst_ip_eff = skippingEffectiveness (connSorted dstIPv4Filters)val dst_port_eff = skippingEffectiveness (connSorted dstPortFilters)
結果src_ip查找非常快,但其他所有人基本上是全表掃描。再說一次,這並不奇怪。如前所述,得到線性排序:結果數據集群完全沿著第一個維度(src_ip在我們的例子中),但幾乎沒有進一步的維度。
所以我們如何能做的更好嗎?通過執行ZORDER集群。
spark.read.table (connRandom).write.format (“δ”).saveAsTable (connZorder)sql(年代“優化connZorder美元ZORDER由(src_ip src_port、dst_ip dst_port)”)
skippingEffectiveness (connZorder singleColumnFilters)
不少比0.25得到的線性排序,對吧?另外,分解:
val src_ip_eff = skippingEffectiveness (connZorder srcIPv4Filters)val src_port_eff = skippingEffectiveness (connZorder srcPortFilters)val dst_ip_eff = skippingEffectiveness (connZorder dstIPv4Filters)val dst_port_eff = skippingEffectiveness (connZorder dstPortFilters)
幾個值得注意的觀察:
預計跳過有效性在src_ip現在低於線性排序,因為後者將確保完美的集群,與z值。然而,其他列的分數現在幾乎一樣好,不像之前的時候0。
也期望z值的列越多,效率越低。
例如,由(ZORDER src_ip dst_ip)
達到0.82。這是由你來決定你最關心什麼過濾器。
在實際用例提出火花+人工智能峰會上,一個典型的跳過有效性在src_ip y = x和dst_ip =
查詢甚至更高。的數據集504字節(超過11萬億行),隻有36.5 tb需要掃描數據由於跳過。這是一個顯著的減少92.4%的字節數和93.2%的行數。
結論
使用磚跳過和三角洲的內置數據ZORDER
聚類特性,大雲數據湖泊可以查詢在幾秒鍾內通過跳過文件與查詢無關的。在真實的網絡安全分析用例,93.2%的記錄504字節數據集被跳過一個典型的查詢,查詢時間減少到兩個數量級。
換句話說,磚三角洲可以加快查詢的100 x。
請注意:數據跳過已作為一個獨立選項以外的磚δ在過去作為一個單獨的預覽。該選項將在不久的將來被棄用。我們強烈推薦你搬磚三角洲利用數據跳躍能力。
閱讀更多
這裏有一些資產: