S3 फ़ाइलें हटाने के लिए सबसे प्रभावी तरीका है


16

मैं S3 पर एक बार में हज़ारों या दसियों हज़ारों फ़ाइलों को हटाने में सक्षम होना चाहूंगा। प्रत्येक फ़ाइल 1MB से 50MB तक कहीं भी होगी। स्वाभाविक रूप से, मैं नहीं चाहता कि उपयोगकर्ता (या मेरा सर्वर) प्रतीक्षा कर रहा हो, जब फाइलें नष्ट होने की प्रक्रिया में हों। इसलिए, प्रश्न:

  1. S3 फ़ाइल हटाने को कैसे नियंत्रित करता है, खासकर जब बड़ी संख्या में फ़ाइलों को हटा रहा हो?
  2. क्या ऐसा करने का एक कुशल तरीका है और AWS को अधिकांश काम करना है? कुशल से, मेरा मतलब S3 से कम से कम संख्या में अनुरोध करने और अपने सर्वर पर कम से कम संसाधनों का उपयोग करके कम से कम समय लेने से है।

जवाबों:


12

A3 S3 REST API और इसके विभिन्न रैपर का उपयोग करके प्रति अनुरोध 1000 वस्तुओं तक के थोक विलोपन का समर्थन करता है। यह विधि मानती है कि आप उस S3 ऑब्जेक्ट कुंजियों को जानते हैं, जिसे आप निकालना चाहते हैं (अर्थात, इसे किसी अवधारण नीति, कुछ निश्चित आकार से अधिक फ़ाइलें, आदि) को संभालने के लिए डिज़ाइन नहीं किया गया है।

S3 REST API एकल अनुरोध में हटाई जाने वाली 1000 फ़ाइलों को निर्दिष्ट कर सकती है, जो कि व्यक्तिगत अनुरोध करने की तुलना में तेज होनी चाहिए। याद रखें, प्रत्येक अनुरोध एक HTTP (इस प्रकार टीसीपी) अनुरोध है। इसलिए प्रत्येक अनुरोध ओवरहेड वहन करता है। आपको बस वस्तुओं की कुंजी जानने और एक HTTP अनुरोध बनाने (या अपनी पसंद की भाषा में एक आवरण का उपयोग करने) की आवश्यकता है। AWS इस सुविधा और इसके उपयोग पर बहुत अच्छी जानकारी प्रदान करता है । बस वह विधि चुनें जिसके साथ आप सबसे अधिक सहज हों!

मैं मान रहा हूं कि आपके उपयोग के मामले में अंतिम उपयोगकर्ता एक बार में हटाने के लिए कई विशिष्ट फ़ाइलों को निर्दिष्ट कर रहे हैं। किसी कार्य को शुरू करने के बजाय जैसे "सभी ऑब्जेक्ट्स जो चित्र फ़ाइलों को संदर्भित करता है" या "एक निश्चित तिथि से अधिक पुरानी सभी फ़ाइलों को शुद्ध करें" (जो मेरा मानना ​​है कि S3 में अलग से कॉन्फ़िगर करना आसान है)।

यदि हां, तो आपको उन कुंजियों का पता चल जाएगा जिन्हें आपको हटाने की आवश्यकता है। इसका मतलब यह भी है कि उपयोगकर्ता इस बारे में अधिक वास्तविक समय प्रतिक्रिया पसंद करेंगे कि उनकी फ़ाइल सफलतापूर्वक हटा दी गई थी या नहीं। सटीक कुंजी का संदर्भ बहुत जल्दी माना जाता है, क्योंकि S3 को बहुत बड़ी मात्रा में डेटा को संभालने के बावजूद कुशलता से स्केल करने के लिए डिज़ाइन किया गया था।

यदि नहीं, तो आप एसिंक्रोनस एपीआई कॉल में देख सकते हैं। आप इस बारे में थोड़ा पढ़ सकते हैं कि वे इस ब्लॉग पोस्ट से सामान्य रूप से कैसे काम करेंगे या अपनी पसंद की भाषा में कैसे करें। यह विलोपन अनुरोध को अपना स्वयं का धागा लेने की अनुमति देगा, और बाकी कोड उपयोगकर्ता को प्रतीक्षा किए बिना निष्पादित कर सकता है। या, आप अनुरोध को एक कतार में लोड कर सकते हैं। । । लेकिन इन दोनों विकल्पों में अनावश्यक रूप से या तो आपके कोड (अतुल्यकालिक कोड कष्टप्रद हो सकते हैं) या आपके वातावरण को जटिल बनाते हैं (कतार को संभालने के लिए आपको सेवा / डेमॉन / कंटेनर / सर्वर की आवश्यकता होगी। इसलिए यदि संभव हो तो मैं इस परिदृश्य से बचूंगा।

संपादित करें: मेरे पास 2 से अधिक लिंक पोस्ट करने की प्रतिष्ठा नहीं है। लेकिन आप अनुरोध दर और प्रदर्शन पर अमेज़ॅन की टिप्पणियों को यहां देख सकते हैं: http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html और s3 faq टिप्पणियाँ: थोक deleiton है यदि संभव हो तो जाने का रास्ता।


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से सर्वर प्रतिक्रियाएँ समाप्त हो जाएंगी।
  • नोट: _उस कमांड लाइन के अंत में एक आसानी से याद किया गया है। @VladNikiforov ने टिप्पणी में इसके लिए एक उत्कृष्ट टिप्पणी पोस्ट की है तो मैं बस उसी से लिंक करने जा रहा हूं।

लेकिन आपको कैसे मिलता है 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
व्लाद निकिफोरोव

@VladNikiforov चीयर्स, संपादित।
1

3
एक समस्या जो मुझे इस दृष्टिकोण से मिली है (या तो एंटैक या व्लाद से) यह है कि यदि कोई त्रुटि है तो यह आसानी से फिर से शुरू नहीं हो सकती है। यदि आप बहुत अधिक चाबियाँ हटा रहे हैं (मेरे मामले में 10M) तो आपके पास नेटवर्क त्रुटि, या थ्रॉटलिंग त्रुटि हो सकती है, जो इसे तोड़ती है। इसलिए इसे सुधारने के लिए, मैंने split -l 1000अपनी कुंजी फ़ाइल को 1000 कुंजी बैचों में विभाजित करने के लिए उपयोग किया है। अब प्रत्येक फाइल के लिए मैं डिलीट कमांड जारी कर सकता हूं फिर फाइल डिलीट कर सकता हूं। अगर कुछ भी गलत होता है, तो मैं जारी रख सकता हूं।
जोएलबेटजोन

यदि आप केवल चाबियों की सूची चाहते हैं, तो मुझे लगता है aws s3 ls "s3://MY_BUCKET_NAME/SOME_SUB_DIR" | awk '{print $4}'कि यह सरल होगा और आप इसे | grepनीचे से फ़िल्टर करने के लिए जोड़ सकते हैं ।
हेडेन

3

मैं इस कार्य के लिए वेब कंसोल के प्रदर्शन से निराश था। मैंने पाया कि एडब्ल्यूएस सीएलआई कमांड यह अच्छी तरह से करता है। उदाहरण के लिए:

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

एक बड़ी फ़ाइल पदानुक्रम के लिए, इसमें कुछ समय लग सकता है। आप इसे चालू tmuxया screenसत्र में सेट कर सकते हैं और बाद में वापस देख सकते हैं।


2
ऐसा लगता है कि aws s3 rm --recursiveकमांड व्यक्तिगत रूप से फ़ाइलों को हटा देती है। हालाँकि वेब कंसोल की तुलना में तेज़, बहुत सारी फ़ाइलों को हटाते समय, यह बहुत तेज़ हो सकता है अगर इसे बल्क में हटा दिया जाए
Brandon

2

आपके लिए डिलीट को संभालने के लिए एक साफ सुथरा ट्रिक जीवनचक्र के नियमों का उपयोग कर रहा है। आप उपसर्ग या इच्छित वस्तुओं को हटाने के लिए एक नियम को पंक्तिबद्ध कर सकते हैं और अमेज़ॅन बस विलोपन का ध्यान रखेगा।

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


सावधान रहो, हालांकि, अगर आप वस्तुओं की एक बहुत कुछ है के रूप में यह बहुत महंगा हो सकता है, stackoverflow.com/questions/54255990/...
विल

0

यह जाने बिना कि आप s3 बाल्टियों का प्रबंधन कैसे कर रहे हैं, यह विशेष रूप से उपयोगी हो सकता है या नहीं भी।

एडब्ल्यूएस सीएलआई टूल्स में "सिंक" नामक एक विकल्प होता है जो विशेष रूप से प्रभावी हो सकता है यह सुनिश्चित करने के लिए कि एस 3 में सही ऑब्जेक्ट हैं। यदि आप, या आपके उपयोगकर्ता, स्थानीय फ़ाइल सिस्टम से S3 का प्रबंधन कर रहे हैं, तो आप यह निर्धारित करने में एक टन का काम बचा सकते हैं कि सीएलआई टूल्स का उपयोग करके किन वस्तुओं को हटाने की आवश्यकता है।

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"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.