การดาวน์โหลดชุดข้อมูลขนาดใหญ่บนเว็บโดยตรงไปยัง AWS S3


12

ไม่มีใครรู้ว่าเป็นไปได้ที่จะนำเข้าชุดข้อมูลขนาดใหญ่ไปยัง Amazon S3 จาก URL หรือไม่?

โดยทั่วไปฉันต้องการหลีกเลี่ยงการดาวน์โหลดไฟล์ขนาดใหญ่แล้วทำการอัปโหลดไฟล์ซ้ำอีกครั้งเป็น S3 ผ่านเว็บพอร์ทัล ฉันแค่ต้องการให้ URL ดาวน์โหลดไปยัง S3 และรอให้พวกเขาดาวน์โหลดไปยังระบบไฟล์ของพวกเขา ดูเหมือนจะเป็นเรื่องง่ายที่จะทำ แต่ฉันก็หาเอกสารไม่เจอ


เป็นคำถามที่ดีมาก
Pramit

คำตอบ:


10

เนื่องจากคุณมีบัญชี AWS ฉันจึงแนะนำสิ่งต่อไปนี้:

  • สร้างอินสแตนซ์ EC2 (ขนาดใดก็ได้)
  • ใช้wget (หรือ curl) เพื่อดึงไฟล์ไปยังอินสแตนซ์ EC2 นั้น ตัวอย่างเช่นwget http://example.com/my_large_file.csv.
  • ติดตั้งs3cmd
  • ใช้s3cmdเพื่ออัปโหลดไฟล์ไปยัง S3 ตัวอย่างเช่น:s3cmd cp my_large_file.csv s3://my.bucket/my_large_file.csv

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


ขอบคุณ. ฉันใคร่ครวญบางอย่างเช่นนี้ แต่ฉันอยากถามว่ามีวิธีที่ง่ายกว่านี้ไหม ขอบคุณที่ชี้ขั้นตอนทั้งหมดด้วย มีประโยชน์มาก
Will Stedden

@Daniel Zohar จะเกิดอะไรขึ้นถ้า URL นั้นเป็นแบบไดนามิก การใช้ wget ไม่ได้ดาวน์โหลดไฟล์ แต่มีเฉพาะเพจที่มีลิงก์นี้: cms.unov.org/UNCorpus/en/Download?file=UNv1.0.en-zh.tar.gz.00
echan00

3
  1. เรียกใช้อินสแตนซ์ EC2 ที่มีพื้นที่เก็บข้อมูลเพียงพอ

  2. ssh กับอินสแตนซ์

  3. รับคำสั่ง curl ที่สอดคล้องกับการดาวน์โหลดจากเครื่องท้องถิ่นของคุณ คุณสามารถใช้ตัวเลือกนักพัฒนาซอฟต์แวร์ใน Google chrome -> แท็บเครือข่าย -> คัดลอก -> คัดลอกเป็น curl (ขั้นตอนนี้จำเป็นสำหรับบางเว็บไซต์ที่ต้องการการรับรองความถูกต้องเช่น kaggle)

  4. จากเทอร์มินัลอินสแตนซ์ให้เรียกใช้curlคำสั่ง (ผนวก-o output_fileเข้ากับคำสั่ง) จะเป็นการดาวน์โหลดและบันทึกไฟล์

  5. กำหนดค่าข้อมูลประจำตัว aws เพื่อเชื่อมต่ออินสแตนซ์กับ s3 (วิธีหนึ่งคือการใช้คำสั่งaws configระบุรหัสการเข้าถึง AWS และรหัสลับ)

  6. ใช้คำสั่งนี้เพื่ออัพโหลดไฟล์ไปยัง s3:

    aws s3 cp path-to-file s3://bucket-name/
    

2

อ้างอิงเอกสาร Aws: http://aws.amazon.com/codeมีห้องสมุดสำหรับภาษาโปรแกรมส่วนใหญ่ ดังนั้นคุณสามารถสร้างที่ฝากข้อมูลและกำหนดค่าในรหัสของคุณเพื่อดึงข้อมูลจาก url และเขียนไปยังที่ฝากข้อมูลนี้ใน s3

สำหรับเช่นในหลาม:

from boto.s3.key import Key
k = Key(bucket)
k.key = 'foobar'
k.set_contents_from_string(url_data)

Ref: https://boto.readthedocs.org/en/latest/s3_tut.html


ฉันไม่คิดว่ามันค่อนข้างถูก ฉันไม่ค่อยชัดเจนว่า url_data จะมาจากไหน จากเอกสารประกอบ k.set_contents_from_string () ดูเหมือนว่าจะค่อนข้างตั้งเนื้อหาของไฟล์ 'foobar' เป็นสิ่งที่มีอยู่ในสตริงที่ ฉันต้องการให้เนื้อหาที่ url นั้นถูกส่งไปยัง s3 โดยตรงโดยไม่จำเป็นต้องดาวน์โหลดในเครื่อง
Will Stedden

1

คุณสามารถเมานต์ s3 bucket ของคุณไปยังอินสแตนซ์ของ ec2 จากนั้น cd ไปที่ / path / to / s3_mounted_on_a_folder คุณสามารถใช้คำสั่ง:

wget https://your.download.url/

หากต้องการเมาต์ s3 กับ ec2 ของคุณให้ใช้ s3fs

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.