Herunterladen eines großen Datensatzes im Web direkt in AWS S3

12

Weiß jemand, ob es möglich ist, ein großes Dataset von einer URL in Amazon S3 zu importieren?

Grundsätzlich möchte ich vermeiden, dass eine große Datei heruntergeladen und dann über das Webportal erneut in S3 hochgeladen wird. Ich möchte nur die Download-URL für S3 bereitstellen und darauf warten, dass sie sie in ihr Dateisystem herunterladen. Es scheint eine einfache Sache zu sein, aber ich kann die Dokumentation dazu einfach nicht finden.

Will Stedden
quelle
Gute Frage.
Pramit

Antworten:

10

Da Sie offensichtlich ein AWS-Konto besitzen, würde ich Folgendes empfehlen:

  • Erstellen Sie eine EC2-Instanz (beliebige Größe)
  • Verwenden Sie wget (oder curl), um die Datei (en) zu dieser EC2-Instanz abzurufen. Zum Beispiel : wget http://example.com/my_large_file.csv.
  • Installieren Sie s3cmd
  • Verwenden Sie s3cmddiese Option, um die Datei in S3 hochzuladen. Beispielsweise:s3cmd cp my_large_file.csv s3://my.bucket/my_large_file.csv

Da Verbindungen zwischen verschiedenen AWS-Diensten das interne Netzwerk von AWS nutzen, ist das Hochladen von einer EC2-Instanz auf S3 ziemlich schnell. Viel schneller als das Hochladen von Ihrem eigenen Computer. Auf diese Weise können Sie vermeiden, dass die Datei auf Ihren Computer heruntergeladen wird, und möglicherweise erhebliche Zeit beim Hochladen über die Weboberfläche sparen.

Daniel Zohar
quelle
Vielen Dank. Ich habe über so etwas nachgedacht, aber ich wollte herumfragen, ob es einen einfacheren Weg gibt. Vielen Dank, dass Sie auch auf alle Schritte hingewiesen haben. Sehr hilfreich
Will Stedden
@ Daniel Zohar Was ist, wenn die URL dynamisch ist? Mit wget wird nicht die Datei heruntergeladen, sondern nur die Seite mit diesem Link: cms.unov.org/UNCorpus/en/Download?file=UNv1.0.en-zh.tar.gz.00
echan00
3
  1. Starten Sie eine EC2-Instanz mit ausreichend Speicherplatz

  2. ssh zur Instanz

  3. Rufen Sie den Curl-Befehl ab, der dem Download von Ihrem lokalen Computer entspricht. Sie können die Entwickleroptionen in Google Chrome -> Registerkarte "Netzwerk" -> Kopieren -> Als Curl kopieren verwenden (dieser Schritt ist für einige Websites erforderlich, für die eine Authentifizierung erforderlich ist, z. B. "Kaggle").

  4. Führen Sie den curlBefehl vom Instanzterminal aus ( -o output_filean den Befehl anhängen ). Dadurch wird die Datei heruntergeladen und gespeichert

  5. Konfigurieren Sie aws-Anmeldeinformationen, um die Instanz mit s3 zu verbinden (eine Möglichkeit besteht darin, den Befehl zu verwenden aws config, die ID und das Geheimnis des AWS-Zugriffsschlüssels anzugeben).

  6. Verwenden Sie diesen Befehl, um die Datei auf s3 hochzuladen:

    aws s3 cp path-to-file s3://bucket-name/
    
MNassar
quelle
2

Siehe Aws-Dokumentation: http://aws.amazon.com/code Für die meisten Programmiersprachen stehen Bibliotheken zur Verfügung. Sie können also einen Bucket erstellen und in Ihrem Code konfigurieren, dass Daten aus der URL abgerufen und in s3 in diesen Bucket geschrieben werden

für zB in Python:

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

Sreejithc321
quelle
Ich denke nicht, dass das ganz richtig ist. Ich bin mir ein wenig unklar, woher url_data kommen würde. Aus der Dokumentation geht hervor, dass k.set_contents_from_string () den Inhalt der Datei 'foobar' buchstäblich auf das setzt, was in dieser Zeichenfolge enthalten ist. Ich möchte, dass der Inhalt dieser URL direkt auf s3 übertragen wird, ohne dass er lokal heruntergeladen werden muss.
Will Stedden
1

Sie können Ihren s3-Bucket in die ec2-Instanz einbinden und dann in den Ordner / path / to / s3_mounted_on_a_folder cd. Dort können Sie einfach den folgenden Befehl verwenden:

wget https://your.download.url/

Verwenden Sie s3fs, um s3 an Ihrem ec2 zu mounten.

Tanmay Gautam
quelle