最佳實踐:使用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
包含一個包含65,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
Table包含以下字段:
|--c_customer_sk:整數(可以為空=真正的)|--c_customer_id:字符串(可以為空=真正的)
的關鍵c_customer_id
標識要刪除的客戶。beplay体育app下载地址
步驟1:將表轉換為Delta格式
要開始使用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 - ordered創建了一種基於範圍分區的數據排列,並將該信息索引到Delta表中。Delta Lake使用這個z-索引查找受刪除
操作。
要利用z - ordered,必須了解要刪除的數據是如何在目標表中分布的。例如,如果數據(即使隻有幾個鍵)分布在數據集的90%的文件中,那麼您將重寫90%以上的數據。按相關鍵列的z - order減少了接觸的文件數量,可以使重寫更有效。
在這種情況下,你應該根據c_customer_id
執行delete命令前的列:
優化gdpr.beplay体育app下载地址Z-訂單通過c_customer_id
在z - ordered之後,尋找文件需要7秒,而寫入則需要50秒。
步驟3:清理陳舊的數據
根據用戶請求刪除數據和底層數據湖的時間長短,可能需要刪除表曆史記錄和底層原始數據。
默認情況下,Delta Lake將保留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_pseudoonym: string (nullable = true) |——c_first_name: string (nullable = true) |——c_last_name: string (nullable = true)
在此場景中,將不能用於識別客戶的剩餘客戶數據放在名為gdpr.beplay体育app下载地址customers_pseudo
:
|——c_email_address_pseudoonym: string (nullable = true) |——c_current_cdemo_sk: integer (nullable = true) |——c_current_hdemo_sk: integer (nullable = true) |——c_current_addr_sk: integer (nullable = true) |——c_first_shipto_date_sk: integer (nullable = true) |——c_first_sales_date_sk: integer (nullable = true) |——c_preferred_cust_flag: string (nullable = true) |——c_birth_year:整數(nullable = true) |——c_birth_country: string (nullable = true) |——c_last_review_date: string (nullable = true)
用三角洲湖來化名客戶數據
對個人信息進行匿名化的一種有效方法是單向加密哈希和用記憶中的一種或多種鹽進行鹽化。哈希將數據轉換為固定長度的指紋,無法進行計算反轉。Salting在數據中添加一個隨機字符串,這些字符串將被哈希,作為一種挫敗攻擊者的方法,攻擊者使用查找或“彩虹”表,這些表包含數百萬個已知電子郵件地址或密碼的哈希。
你可以給柱子加鹽c_email_address
通過在哈希之前添加一個隨機的秘密字符串字麵量。可以使用Databricks的秘密存儲這個秘密字符串,為您的鹽添加額外的安全性。如果未經授權的Databricks用戶試圖訪問這個秘密,他們將看到經過編輯的值。
dbutils.秘密.得到(範圍=“鹽”,關鍵=“useremail”)
res0: String = [REDACTED]
請注意
這是一個演示醃製的簡單例子。對所有客戶密鑰使用相同的salt並不是減少攻擊的好方法;它隻是使客戶密鑰更長。更安全的方法是為每個用戶生成一個隨機鹽。看到讓你的化名更強大.
一旦你在柱子上撒鹽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)
現在可以對所有客戶鍵表使用此值。
讓你的化名更強大
為了減少單一鹽對數據庫可能造成的風險,建議在實際情況下使用不同的鹽(每個客戶一個,甚至每個用戶一個)。如果附加到假名標識符的數據本身不包含任何可以識別個人的信息,如果您刪除了哪一種鹽與哪一種用戶相關的記錄並且不能重新創建它,則應完全呈現剩餘的數據匿名因此不屬於GDPR和CCPA的範圍。許多組織選擇為每個用戶創建多個鹽,並根據業務需要定期輪換這些鹽,從而創建數據保護法範圍之外的完全匿名數據。
不要忘記,數據是“個人的”還是“可識別的”並不是元素級別的分析,而是數組級別的分析。因此,雖然像電子郵件地址這樣明顯的東西顯然是私人的,但那些本身不私人的東西的組合也可能是私人的。看到的,例如https://aboutmyinfo.org/identity/about:根據1990年美國人口普查的分析,87%的美國人口是由郵政編碼、出生日期和性別這三個屬性唯一識別的。因此,當您決定將哪些內容存儲為個人標識符表的一部分或僅包含假名信息的工作表的一部分時,一定要考慮表麵上不可識別的信息的衝突本身是否可能是可識別的。確保您自己的隱私遵從性,您有內部流程,防止試圖用您打算不可識別的信息重新識別個人(例如差異隱私、隱私保護直方圖等)。雖然可能永遠不可能完全阻止重新識別,但遵循這些步驟將對幫助有很大幫助。
提高查詢性能
步驟2:執行刪除展示了如何通過增加廣播閾值和z - ordered來提高Delta Lake查詢性能,還有一些您應該了解的其他性能改進實踐:
確保鍵列位於表的前32列內。Delta Lake收集前32列的統計信息,這些統計信息有助於識別要刪除或更新的文件。
使用Databricks上的Delta Lake提供的自動優化特性,該特性在對Delta表進行單個寫入時自動壓縮小文件,並為主動查詢的表提供顯著的好處,特別是在Delta Lake可能遇到多個小文件的情況下。看到自動優化Databricks關於何時使用它的指導。
減少源表的大小(對於
BroadcastHashJoin
).這有助於Delta Lake發揮杠杆作用動態文件修剪當確定要刪除的相關數據時。如果刪除操作不在分區邊界上,這將特別有幫助。對於任何修改操作,例如
刪除
,盡可能具體,在搜索條款中提供你的所有合格條件。這將減少您所訪問的文件數量,並防止事務衝突。持續調優Spark shuffle、集群利用率和存儲係統最優寫。