2017-03-18 8 views
2

AWSデータパイプラインでEMRアクティビティを使用しています。このEMRアクティビティは、EMRクラスタでハイブスクリプトを実行しています。ダイナモDBを入力とし、データをS3に保存します。

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

は、これは一つのフォルダおよびS3内の1つのファイルを作成します。

これは

out.direcoryPathであるEMR活性

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} 

で使用されるEMRの工程です。 (技術的に言えば、それは二つの鍵2017-03-18/<some_random_number>2017-03-18_$folder$を作成します)

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

これらの余分な空_$folder$ファイルの作成を回避する方法。

EDIT: https://issues.apache.org/jira/browse/HADOOP-10400にリストされている解決策が見つかりましたが、AWSデータパイプラインで実装する方法がわかりません。

答えて

2

EMRはこれを回避する方法を提供していないようです。

S3は、キーと値のペアのストレージ・システムを採用しているため、Hadoopのファイルシステムには、「_ $フォルダ$」サフィックスを持つ空のファイルを作成することにより、S3でディレクトリのサポートを実装しています。

S3バケットに表示される<directoryname>_$folder$という接尾辞を持つ空のファイルは、安全に削除できます。これらの空のファイルは、実行時にHadoopフレームワークによって作成されますが、空のファイルが削除されてもHadoopはデータを処理するように設計されています。

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

それはHadoopのソースコードにありますので、それは修正される可能性があり、どうやらそれはEMRで固定していません。

もしあなたが賢明なら、_ $ folder $接尾辞と一致するS3イベント通知を作成し、作成したオブジェクトを削除するためにLambda関数を起動させることができます。

+0

https://issues.apache.org/jira/browse/HADOOP-10400にリストされているソリューションが見つかりましたが、AWSデータで実装する方法はわかりませんパイプライン。 –

+0

@saurabhagarwal私は、あなたがEMRで管理することはできないと信じています。 –

0

S3には、実際に空のフォルダを作成する方法はありません。 S3はオブジェクトストアなので、すべてがそこにあるオブジェクトです。 Hadoopをファイルシステムとして使用する場合、それらのオブジェクトを整理してファイルシステムツリーとして表示する必要があるため、オブジェクトをディレクトリとしてマークする特別なオブジェクトを作成します。 データファイルを保存するだけですが、これらのデータファイルをパスに整理することもできます。これにより、移動するフォルダと似た概念が作成されます。

フォルダを作成せず、必要なパスにファイルを配置すれば、それはうまくいくはずです。 S3でファイルを書き込む前にフォルダを作成する必要はありません。

また、これが役立つことがあります。 https://qubole.zendesk.com/hc/en-us/articles/213496246-How-To-Remove-Dir-marker-folders-in-S3-NativeFS-

+0

*「実際に空のフォルダを作成する方法はありません」*これは当てはまりません。フォルダが実際には存在しないのは本当ですが、キーが末尾にスラッシュで終わるオブジェクトは、コンソールによってフォルダとして解釈されます。残念なことに、Hadoopはこの不公平な '_ $ folder $'構造体を完全に不必要に使用します。これは '/'だけを使うことができるためです。これは、コンソールに "フォルダを作成"するときに起こります。 –

+0

@ Michael-sqlbot S3については真ですが、バケツとキーだけがあります。しかし、いくつかのツールは、オブジェクト名の/ sを解釈することによってフォルダを模倣することができます。 Amazon S3コンソールは、オブジェクトをグループ化する手段としてフォルダ概念をサポートしています。バケットエクスプローラーもそうです。ここをクリックしてください:http://www.bucketexplorer.com/documentation/amazon-s3--how-to-create-a-folder.html – leftjoin

+0

Hadoop s3nクライアントは、歴史的な理由から$ folder $マーカーを使用します。もともとあなたは "/"を使うことができなかったと思います。新しいS3aクライアントは "/"を使用します。それはリスト内の$ folder $ファイルを無視します。 Amazon EMRのS3コネクタは独自のコードで、まだ$ folder $を使用しているようです。彼らの決定。 –

0

この問題を解決するには、以下のスクリプトをEMRブートストラップアクションで使用してください。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 
関連する問題