【问题标题】:How to append more than 33 files in a gcloud bucket?如何在 gcloud 存储桶中附加超过 33 个文件?
【发布时间】:2021-06-03 13:00:45
【问题描述】:

我使用以下方法将数据集附加到 gcloud 中的存储桶中:

gsutil compose gs://bucket/obj1 [gs://bucket/obj2 ...] gs://bucket/composite

但是,今天当我尝试附加一些数据时,终端会打印错误CommandException: The compose command accepts at most 33 arguments.

我不知道这个限制。如何在我的存储桶中附加超过 33 个文件?还有其他命令行工具吗?我想避免为看似相当简单的任务创建虚拟机。

我使用gsutil help compose 查看了帮助。但这并没有太大帮助。只有一条警告说“请注意,可以使用的组件数量有限制(当前为 32) 由单个操作组成。”但没有提示解决方法。

【问题讨论】:

    标签: gcloud gsutil


    【解决方案1】:

    你不能递归地做|批处理吗?

    我没试过。

    给定任意文件列表 (FILES)

    虽然FILES中有多个文件:

    1. FILESgsutil compose 中的第一个n 其中n
    2. 如果成功,请将 FILES 中的 n 个名称替换为 1 个临时文件。
    3. 重复

    剩下的文件就是所有组成的。

    更新

    这个问题激起了我的好奇心,让我有机会改进我的 bash ;-)

    一个粗略的概念验证 bash 脚本,可为任意数量的文件(受字符串格式 %04 限制)生成成批的 gsutil compose 命令。

    GSUTIL="gsutil compose"
    BATCH_SIZE="32"
    
    # These may be the same (or no) bucket
    SRC="gs://bucket01/"
    DST="gs://bucket02/"
    
    # Generate test LST
    FILES=()
    for N in $(seq -f "%04g" 1 100); do
        FILES+=("${SRC}/file-${N}")
    done
    
    function squish() {
      LST=("$@")
      LEN=${#LST[@]}
    
      if [ "${LEN}" -le "1" ]; then
        # Empty array; nothing to do
        return 1
      fi
    
      # Only unique for this configuration; be careful
      COMPOSITE=$(printf "${DST}/composite-%04d" ${LEN})
    
      if [ "${LEN}" -le "${BATCH_SIZE}" ]; then
        # Batch can be composed with one command
        echo "${GSUTIL} ${LST[@]} ${COMPOSITE}"
        return 1
      fi
    
      # Compose 1st batch of files
      # NB Provide start:size
      echo "${GSUTIL} ${LST[@]:0:${BATCH_SIZE}} ${COMPOSITE}"
    
      # Remove batch from LST
      # NB Provide start (to end is implied)
      REM=${LST[@]:${BATCH_SIZE}}
    
      # Prepend composite from above batch to the next run
      NXT=(${COMPOSITE} ${REM[@]})
    
      squish "${NXT[@]}"
    }
    
    squish "${FILES[@]}"
    

    使用BATCH_SIZE=3 运行,没有存储桶和 12 个文件产生:

    gsutil compose file-0001 file-0002 file-0003 composite-0012
    gsutil compose composite-0012 file-0004 file-0005 composite-0010
    gsutil compose composite-0010 file-0006 file-0007 composite-0008
    gsutil compose composite-0008 file-0008 file-0009 composite-0006
    gsutil compose composite-0006 file-0010 file-0011 composite-0004
    gsutil compose composite-0004 file-0012 composite-0002
    

    注意composite-0012 是如何由第一个命令创建的,然后再结合到后续命令中。

    我将留给您通过不将每个步骤的输出线程化到下一个步骤来提高吞吐量,将列表中的 gsutil compose 命令并行化并分成批次然后组合成批次。

    【讨论】:

    • 感谢您的回答。我使用问题中提供的代码(下面链接)使用 Linux shell 在本地附加文件。但是,您的答案可能对 Windows 用户有用。问题链接:stackoverflow.com/questions/16890582/…
    • 您将文件描述为已经在 GCS 上,在这种情况下,在 GCS 上组合文件(服务端)效率更高。
    • 很好,@DazWilkin。我已经修改了函数here。我的不同之处在于:1)使用最后一个原始参数作为最终的复合文件; 2) 返回退出代码 0。我将其用作将任意 BigQuery 表导出到单个 CSV 以进行迁移的脚本的一部分。
    【解决方案2】:

    文档说你只能组合 32 个组件 in a single operation,但有 no limit to the number of components that can make up a composite object

    因此,如果要连接的对象超过 32 个,则可以执行多个组合操作,一次组合 32 个对象,直到最终将所有对象组合在一起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-03
      • 2020-12-04
      • 2019-09-22
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      相关资源
      最近更新 更多