azure ADLS v2并发附加

50few1ms  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(116)

Azure Datalake Storage v2 API path update操作提到:
不支持使用多个客户端并发写入同一文件。
下面虽然position参数描述如下:
此参数允许调用方并行上载数据,并控制将数据追加到文件的顺序。
这是否意味着append是并行工作的,但只使用单个客户端,比如从0长度的文件开始,使用10个线程将100个字节上传到位置0,100,200,...,这样范围就不会重叠?是否有实施这一点的例子?或者这一切只是文档中的不一致?

of1yzvn4

of1yzvn41#

我决定自己试试。

TOKEN=$(az account get-access-token --resource-type data-lake -o json | jq -r '.accessToken')
ADLS_FILE='https://xxxxx.dfs.core.windows.net/adls/foo.txt'
POSITION=0

# Create an empty file in my container "adls"
curl -X PUT "$ADLS_FILE?resource=file" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Length: 0"

# Loop on files (I created a few dummy files 100MB each to merge them)
for f in dummy1 dummy2 dummy3; do
  # Get file length
  LEN=$(stat --printf="%s" "$f")

  # Upload file at given position - in background
  curl -X PATCH "$ADLS_FILE?action=append&position=$POSITION" \
    -H "Authorization: Bearer $TOKEN" \
    -H "Content-Type: application/octet-stream" \
    -H "Content-Length: $LEN" \
    --data-binary @"$f" &

  # Calculate current position
  POSITION=$(( $POSITION + $LEN ))
done

# Wait for all uploads to complete
wait

# Flush - commit all what was written so far
curl -X PATCH "$ADLS_FILE?action=flush&position=$POSITION" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Length: 0"

上面的代码工作正常,上传可以并行完成,以任何顺序,只要块不重叠,没有“洞”。因此-是的,支持并发写入。

相关问题