วิธีที่มีประสิทธิภาพที่สุดในการลบไฟล์ S3 ออกเป็นชุด


16

ฉันต้องการที่จะสามารถลบไฟล์หลายพันหรือหลายหมื่นชุดในคราวเดียวบน S3 แต่ละไฟล์จะอยู่ที่ใดก็ได้ตั้งแต่ 1MB ถึง 50MB โดยปกติฉันไม่ต้องการให้ผู้ใช้ (หรือเซิร์ฟเวอร์ของฉัน) รออยู่ขณะที่ไฟล์กำลังถูกลบ ดังนั้นคำถาม:

  1. S3 จัดการกับการลบไฟล์อย่างไรโดยเฉพาะเมื่อทำการลบไฟล์จำนวนมาก?
  2. มีวิธีที่มีประสิทธิภาพในการทำสิ่งนี้และทำให้ AWS ทำงานส่วนใหญ่ได้หรือไม่? ด้วยประสิทธิภาพฉันหมายถึงการทำให้คำขอน้อยที่สุดสำหรับ S3 และใช้เวลาน้อยที่สุดโดยใช้ทรัพยากรจำนวนน้อยที่สุดในเซิร์ฟเวอร์ของฉัน

คำตอบ:


12

AWS รองรับการลบวัตถุได้สูงสุด 1,000 รายการต่อคำขอโดยใช้ S3 REST API และโปรแกรมเสริมต่างๆ เมธอดนี้ถือว่าคุณรู้ว่าคีย์อ็อบเจ็กต์ S3 ที่คุณต้องการลบ (นั่นคือมันไม่ได้ออกแบบมาเพื่อจัดการบางอย่างเช่นนโยบายการเก็บข้อมูลไฟล์ที่มีขนาดเกินขนาดที่กำหนด ฯลฯ )

S3 REST API สามารถระบุไฟล์สูงสุด 1000 ไฟล์ที่จะลบในคำขอเดียวซึ่งจะต้องเร็วกว่าการร้องขอแต่ละรายการ โปรดจำไว้ว่าคำขอแต่ละรายการเป็นคำขอ HTTP (เช่น TCP) ดังนั้นแต่ละคำขอมีค่าใช้จ่าย คุณเพียงแค่ต้องรู้กุญแจของวัตถุและสร้างคำขอ HTTP (หรือใช้กระดาษห่อในภาษาที่คุณต้องการ) AWS ให้ข้อมูลที่ดีเกี่ยวกับคุณลักษณะนี้และการใช้งานของ เพียงเลือกวิธีที่คุณพอใจที่สุด!

ฉันสมมติว่ากรณีการใช้งานของคุณเกี่ยวข้องกับผู้ใช้ปลายทางที่ระบุจำนวนไฟล์ที่จะลบในครั้งเดียว แทนที่จะเริ่มงานเช่น "ล้างวัตถุทั้งหมดที่อ้างถึงไฟล์รูปภาพ" หรือ "ล้างไฟล์ทั้งหมดที่เก่ากว่าวันที่กำหนด" (ซึ่งฉันเชื่อว่าง่ายต่อการกำหนดค่าแยกต่างหากใน S3)

ถ้าเป็นเช่นนั้นคุณจะรู้ถึงกุญแจที่คุณต้องลบ นอกจากนี้ยังหมายถึงผู้ใช้จะชอบข้อเสนอแนะเรียลไทม์เกี่ยวกับว่าไฟล์ของพวกเขาถูกลบประสบความสำเร็จหรือไม่ การอ้างอิงถึงคีย์ที่ถูกต้องน่าจะเร็วมากเนื่องจาก S3 ได้รับการออกแบบให้ปรับขนาดได้อย่างมีประสิทธิภาพแม้จะจัดการกับข้อมูลจำนวนมาก

ถ้าไม่คุณสามารถดูการเรียก API แบบอะซิงโครนัส คุณสามารถอ่านเล็กน้อยเกี่ยวกับวิธีการทำงานโดยทั่วไปจากโพสต์บล็อกนี้หรือค้นหาวิธีการใช้งานในภาษาที่คุณเลือก สิ่งนี้จะทำให้การร้องขอการลบใช้เธรดของตนเองและโค้ดที่เหลือสามารถดำเนินการได้โดยไม่ต้องรอให้ผู้ใช้รอ หรือคุณสามารถลดการร้องขอไปยังคิว . . แต่ตัวเลือกทั้งสองนี้ไม่จำเป็นต้องซับซ้อนทั้งรหัสของคุณ (รหัสแบบอะซิงโครนัสอาจสร้างความรำคาญ) หรือสภาพแวดล้อมของคุณ (คุณต้องมีบริการ / daemon / container / server เพื่อจัดการคิวดังนั้นฉันจะหลีกเลี่ยงสถานการณ์นี้ถ้าเป็นไปได้

แก้ไข: ฉันไม่มีชื่อเสียงในการโพสต์ลิงก์มากกว่า 2 ลิงก์ แต่คุณสามารถเห็นความคิดเห็นของ Amazon เกี่ยวกับอัตราการร้องขอและประสิทธิภาพได้ที่นี่: http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-per-perf-considerations.html http://docs.aws.amazon.com/3/latest/dev/request-rate-perf-considerations.htmlและความคิดเห็น s3 faq ที่ deleiton จำนวนมากคือ ทางไปถ้าเป็นไปได้


19

ช้าเลือดตาแทบกระเด็นตัวเลือกที่เป็น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การควบคุมขนาน ในกรณีนี้มีแปดกรณีซึ่งหมายถึงการลบ 1,000 ครั้งครั้งละ 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ดังนั้นหุ่นขีดเป็นสิ่งจำเป็นในการกรอกข้อมูลตำแหน่งของ
Vlad Nikiforov

@VladNikiforov ไชโยแก้ไข
antak

3
ปัญหาหนึ่งที่ฉันพบด้วยวิธีนี้ (ทั้งจาก antak หรือ Vlad) คือมันไม่สามารถทำงานต่อได้อย่างง่ายดายหากมีข้อผิดพลาด หากคุณลบคีย์ล็อต (10M ในกรณีของฉัน) คุณอาจมีข้อผิดพลาดของเครือข่ายหรือข้อผิดพลาดการควบคุมปริมาณ ดังนั้นเพื่อปรับปรุงสิ่งนี้ฉันใช้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คำสั่งจะลบไฟล์ทีละรายการ แม้ว่าจะเร็วกว่าคอนโซลเว็บ แต่เมื่อลบไฟล์จำนวนมากออกไปมันอาจเร็วกว่านี้มากหากมันถูกลบเป็นกลุ่ม
Brandon

2

เคล็ดลับเรียบร้อยคือการใช้กฎวงจรชีวิตเพื่อจัดการกับการลบสำหรับคุณ คุณสามารถจัดคิวกฎเพื่อลบคำนำหน้าหรือวัตถุที่คุณต้องการและ Amazon จะดูแลการลบ

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


โปรดใช้ความระมัดระวังแม้ว่าขณะนี้จะมีราคาแพงมากถ้าคุณมีจำนวนมากของวัตถุstackoverflow.com/questions/54255990/...
Will

0

โดยไม่ทราบว่าคุณกำลังจัดการกับถัง s3 ได้อย่างไรอาจเป็นประโยชน์อย่างยิ่งหรือไม่ก็ได้

เครื่องมือ AWS CLI มีตัวเลือกที่เรียกว่า "ซิงค์" ซึ่งมีประสิทธิภาพเป็นพิเศษเพื่อให้แน่ใจว่า s3 มีวัตถุที่ถูกต้อง หากคุณหรือผู้ใช้ของคุณกำลังจัดการ S3 จากระบบไฟล์ในตัวคุณอาจสามารถบันทึกงานจำนวนมากที่กำหนดว่าต้องลบวัตถุใดโดยใช้เครื่องมือ CLI

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.