ব্যাচের সবচেয়ে কার্যকর উপায় এস 3 ফাইলগুলি মুছুন


16

আমি এস 3-তে একসাথে হাজার হাজার বা কয়েক হাজার ফাইল মুছতে সক্ষম ব্যাচ সক্ষম করতে চাই। প্রতিটি ফাইল 1MB থেকে 50MB পর্যন্ত যে কোনও জায়গায় থাকবে। স্বাভাবিকভাবেই, আমি চাই না যে ফাইলগুলি মুছার প্রক্রিয়া চলাকালীন ব্যবহারকারী (বা আমার সার্ভার) অপেক্ষা করবেন। সুতরাং, প্রশ্নগুলি:

  1. বিশেষত বিপুল সংখ্যক ফাইল মুছে ফেলার সময় কীভাবে এস 3 ফাইল মুছে ফেলবে?
  2. এটি করার এবং এডাব্লুএসকে বেশিরভাগ কাজটি করার কোনও কার্যকর উপায় আছে কি? দক্ষতার দ্বারা, আমি এস 3-তে সর্বনিম্ন অনুরোধ করা এবং আমার সার্ভারে সংস্থানগুলির সর্বনিম্ন পরিমাণ ব্যবহার করে ন্যূনতম সময় গ্রহণ করার অর্থ।

উত্তর:


12

এডাব্লুএস এস 3 আরএসটি এপিআই এবং এর বিভিন্ন র‌্যাপার ব্যবহার করে প্রতি অনুরোধে 1000 অবধি অবধি মুছে ফেলার সমর্থন করে। এই পদ্ধতিটি ধরে নিয়েছে যে আপনি যে এস 3 অবজেক্ট কীগুলি মুছতে চান তা জানেন (যা এটি কোনও ধারণার নীতি, কোনও নির্দিষ্ট আকারের বেশি ফাইল ইত্যাদি) হ্যান্ডেল করার জন্য তৈরি করা হয়নি)।

S3 REST এপিআই একক অনুরোধে মুছে ফেলার জন্য 1000 টি পর্যন্ত ফাইল নির্দিষ্ট করতে পারে, যা পৃথক অনুরোধ করার চেয়ে দ্রুত হওয়া দরকার। মনে রাখবেন, প্রতিটি অনুরোধ একটি এইচটিটিপি (এইভাবে টিসিপি) অনুরোধ। সুতরাং প্রতিটি অনুরোধ ওভারহেড বহন করে। আপনাকে কেবলমাত্র অবজেক্টগুলির কীগুলি জানতে এবং একটি HTTP অনুরোধ তৈরি করতে হবে (বা আপনার পছন্দের ভাষাতে একটি মোড়ক ব্যবহার করুন)। এডাব্লুএস এই বৈশিষ্ট্য এবং এর ব্যবহার সম্পর্কে দুর্দান্ত তথ্য সরবরাহ করে । আপনি যে পদ্ধতিতে সর্বাধিক স্বাচ্ছন্দ্যময় তা চয়ন করুন!

আমি ধরে নিচ্ছি আপনার ব্যবহারের ক্ষেত্রে একসাথে মুছে ফেলার জন্য নির্দিষ্ট ব্যবহারকারীদের নির্দিষ্ট কয়েকটি ফাইল নির্দিষ্ট করে users "চিত্রের ফাইলগুলিকে উল্লেখ করে এমন সমস্ত বস্তুর শুদ্ধি" বা "নির্দিষ্ট তারিখের চেয়ে পুরানো সমস্ত ফাইলকে মুছে ফেলুন" (যা আমি বিশ্বাস করি যে এস 3-তে পৃথকভাবে কনফিগার করা সহজ) এর মতো কোনও কাজ শুরু করার পরিবর্তে।

যদি তা হয় তবে আপনি কীগুলি মুছতে হবে তা আপনি জানতে পারবেন। এর অর্থ হ'ল ব্যবহারকারী তাদের ফাইলটি সফলভাবে মুছে ফেলা হয়েছে কিনা সে সম্পর্কে আরও রিয়েল টাইম প্রতিক্রিয়া পছন্দ করবে। নির্ভুল কীগুলির উল্লেখগুলি খুব দ্রুত হওয়ার কথা, কারণ এস 3 অত্যন্ত পরিমাণে ডেটা পরিচালনা করার পরেও দক্ষতার সাথে স্কেল করার জন্য ডিজাইন করা হয়েছিল।

যদি তা না হয় তবে আপনি অ্যাসিঙ্ক্রোনাস এপিআই কলগুলিতে সন্ধান করতে পারেন। তারা এই ব্লগ পোস্টটি থেকে কীভাবে সাধারণভাবে কাজ করবে সে সম্পর্কে কিছুটা পড়তে বা আপনার পছন্দের ভাষায় কীভাবে তা অনুসন্ধান করতে পারেন। এটি মুছে ফেলার অনুরোধটিকে তার নিজস্ব থ্রেড নিতে অনুমতি দেবে এবং বাকী কোডটি ব্যবহারকারীকে অপেক্ষা না করেই কার্যকর করতে পারে ute অথবা, আপনি কোনও কাতারে অনুরোধটি অফলোড করতে পারেন। । । তবে এই দুটি অপশনই অযথা আপনার কোড (অ্যাসিনক্রোনাস কোড বিরক্তিকর হতে পারে) বা আপনার পরিবেশকে জটিল করে তোলে (সারিটি সামলানোর জন্য আপনার কোনও পরিষেবা / ডেমন / ধারক / সার্ভারের প্রয়োজন হবে So সুতরাং যদি সম্ভব হয় তবে আমি এই দৃশ্যটি এড়াতে চাই।

সম্পাদনা: 2 টির বেশি লিঙ্ক পোস্ট করার খ্যাতি আমার নেই। তবে আপনি অনুরোধের হার এবং কার্য সম্পাদনের বিষয়ে অ্যামাজনের মন্তব্যগুলি এখানে দেখতে পাবেন: http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html এবং s3 ফ্যাক্ট মন্তব্যগুলি যে বাল্ক ডিলেটিটন হ'ল সম্ভব হলে যাওয়ার উপায়


19

Excruciatingly ধীর বিকল্প s3 rm --recursiveযদি আপনি অপেক্ষা প্রকৃতপক্ষে মত।

s3 rm --recursiveভিন্নতর --includeনিদর্শনগুলির সাথে সমান্তরালভাবে চালানো কিছুটা দ্রুত তবে অনেক সময় এখনও অপেক্ষা করতে ব্যয় হয়, কারণ প্রতিটি প্রক্রিয়া পৃথকভাবে স্থানীয় কী --includeপ্যাটার্নটি মেলানোর জন্য পুরো কী তালিকাটি নিয়ে আসে ।

বাল্ক মোছা প্রবেশ করুন।

আমি খুঁজে পেয়েছিলাম যে একবারে 1000 টি কী ব্যবহার করে মুছে ফেলে আমি সর্বাধিক গতি অর্জন করতে সক্ষম হয়েছি aws s3api delete-objects

এখানে একটি উদাহরণ:

cat file-of-keys | xargs -P8 -n1000 bash -c 'aws s3api delete-objects --bucket MY_BUCKET_NAME --delete "Objects=[$(printf "{Key=%s}," "$@")],Quiet=true"' _
  • -P8বিকল্পটি xargsনিয়ন্ত্রণ উপমা। এটি এই ক্ষেত্রে আটটি, যার অর্থ একবারে 1000 মুছে ফেলার 8 টি উদাহরণ।
  • -n1000বিকল্প বলে xargsপ্রত্যেকের জন্য 1000 চাবি বান্ডেল করতে aws s3api delete-objectsকল।
  • সরানো হচ্ছে ,Quiet=trueবা এটি পরিবর্তন falseসার্ভার প্রতিক্রিয়া আউট বমি হবে।
  • দ্রষ্টব্য: এই _কমান্ড লাইনের শেষে খুব সহজেই মিস হয়েছে। @ ভ্ল্যাডনিকিফোরভ মন্তব্যটিতে এটির জন্য একটি দুর্দান্ত মন্তব্য পোস্ট করেছেন যাতে আমি কেবল এটির সাথে লিঙ্ক করব।

তবে কীভাবে পাবে file-of-keys?

যদি আপনার কীগুলির তালিকা ইতিমধ্যে থাকে তবে আপনার পক্ষে ভাল। কাজ সম্পূর্ণ।

যদি তা না হয় তবে এখানে আমার এক অনুমানের অনুমান:

aws s3 ls "s3://MY_BUCKET_NAME/SOME_SUB_DIR" | sed -nre "s|[0-9-]+ [0-9:]+ +[0-9]+ |SOME_SUB_DIR|p" >file-of-keys

10
দুর্দান্ত পন্থা, কিন্তু আমি দেখতে পেলাম যে কীগুলি তালিকাভুক্ত করা হ'ল বাধা। এটি অনেক দ্রুত: aws s3api list-objects --output text --bucket BUCKET --query 'Contents[].[Key]' | pv -l > BUCKET.keys এবং তারপরে অবজেক্টগুলি সরানো (এটি পর্যাপ্ত ছিল যে 1 সমান্তরাল প্রক্রিয়া পেরিয়ে অবজেক্ট মোছার হারের সীমাতে পৌঁছে যায়): tail -n+0 BUCKET.keys | pv -l | grep -v -e "'" | tr '\n' '\0' | xargs -0 -P1 -n1000 bash -c 'aws s3api delete-objects --bucket BUCKET --delete "Objects=[$(printf "{Key=%q}," "$@")],Quiet=true"' _
SEK

2
আপনারও সম্ভবত _শেষের দিকে গুরুত্বারোপ করা উচিত ছিল :) আমি এটি মিস করেছি এবং তারপরে প্রথম উপাদানটি এড়িয়ে চলেছে কেন তা বুঝতে আমার বেশ খানিকটা সময় লেগেছিল। বিন্দু যে bash -cঅবস্থানগত প্যারামিটার, দিয়ে শুরু হিসাবে সব আর্গুমেন্ট পাস $0, যখন "$ @" শুধুমাত্র পরামিতি প্রক্রিয়া দিয়ে শুরু $1। সুতরাং আন্ডারস্কোর ডামির অবস্থানটি পূরণ করতে হবে $0
ভ্লাদ নিকিফোরোভ

@ ভ্লাদনিকিফোরভ চিয়ার্স, সম্পাদিত।
আনতাক

3
এই পদ্ধতির সাথে আমি একটি সমস্যা খুঁজে পেয়েছি (এন্টাক বা ভ্লাদ থেকে) যে কোনও ত্রুটি থাকলে এটি সহজেই পুনরায় শুরু হয় না। যদি আপনি প্রচুর কীগুলি মুছে ফেলছেন (আমার ক্ষেত্রে 10 এম) আপনার একটি নেটওয়ার্ক ত্রুটি বা থ্রোটলিং ত্রুটি হতে পারে যা এটি ভেঙে দেয়। সুতরাং এটির উন্নতি করার জন্য, আমি split -l 1000আমার কীগুলি ফাইলটি 1000 কী ব্যাচে বিভক্ত করেছি। এখন প্রতিটি ফাইলের জন্য আমি মুছুন আদেশটি ফাইলটি মুছে ফেলতে পারি। কিছু ভুল হলে আমি চালিয়ে যেতে পারি।
joelittlejohn

আপনি যদি কেবল কীগুলির একটি তালিকা চান তবে আমার ধারণা aws s3 ls "s3://MY_BUCKET_NAME/SOME_SUB_DIR" | awk '{print $4}'সহজ হবে এবং আপনি | grepসেখান থেকে ফিল্টার করার জন্য একটি যুক্ত করতে পারেন ।
হেডেন

3

আমি এই কাজের জন্য ওয়েব কনসোলের অভিনয় দেখে হতাশ হয়েছি। আমি দেখতে পেয়েছি যে AWS CLI কমান্ড এটি ভালভাবে করে। উদাহরণ স্বরূপ:

aws s3 rm --recursive s3://my-bucket-name/huge-directory-full-of-files

একটি বৃহত ফাইল শ্রেণিবিন্যাসের জন্য, এটি কিছুটা সময় নিতে পারে। আপনি একটি এই চলমান সেট করতে পারেন tmuxঅথবা screenঅধিবেশন এবং পরে আবার পরীক্ষা করুন।


2
দেখে মনে হচ্ছে aws s3 rm --recursiveকমান্ডটি পৃথকভাবে ফাইলগুলি মুছে ফেলে। যদিও ওয়েব কনসোলের চেয়ে দ্রুত, প্রচুর ফাইল মুছার সময়, এটি যদি খুব বেশি পরিমাণে মুছে ফেলা যায় তবে এটি আরও দ্রুত হতে পারে
ব্র্যান্ডন

2

একটি ঝরঝরে কৌতুক আপনার জন্য মুছে ফেলা পরিচালনা করতে লাইফসাইकल বিধিগুলি ব্যবহার করছে। আপনি যে প্রিফিক্স বা অবজেক্টস চান তা মুছতে একটি নিয়ম সারি করতে পারেন এবং আমাজন কেবল মুছে ফেলার যত্ন নেবে।

https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html


, সতর্কতা অবলম্বন করা আবশ্যক, যদিও, আপনি যদি বস্তু অনেক আছে হিসাবে এই খুব ব্যয়বহুল হতে পারে, stackoverflow.com/questions/54255990/...
উইল

0

আপনি কীভাবে এস 3 বালতি পরিচালনা করছেন তা না জেনে, এটি বিশেষভাবে দরকারী বা নাও হতে পারে।

এডাব্লুএস সিএলআই সরঞ্জামগুলিতে "সিঙ্ক" নামে একটি বিকল্প রয়েছে যা এস 3 এর সঠিক অবজেক্টগুলি রয়েছে তা নিশ্চিত করার জন্য বিশেষভাবে কার্যকর হতে পারে। আপনি বা আপনার ব্যবহারকারীরা যদি কোনও স্থানীয় ফাইল সিস্টেম থেকে এস 3 পরিচালনা করে থাকেন তবে আপনি সিএলআই সরঞ্জাম ব্যবহার করে কোন বিষয়গুলি মুছতে হবে তা নির্ধারণ করে আপনি এক টন কাজ বাঁচাতে সক্ষম হতে পারেন।

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


0

s3 syncকমান্ড সম্পর্কে আগেই উল্লেখ আছে তবে উদাহরণ এবং --deleteবিকল্প সম্পর্কে বিকল্প নেই।

আমি S3বালতিতে ফোল্ডারের সামগ্রী মুছে ফেলার সবচেয়ে দ্রুততম উপায় এটি পেয়েছি my_bucket:

aws s3 sync --delete "local-empty-dir/" "s3://my_bucket/path-to-clear"

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.