2017-03-18 1 views
2

Ich verwende eine EMR-Aktivität in AWS Datenpipeline. Diese EMR-Aktivität führt ein Hive-Skript im EMR-Cluster aus. Es nimmt Dynamo DB als Eingabe und speichert Daten in S3.

Dies ist der EMR Schritt verwendet in EMR Aktivität

s3://elasticmapreduce/libs/script-runner/script-runner.jar,s3://elasticmapreduce/libs/hive/hive-script,--run-hive-script,--hive-versions,latest,--args,-f,s3://my-s3-bucket/hive/my_hive_script.q,-d,DYNAMODB_INPUT_TABLE1=MyTable,-d,S3_OUTPUT_BUCKET=#{output.directoryPath} 

wo

out.direcoryPath ist:

s3://my-s3-bucket/output/#{format(@scheduledStartTime,"YYYY-MM-dd")} 

So schafft dies einen Ordner und eine Datei in S3. (Technisch gesehen ist es schafft zwei Schlüssel 2017-03-18/<some_random_number> und 2017-03-18_$folder$)

2017-03-18 
2017-03-18_$folder$ 

Wie Schaffung dieser zusätzlichen leeren _$folder$ Dateien zu vermeiden.

EDIT: Ich fand eine Lösung bei https://issues.apache.org/jira/browse/HADOOP-10400 aufgeführt, aber ich weiß nicht, wie man es in AWS Datenpipeline implementieren.

Antwort

2

EMR keine Möglichkeit zu schaffen, scheint dies zu vermeiden.

Da S3 ein Schlüssel-Wert-Paar-Speichersystem verwendet, implementiert das Hadoop-Dateisystem die Verzeichnisunterstützung in S3, indem leere Dateien mit dem Suffix "_ $ folder $" erstellt werden.

Sie können alle leeren Dateien mit dem Suffix <directoryname>_$folder$ sicher löschen, die in Ihren S3-Buckets angezeigt werden. Diese leeren Dateien werden zur Laufzeit vom Hadoop-Framework erstellt, aber Hadoop verarbeitet Daten auch dann, wenn diese leeren Dateien entfernt werden.

https://aws.amazon.com/premiumsupport/knowledge-center/emr-s3-empty-files/

Es ist im Quellcode Hadoop, so dass es repariert werden kann, aber anscheinend ist es nicht in EMR fixiert.

Wenn Sie sich schlau fühlen, können Sie eine S3-Ereignisbenachrichtigung erstellen, die dem Suffix _ $ folder $ entspricht, und eine Lambda-Funktion auslösen, um die Objekte nach ihrer Erstellung zu löschen.

+0

Ich habe eine Lösung auf https://issues.apache.org/jira/browse/HADOOP-10400 aufgeführt, aber ich weiß nicht, wie Sie es in AWS-Daten implementieren Pipeline. –

+0

@saurabhagarwal Ich glaube, Sie können nicht, mit EMR - es ist ein Managed Service. –

0

In S3 gibt es keine Möglichkeit, einen leeren Ordner zu erstellen. S3 ist ein Objektspeicher, also ist alles ein Objekt darin. Wenn Hadoop es als Dateisystem verwendet, müssen diese Objekte so organisiert werden, dass es als Dateisystemstruktur angezeigt wird. Daher werden einige spezielle Objekte erstellt, um ein Objekt als Verzeichnis zu markieren. Sie speichern nur Datendateien, aber Sie können diese Datendateien in Pfade organisieren, wodurch ein Konzept erstellt wird, das den Ordnern für das Traversing ähnelt.

Wenn Sie einfach keinen Ordner erstellen, sondern Dateien in den gewünschten Pfad platzieren, sollte das für Sie funktionieren. Sie müssen keinen Ordner erstellen, bevor Sie Dateien in S3 schreiben.

Dies kann auch helfen: https://qubole.zendesk.com/hc/en-us/articles/213496246-How-To-Remove-Dir-marker-folders-in-S3-NativeFS-

+0

* "Es gibt keine Möglichkeit in S3, einen leeren Ordner zu erstellen." * Das ist nicht wahr. Es stimmt zwar, dass Ordner nicht wirklich existieren, aber jedes Objekt, dessen Schlüssel mit einem nachgestellten Schrägstrich endet, wird von der Konsole als Ordner interpretiert. Unglücklicherweise verwendet Hadoop diesen doof '_ $ Ordner $' Konstrukt völlig unnötig, da es einfach '/' verwenden könnte - was passiert, wenn Sie in der Konsole "einen Ordner erstellen". –

+0

@ Michael-sqlbot Es stimmt über S3, es hat nur Eimer und Schlüssel. Einige Werkzeuge können jedoch Ordner nachahmen, indem sie/s in Objektnamen interpretieren. Die Amazon S3-Konsole unterstützt das Ordnerkonzept zum Gruppieren von Objekten. So auch der Bucket Explorer. Siehe hier: http://www.bucketexplorer.com/documentation/amazon-s3--how-to-create-a-folder.html – leftjoin

+0

Hadoop s3n-Client verwendet den $ folder $ marker aus historischen Gründen; Ich denke, ursprünglich konnte man "/" nicht verwenden. Der neuere S3a-Client verwendet "/"; Es ignoriert $ folder $ files in Listings. Der S3-Konnektor von Amazon EMR ist sein eigener Code, er scheint weiterhin $ folder $ zu verwenden. Ihre Entscheidung. –

0

Verwenden Sie das folgende Skript in der EMR-Bootstrap-Aktion, um dieses Problem zu lösen.Patch zur Verfügung gestellt von AWS

#!/bin/bash 

# NOTE: This script replaces the s3-dist-cp RPM on EMR versions 4.6.0+ with s3-dist-cp-2.2.0. 
# This is intended to remove the _$folder$ markers when creating the destination prefixes in S3. 

set -ex 

RPM=bootstrap-actions/s3-dist-cp-2.2.0/s3-dist-cp-2.2.0-1.amzn1.noarch.rpm 

LOCAL_DIR=/var/aws/emr/packages/bigtop/s3-dist-cp/noarch 

# Get the region from metadata 
REGION=$(curl http://169.254.169.254/latest/meta-data/placement/availability-zone/ 2>/dev/null | head -c -1) 

# Choose correct bucket for region 
if [ $REGION = "us-east-1" ] 
then 
    BUCKET=awssupportdatasvcs.com 
else 
    BUCKET=$REGION.awssupportdatasvcs.com 
fi 

# Download new RPM 
sudo rm $LOCAL_DIR/s3-dist-cp*.rpm 
aws s3 cp s3://$BUCKET/$RPM /tmp/ 
sudo cp /tmp/s3-dist-cp-2.2.0-1.amzn1.noarch.rpm $LOCAL_DIR/ 

echo Rebuilding Repo 
sudo yum install -y createrepo 
sudo createrepo --update -o /var/aws/emr/packages/bigtop /var/aws/emr/packages/bigtop 
sudo yum clean all 
Verwandte Themen