【问题标题】:Uploading files to s3 using s3cmd in parallel并行使用 s3cmd 将文件上传到 s3
【发布时间】:2014-11-14 16:26:19
【问题描述】:

我在服务器上有一大堆文件,我想将这些文件上传到 S3。这些文件以 .data 扩展名存储,但实际上它们只是一堆 jpeg、png、zip 或 pdf。

我已经编写了一个简短的脚本,它可以找到 mime 类型并将它们上传到 S3 上,它可以工作,但速度很慢。有什么方法可以使用 gnu 并行运行以下内容?

#!/bin/bash

for n in $(find -name "*.data") 
do 
        data=".data" 
        extension=`file $n | cut -d ' ' -f2 | awk '{print tolower($0)}'` 
        mimetype=`file --mime-type $n | cut -d ' ' -f2`
        fullpath=`readlink -f $n`

        changed="${fullpath/.data/.$extension}"

        filePathWithExtensionChanged=${changed#*internal_data}

        s3upload="s3cmd put -m $mimetype --acl-public $fullpath s3://tff-xenforo-data"$filePathWithExtensionChanged     

        response=`$s3upload`
        echo $response 

done 

此外,我相信这段代码总体上可以得到很大的改进 :) 非常感谢您提供反馈提示。

【问题讨论】:

  • 可以使用 Python 和 boto 并行上传
  • Nod 我本可以用 go 或其他语言写一些东西,但我试图“全部用 bash”来做这件事.. 没有特别的原因。
  • Aye :) 我也读过,但我无法解决的是它的重要部分,这就是我如何创建要并行发送的文件列表。跨度>
  • 您不能将find -name "*.data" 重定向到一个文件并将该文件传递给并行吗? find -name "*.data" > mydata.txtparallel -j5 "doit {}" < mydatatxt

标签: bash amazon-s3 parallel-processing s3cmd gnu-parallel


【解决方案1】:

您显然擅长编写 shell,并且非常接近解决方案:

s3upload_single() {
    n=$1
    data=".data" 
    extension=`file $n | cut -d ' ' -f2 | awk '{print tolower($0)}'` 
    mimetype=`file --mime-type $n | cut -d ' ' -f2`
    fullpath=`readlink -f $n`

    changed="${fullpath/.data/.$extension}"

    filePathWithExtensionChanged=${changed#*internal_data}

    s3upload="s3cmd put -m $mimetype --acl-public $fullpath s3://tff-xenforo-data"$filePathWithExtensionChanged     

    response=`$s3upload`
    echo $response 
}
export -f s3upload_single
find -name "*.data" | parallel s3upload_single

【讨论】:

  • 太棒了,谢谢!如果我没看错,这会运行find - name "*.data" 返回的所有文件,并并行运行每个文件吗?如果是这样,那真的很酷,但我假设如果 find -name "*.data" 返回说 uhh 80k 文件,它会崩溃
  • 几乎:parallel 默认每个 cpu 核心一个进程。如果您想尽可能多地运行,请使用parallel -j0。这仍然不会并行运行 80k,但是当没有更多的文件句柄或进程剩余时停止生成更多。
  • 您也可以为此使用 xargs。只需将最后一行更改为find -name '*.data" | xargs -n 1 -P 10 s3upload_single。见此链接:xaprb.com/blog/2009/05/01/…
【解决方案2】:

您可以使用s3cmd-modified,它允许您并行放置/获取/同步多个工作人员

$ git clone https://github.com/pcorliss/s3cmd-modification.git $ cd s3cmd-modification $ python setup.py install $ s3cmd --parallel --workers=4 sync /source/path s3://target/path

【讨论】:

  • 截至上次提交时,该项目已有 9 年历史:/
【解决方案3】:

试试s3-cli: node-s3-client 的命令行实用程序前端。受到 s3cmd 的启发,并试图成为替代品。

转述https://erikzaadi.com/2015/04/27/s3cmd-is-dead-long-live-s3-cli/

这是对 s3cmd 的就地替换,用节点编写(耶!),它与现有的 s3cmd 配置完美配合,它(以及其他可怕的东西)并行上传到 S3,节省了大量时间。

-        system "s3cmd sync --delete-removed . s3://yourbucket.com/"
+        system "s3-cli sync --delete-removed . s3://yourbucket.com/"

【讨论】:

    【解决方案4】:

    使用 aws cli。支持文件并行上传,上传下载速度非常快。

    http://docs.aws.amazon.com/cli/latest/reference/s3/

    【讨论】:

    • 文档中没有出现“并行”一词。这怎么可能?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 2014-07-26
    • 2019-10-01
    • 2019-12-13
    • 2016-02-06
    • 2016-06-23
    相关资源
    最近更新 更多