Spark Parquet分片規則

2021-08-09 20:27:32 字數 1048 閱讀 8967

之前提到parquet.block.size所控制的parquet row group大小是乙個需要調優的spark引數。其中重要一點,就是控制任務的併發度。

在hadoop裡,任務的併發預設是以hdfs block為單位的,而spark裡多了一種選擇,即以rowgroup為基本單位。

在呼叫hivecontext.read.parquet(path)時,會觸發parquetrelation2物件生成sqlnewhadooprdd物件,並覆蓋其中getpartitions()方法。

// overridden so we can inject our own cached files statuses.

override def

getpartitions: array[sparkpartition] =

} else

val jobcontext = newjobcontext(getconf(isdriverside = true), jobid)

val rawsplits = inputformat.getsplits(jobcontext)

array.tabulate[sparkpartition](rawsplits.size)

}

在預設配置時,是以hdfsblock為單位,進行task排程的。但可以通過設定parquet.task.side.metadata=false,是以rowgroup為單位排程(當group太小時,會合併,保證滿足minsize)。但即使採用task sidemeta,預設情況下,這時也讀取了footers資訊,而這是不必要的。但這時會產生乙個問題,當預設情況下,乙個rowgroup橫跨多個splits時怎麼辦,即可能有多個executor都收到了rowgroup的處理請求,並分別邏輯持有一部分block資料。

當每個executor收到task對應的split資訊是,讀取所在檔案的footer meta,拿到所有的rowgroups。用split指定的blocks range,去圈定應該自己處理的rowgroups,包括兩種:

python分片處理 python分片

進行分片的時候,分片的開始和結束點需要進行指定 不管是直接還是間接 而另外乙個引數 在python 2.3 加入到內建型別 步長 step length 通常都是隱式設定的。在普通的分片中,步長是1 分片操作就是按照這個步長逐個遍歷序列的元素,然後返回開始和結束點之間的所有元素。numbers 0 ...

資料分片(6 強制分片路由)

實現動機 實現機制 實現動機 通過解析 sql 語句提取分片鍵列與值並進行分片是 apache shardingsphere 對 sql 零侵入的實現方式。若 sql 語句中沒有分片條件,則無法進行分片,需要全路由。在一些應用場景中,分片條件並不存在於 sql,而存在於外部業務邏輯。因此需要提供一種...

httpclient 分片上傳檔案 檔案分片上傳

在業務場景中檔案上傳很普遍,而大檔案的上傳經常會導致上傳時長過久,大量占用頻寬資源,而分片上傳就解決了目前的問題。import react from react import from utils upload import concurrentutil from utils concurrent ...