S3P は、大規模な AWS S3 バケット上でコピー、リスト、同期、その他の一括操作を実行するための根本的に高速な方法を提供します。
これは、一般的な操作のためのコマンド ライン ツールとして使用することも、想像できるほぼあらゆるもののためのライブラリとして使用することもできます。
S3 の API は、アイテムをシリアルにリストすることを中心に構造化されています。つまり、1000 個のアイテムをリクエストし、待機してから次の 1000 個をリクエストします。これが、ほぼすべての S3 ツールの動作方法です。ただし、S3P は項目を並行してリストできます。これは、指定されたキー以降の最初の 1000 項目をリクエストする S3 の機能を利用します。次に、アルゴリズムの二分化といくつかのインテリジェントなヒューリスティックの助けを借りて、S3P は任意の程度の並列性でバケットの内容をスキャンできます。実際には、S3P は従来の方法よりも最大20 倍の速度でバケットをリストできます。
S3P は、実際には単なる派手で、非常に高速な S3 リスト ツールです。要約、コピー、同期はすべて、オブジェクトを大幅に高速にリストする S3P のコア機能によって強化されます。
S3P を実行する単一の EC2 インスタンスを使用して、同じリージョン内の 2 つのバケット間で最大8 ギガバイト/秒のコピー速度を維持しました。
S3P について詳しくは、Medium をご覧ください。
NodeJS
AWS-CLI
大きなファイルをコピーするには、 aws-cli
が必要です。デフォルトでは、100 MB を超えるファイルはaws-cli
でコピーされます。これはパフォーマンスの点で良い妥協点です。ただし、 --large-copy-threshold
オプションを使用すると、そのしきい値を 5 ギガバイトに変更できます。
なぜ?
aws-sdk
より複雑な解決策を使用しない限り、5 ギガバイトを超えるファイルの対処をサポートしていません。
キー名には制限された文字セットを使用する必要があります。
<space>
!"#$%&'()*+,-./
0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`
abcdefghijklmnopqrstuvwxyz{|}~
なぜ? Aws-S3 は降順でのキーのリストをサポートしていないため、S3P は文字範囲ベースの分割統治アルゴリズムを使用します。
s3p は aws-cli が使用するのと同じ認証情報を使用するため、ドキュメントを参照してください: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html
s3p を直接インストールする必要はありません。 NodeJS がインストールされている限り、 npx
使用して s3p を直接実行できます。
組み込みのヘルプには、すべてのコマンド、オプションの詳細が記載されており、多くの例が提供されています。
# list commands and get overall help
npx s3p help
--help
オプションを使用すると、各コマンドの詳細なヘルプと例が表示されます。
# get specific command help and example uses
npx s3p cp --help
s3p をローカルにインストールすると、より高速に実行できるようになります。
# install s3p on your current machine
npm install s3p -g
# now it runs from the local install:
npx s3p help
パフォーマンスに加えて、S3P はカスタム リスト、コピー、比較のための柔軟なオプションを提供します。
驚くべきことに、クラウドで S3P を実行しなくても、その利点の多くを確認できます。ローカルマシン上で実行でき、S3 のコピーは S3P を直接経由しないため、AWS の帯域幅を消費しません。
S3 バケットリストのパフォーマンスはほぼ達成可能20,000 1 秒あたり 50,000 アイテム (S3Pv3.5 時点)。
S3 バケット コピーのパフォーマンスは 1 秒あたり 8 ギガバイトを超える場合があります。
はい、1 秒あたり 9 ギガバイトが持続するのを確認しました。これは、平均ファイル サイズが 100 メガバイトよりわずかに大きいバケット上にありました。 S3P は単一の c5.2xlarge インスタンス上で実行されていました。比較すると、aws-s3-cp が 150mB/s を超えているのを見たことがありません。これは 53 倍以上高速です。
平均ファイル サイズは、s3p の全体的な 1 秒あたりのバイト数に大きな影響を与えます。
位置 | 指示 | aws-cli | s3p | 高速化 | 平均的なサイズ |
---|---|---|---|---|---|
地元 | ls | 2500アイテム/秒 | 50000アイテム/秒 | 20倍 | 該当なし |
地元 | CP | 30mB/秒 | 150mB/秒 | 5倍 | 512KB |
ec2 | CP | 150mB/秒 | 8GB/秒 | 54倍 | 100MB |
S3P は、数百万のアイテムと数百テラバイトを含むバケットで動作するように開発されました。現在、S3P はまだシングルコアの NodeJS アプリケーションにすぎません。ワーカーをフォークしたり、Elastic-Queue などを使用してインスタンス間で作業を分散したりすることで、さらに大規模な並列 S3 オペレーションを実行できる可能性があります。 aws-cli よりも 100 ~ 1000 倍高速なソリューションが必要な方がいらっしゃいましたら、お知らせください。ぜひ一緒に働きたいと思っています。
- [email protected]
すべてのドキュメントは CLI ヘルプ ページに埋め込まれています。使用:
# get a list of commands
npx s3p help
# get a list of options for a command
# example:
npx s3p cp --help
CLI のすべての機能は API としても利用できます。 API を学習するには、まず CLI オプションを学習し、次に特定の CLI コマンドの API 呼び出しを学習するには、コマンドラインで--api-example
オプションを使用してそのコマンドを実行します。これにより、そのコマンドをプログラムで呼び出すためのサンプル JavaScript コードが出力されます。
注: コマンドラインで
--api-example
使用すると、コマンドは実際には実行されません。 S3P は、CLI コマンドと同等の JavaScript をコンソールに出力するだけで終了します。
走る:
> npx s3p ls --bucket foo --quiet --api-example
出力:
require ( "s3p" ) . ls ( {
bucket : "foo" ,
quiet : true ,
} ) ;
// > Promise
試運転:
> node
ペースト:
require ( "s3p" )
. ls ( {
bucket : "foo" ,
quiet : true ,
} )
. then ( out => console . log ( out ) ) ;
出力:
[
'item1' ,
'item2' ,
'item3' ,
... 8463 more items
}
S3P は元々、GenUI.com が Resolution Bioscience, Inc. と共同で開発したものです。
GenUI は、シアトルに拠点を置くテクノロジー商用化ソフトウェア コンサルタント会社です。ソフトウェアのロードマップを加速します。お気軽に GenUI にご連絡いただき、あなたのプロジェクトについてお知らせください。ぜひご意見をお待ちしております。