最佳實踐:使用Delta Lake遵守GDPR和CCPA
本文介紹如何在Databricks上使用Delta Lake來管理通用數據保護法規(GDPR)和加州消費者隱私法案(CCPA)對您的數據湖的遵從性。由於Delta Lake添加了一個事務層,該層在數據湖之上提供結構化數據管理,因此它可以大大簡化和加快您在響應消費者GDPR或CCPA請求時定位和刪除個人信息(也稱為“個人數據”)的能力。
所麵臨的挑戰
您的組織可能在雲中管理數百tb的個人信息。使這些數據集符合GDPR和CCPA規定是至關重要的,但這可能是一個很大的挑戰,特別是對於存儲在數據湖中的大型數據集。
挑戰通常來自以下因素:
當您在雲中有大量(拍字節規模)的數據時,用戶數據可以存儲並分布在多個數據集和位置。
為特定用戶查找數據的點查詢或特別查詢的成本很高(類似於大海撈針),因為它通常需要全表掃描。采用強製方法遵從GDPR/CCPA會導致多個作業在不同的表上操作,導致數周的工程和操作工作。
數據湖本身是隻追加的,不支持執行行級別的“刪除”或“更新”操作,這意味著必須重寫數據分區。典型的數據湖產品不提供ACID事務處理功能或查找相關數據的有效方法。此外,讀寫一致性也是一個問題:當從數據湖中對用戶數據進行編校時,讀取數據的過程應該受到保護,以免受到傳統RDBMS的實質性影響。
數據湖的數據衛生是具有挑戰性的,因為數據湖通過設計支持可用性和最終一致性的分區容忍度。需要強製和嚴格的實踐和標準來確保清理的數據。
因此,在這種規模上管理用戶數據的組織常常需要編寫計算困難、昂貴和耗時的數據管道來處理GDPR和CCPA。例如,您可以將數據湖的一部分上傳到專有的數據倉庫技術中,在這些技術中執行與GDPR和CCPA遵從性相關的刪除活動。這增加了複雜性,並降低了數據保真度,因為需要對數據進行多個拷貝。此外,將數據從這種倉庫技術導出回數據湖可能需要重新優化以提高查詢性能。這也會導致創建和維護多個數據副本。
三角洲湖如何應對這一挑戰
為了解決上麵列出的問題,使數據湖符合GDPR和ccpa的最佳方法需要:
”Pseudonymization或個人信息元素的可逆標記化(
標識符
)到鑰匙(假名
),不能被外部識別。以假名而不是標識符的方式存儲信息;
維護對標識符和假名組合的嚴格訪問和使用策略;
管道或桶策略,以刪除時間線上的原始數據,幫助您遵守適用的法律;
構造管道來定位和刪除標識符,以破壞假名和標識符之間的鏈接
ACID功能覆蓋在數據湖之上,防止在數據湖上進行刪除或更新操作時對讀者造成負麵影響。
高性能流水線,支持10分鍾內清理5TB數據等。
Delta Lake是解決這些GDPR和CCPA遵從性需求的非常有效的工具,因為它的結構化數據管理係統向數據湖添加了事務處理功能。Delta Lake組織良好、大小合理、索引良好、支持統計的數據集支持使用標準SQL DML語句快速、輕鬆地搜索、修改和清理數據,例如刪除
,更新
,合並成
.
以下部分描述的兩個用例演示了如何將現有數據轉換為Delta Lake,以及如何快速有效地刪除和清理個人信息。本文還提供了一些用於匿名化個人信息和提高Delta Lake查詢性能的選項。
刪除個人資料
這個用例演示了Delta Lake在從數據湖中刪除個人數據時的效率。
樣本數據集
本文中描述的工作流引用了一個數據庫gdpr
包含一個示例數據集,包含6,5,000,000行和許多不同的客戶id,總計3.228 GB數據。中捕獲了客戶個人信息beplay体育app下载地址
此數據庫中的表。
的基模gdpr.beplay体育app下载地址customers
表:
|--c_customer_sk:整數(可以為空=真正的)|--c_customer_id:字符串(可以為空=真正的)|--c_current_cdemo_sk:整數(可以為空=真正的)|--c_current_hdemo_sk:整數(可以為空=真正的)|--c_current_addr_sk:整數(可以為空=真正的)|--c_first_shipto_date_sk:整數(可以為空=真正的)|--c_first_sales_date_sk:整數(可以為空=真正的)|--c_salutation:字符串(可以為空=真正的)|--c_first_name:字符串(可以為空=真正的)|--c_last_name:字符串(可以為空=真正的)|--c_preferred_cust_flag:字符串(可以為空=真正的)|--c_birth_day:整數(可以為空=真正的)|--c_birth_month:整數(可以為空=真正的)|--c_birth_year:整數(可以為空=真正的)|--c_birth_country:字符串(可以為空=真正的)|--c_email_address:字符串(可以為空=真正的)|--c_last_review_date:字符串(可以為空=真正的)
根據GDPR和CCPA要beplay体育app下载地址求被遺忘的客戶列表來自一個事務性數據庫表,gdpr.customer_delete_keys
,它使用在線門戶填充。要刪除的密鑰(不同的用戶)大約代表從原始數據集中采樣的原始密鑰的10% (337.615 MB)gdpr.beplay体育app下载地址customers
.
的基模gdpr.customer_delete_keys
表中包含如下字段:
|--c_customer_sk:整數(可以為空=真正的)|--c_customer_id:字符串(可以為空=真正的)
的關鍵c_customer_id
標識要刪除的客戶。beplay体育app下载地址
步驟1:將表轉換為增量格式
要開始使用Delta Lake,需要吸收原始數據(Parquet、CSV、JSON等),並將其作為托管Delta表寫出來。如果數據已經是Parquet格式,則可以使用轉換來δ
將Parquet文件就地轉換為Delta表,而無需重寫任何數據。如果沒有,您可以使用您熟悉的Apache Spark api將格式改寫為Delta.因為Delta Lake使用的是Parquet,這是一種打開的文件格式,所以轉換後的數據不會被鎖定:如果需要,您可以快速、輕鬆地將數據轉換回另一種格式。
這個例子轉換Parquet表beplay体育app下载地址
在gdpr
數據庫。
轉換來δgdpr.beplay体育app下载地址
步驟2:執行刪除
將您的表格轉換為Delta Lake後,您可以刪除請求遺忘的用戶的個人信息。
請注意
下麵的示例直接刪除客戶個人數據beplay体育app下载地址
表格一個更好的實踐是在工作表中匿名化所有客戶個人信息(在接收數據主題請求之前),並從將客戶映射到假名的“查找表”中刪除客戶條目,同時確保工作表中的數據不能用於重構客戶身份。有關詳細信息,請參見Pseudonymize數據.
請注意
下麵的例子引用性能數據來說明某些性能選項的影響。這些數字記錄在上麵描述的數據集上,在一個有3個工作節點的集群上,每個節點有90gb內存和12個核心;驅動程序有30GB內存和4核。
這是一個簡單的三角洲湖刪除從
操作,刪除包含在beplay体育app下载地址customer_delete_keys
示例中的表gdpr.beplay体育app下载地址customers
表:
刪除從`gdpr.beplay体育app下载地址`作為t1在哪裏存在(選擇c_customer_id從gdpr.customer_delete_keys在哪裏t1.c_customer_id=c_customer_id)
在測試過程中,該操作耗時較長:查找文件耗時32秒,重寫文件耗時2.6分鍾。為了減少查找相關文件的時間,可以提高廣播閾值:
集火花.sql.autoBroadcastJoinThreshold=104857600;
這個廣播提示指示Spark在與其他表或視圖連接時廣播每個指定的表。該設置將文件查找時間降至8秒,寫入時間降至1.6分鍾。
您還可以使用Delta Lake進一步提高性能z值(多維聚簇).z - order創建了一個基於範圍分區的數據安排,並在Delta表中為該信息建立索引。Delta Lake使用這個z-index來查找受刪除
操作。
為了利用z - order,您必須了解您希望刪除的數據是如何在目標表中分布的。例如,如果數據(即使是幾個鍵)分布在數據集的90%的文件中,那麼您將重寫超過90%的數據。按相關鍵列進行z排序可以減少所接觸的文件數量,並使重寫變得更有效。
在這種情況下,你應該按c_customer_id
執行delete前的列:
優化gdpr.beplay体育app下载地址Z-訂單通過c_customer_id
在z排序後,查找文件花了7秒,寫入時間降到了50秒。
步驟3:清理陳舊數據
根據用戶請求刪除數據後的時間長短,在底層數據湖上,可能需要刪除表曆史和底層原始數據。
默認情況下,Delta Lake保留30天的表曆史記錄,並使其在30天內可用“時間旅行”和回滾。這意味著,即使從Delta表中刪除了個人信息,組織中的用戶仍然可以查看曆史數據,並回滾到個人信息仍然存儲在其中的表版本。如果您確定GDPR或CCPA遵從性要求在默認保留期結束之前使這些陳舊記錄不可用,那麼您可以使用真空函數可以刪除不再被Delta表引用且超過指定保留閾值的文件。一旦使用VACUUM命令刪除了表的曆史記錄,所有用戶就失去了查看曆史和回滾的能力。
要刪除所有要求刪除其信息的客beplay体育app下载地址戶,然後刪除所有超過7天的表曆史,隻需運行:
真空gdpr.beplay体育app下载地址
要刪除少於7天的工件,請使用保留全國礦工工會小時
選擇:
真空gdpr.beplay体育app下载地址保留One hundred.小時
另外,如果您使用Spark api來創建Delta表將非parquet文件重寫為Delta(與將Parquet文件就地轉換為Delta Lake不同),您的原始數據可能仍然包含您已刪除或匿名化的個人信息。Databricks建議你與雲提供商建立一個30天或更短時間的保留策略,自動刪除原始數據。
Pseudonymize數據
雖然上麵描述的刪除方法可以嚴格地允許您的組織遵守GDPR和CCPA的要求來執行個人信息的刪除,但它也有一些缺點。首先,GDPR不允許在收到有效的刪除請求後對個人信息進行任何額外處理。因此,如果數據沒有存儲在pseudonymized時尚——也就是說,用人工標識符或假名替換個人身份信息——在收到數據主體請求之前,您有義務簡單地刪除所有鏈接信息。但是,如果您以前已經對底層數據進行了假名化,那麼您的刪除義務可以通過簡單地銷毀任何連接標識符和假名的記錄來滿足(假設剩餘的數據本身不能識別),並且您可以保留剩餘的數據。
在典型的匿名化場景中,您保留一個安全的“查找表”,它將客戶的個人標識符(姓名、電子郵件地址等)映射到假名。這樣做的好處不僅是使刪除更容易,而且還允許您臨時“恢複”用戶身份,以便隨著時間的推移更新用戶數據,這一優點在一個應用程序中是無法實現的匿名化場景,根據定義,客戶的身份永遠無法恢複,所有客戶數據根據定義是靜態的和曆史的。
對於一個簡單的假名化示例,考慮在刪除示例中更新的customer表。在匿名化場景中,可以創建gdpr.beplay体育app下载地址customers_lookup
表,包含可用於標識客戶的所有客戶數據,附加一列用於匿名電子郵件地址。現在,您可以在引用客戶的任何數據表中使用偽電子郵件地址作為鍵,當出現忘記該信息的請求時,隻需從beplay体育app下载地址gdpr.beplay体育app下载地址customers_lookup
表和其他信息可以永遠保持不可識別。
的基模gdpr.beplay体育app下载地址customers_lookup
表:
|——c_customer_id: string (nullable = true) |——c_email_address: string (nullable = true) |——c_email_address_pseudonym: string (nullable = true) |——c_first_name: string (nullable = true) |——c_last_name: string (nullable = true)
![客戶查找表](http://www.eheci.com/docs/docs/_images/gdpr-lookup.png)
在此場景中,將無法用於標識客戶的剩餘客戶數據放入名為gdpr.beplay体育app下载地址customers_pseudo
:
|——c_email_address_pseudonym: string (nullable = true) |——c_customer_sk: integer (nullable = true) |——c_current_cdemo_sk: integer (nullable = true) |——c_current_hdemo_sk: integer (nullable = true) |——c_first_shipto_date_sk: integer (nullable = true) |——c_first_sales_date_sk: integer (nullable = true) |——c_salutation: string (nullable = true) |——c_preferred_cust_flag: string (nullable = true) |——c_birth_year:|——c_last_review_date: string (nullable = true)
![客戶pseudonymized表](http://www.eheci.com/docs/docs/_images/gdpr-pseudo.png)
使用Delta Lake匿名化客戶數據
匿名化個人信息的一種強方法是單向密碼哈希和用一種或多種記憶的鹽鹽加鹽。哈希將數據轉換成固定長度的指紋,無法通過計算逆轉。Salting會在數據中添加一個隨機字符串,以阻止攻擊者使用查找或“彩虹”表,這些表包含數百萬個已知電子郵件地址或密碼的哈希值。
你可以在柱子上加鹽c_email_address
通過在哈希之前添加一個隨機的秘密字符串字麵值。這個秘密字符串可以使用Databricks機密存儲,以增加額外的安全性。如果未經授權的Databricks用戶試圖訪問這個秘密,他們將看到修訂後的值。
dbutils.秘密.得到(範圍=“鹽”,關鍵=“useremail”)
res0: String = [REDACTED]
請注意
這是一個簡單的例子來說明醃製。對所有客戶密鑰使用相同的鹽並不是減少攻擊的好方法;這隻會讓客戶的鑰匙變長。更安全的方法是為每個用戶生成隨機的鹽。看到讓你的假名化更強.
一旦你在柱子上加鹽c_email_address
,你可以哈希它,並添加哈希到gdpr.beplay体育app下载地址customers_lookup
表c_email_address_pseudonym
:
更新gdpr.beplay体育app下载地址customers_lookup集c_email_address_pseudonym=sha2(c_email_address,256)
現在可以將此值用於所有客戶鍵控表。
讓你的假名化更強
為了減少單一鹽對數據庫造成的風險,建議在實際情況下使用不同的鹽(每個客戶一種,甚至每個用戶一種)。如果附加到假名標識符的數據本身不包含任何可以識別個人的信息,那麼如果您刪除了關於哪個salt與哪個用戶相關的記錄,並且無法重新創建它,那麼應該完全呈現剩餘的數據匿名因此不屬於GDPR和CCPA的範圍。許多組織選擇為每個用戶創建多個鹽,並根據業務需要定期輪換這些鹽,從而在數據保護法範圍之外創建完全匿名的數據。
不要忘記,數據是“個人的”還是“可識別的”不是元素級的分析,而本質上是數組級的分析。因此,雖然像電子郵件地址這樣顯而易見的東西顯然是私人的,但一些本身不私人的東西的組合也可能是私人的。看到的,例如https://aboutmyinfo.org/identity/about:根據1990年美國人口普查的分析,87%的美國人口可以通過郵政編碼、出生日期和性別這三個屬性來唯一識別。因此,當您決定哪些內容應該作為個人標識符表的一部分存儲,或者隻存儲匿名信息的工作表的一部分存儲時,一定要考慮似乎無法識別的信息的衝突本身是否可以識別。確保您自己的隱私合規,您有內部流程,以防止試圖用您打算不可識別的信息重新識別個人(例如差異隱私、保護隱私的直方圖等)。雖然可能永遠不可能完全防止再次識別,但遵循這些步驟將會大有幫助。
提高查詢性能
步驟2:執行刪除展示了如何通過增加廣播閾值和z - order來提高Delta Lake查詢性能,還有一些額外的性能改進實踐,你也應該知道:
確保鍵列位於表的前32列內。Delta Lake收集前32列的統計信息,這些統計信息有助於識別要刪除或更新的文件。
使用Databricks上的Delta Lake提供的Auto Optimize特性,該特性可以在對Delta表進行單獨寫操作時自動壓縮小文件,並為主動查詢的表提供顯著優勢,特別是在Delta Lake可能遇到多個小文件的情況下。看到自動優化用於指導何時使用。
減少源表的大小(對於
BroadcastHashJoin
).這有助於三角洲湖發揮杠杆作用動態文件修剪確定要刪除的相關數據時。如果刪除操作不在分區邊界上,這將非常有用。對於任何修改操作,例如
刪除
,盡可能具體,在搜索條款中提供所有的條件。這樣可以減少命中的文件數量,並防止事務衝突。持續調優Spark shuffle、集群利用率和存儲係統的寫入優化。