簡體   English   中英

Spark Streaming to Hive,每個分區的小文件太多

[英]Spark Streaming to Hive, too many small files per partition

我有一個批處理間隔為 2 分鍾(可配置)的火花流作業。
此作業從 Kafka 主題讀取並創建數據集並在其上應用架構並將這些記錄插入到 Hive 表中。

Spark 作業在 Hive 分區中的每個批處理間隔創建一個文件,如下所示:

dataset.coalesce(1).write().mode(SaveMode.Append).insertInto(targetEntityName);

現在傳入的數據不是那么大,如果我將批處理持續時間增加到 10 分鍾左右,那么即使我最終也可能只得到 2-3mb 的數據,這遠小於塊大小。

這是 Spark Streaming 中的預期行為。
我正在尋找有效的方法來進行后期處理以合並所有這些小文件並創建一個大文件。
如果有人以前做過,請分享您的想法。

我鼓勵您不要使用 Spark 將數據從 Kafka 流式傳輸到 HDFS。

Confluent 的Kafka Connect HDFS插件(或 LinkedIn 的 Apache Gobblin)就是為了這個目的而存在的。 兩者都提供 Hive 集成。

這個 Github 問題中找到我關於壓縮小文件的評論

如果您需要編寫 Spark 代碼來將 Kafka 數據處理成模式,那么您仍然可以這樣做,並以(最好)Avro 格式寫入另一個主題,Hive 可以在沒有預定義表模式的情況下輕松讀取

我個人編寫了一個“壓縮”過程,它實際上從 Hive 表中抓取了一堆每小時 Avro 數據分區,然后轉換為每日 Parquet 分區表以進行分析。 到目前為止,它一直工作得很好。

如果您想在記錄到達 HDFS 之前對其進行批處理,那么 Kafka Connect 或 Apache Nifi(在鏈接中提到)可以提供幫助,因為您有足夠的內存來存儲記錄,然后再將它們刷新到 HDFS

我和你的情況完全一樣。 我通過以下方式解決了它:

假設您的新數據存儲在數據集中:dataset1

1- 用一個好的分區鍵對表進行分區,就我而言,我發現我可以使用鍵組合進行分區,每個分區大約有 100MB。

2- 使用 spark core 保存而不使用 spark sql:

a- 當您想保存時,將整個分區加載到您的內存中(在數據集內:dataset2)

b- 然后應用數據集聯合函數: dataset3 = dataset1.union(dataset2)

c- 確保按照您的意願對結果數據集進行分區,例如: dataset3.repartition(1)

d - 以“覆蓋”模式保存結果數據集以替換現有文件

如果您需要有關任何步驟的更多詳細信息,請聯系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM