rainit2006 / BigData-DB-SearchEngine

0 stars 0 forks source link

EMR #4

Open rainit2006 opened 7 years ago

rainit2006 commented 7 years ago

教程 http://gihyo.jp/dev/serial/01/emr

EMR起動方法:Web ConsoleとAPIの違い Webコンソールは,1回の操作でJobを1つしか実行できません。 一方APIを使用すると,1回の起動で複数のJobを実行できます。 EMRで使用できるAPIは言語ごとにいくつか用意されています: C#, Java、PHPなど。

Web Consoleでデバッグモードを使用するには: Web Consoleでは,Jobを作成する際にデバッグモードを使用するように設定しておく必要があります。 Java SDKでデバッグするには: RunJobFlowRequestに渡すパラメータとして,デバッグ用のステップコンフィグを定義します。

bootstrap Amazon Elastic Mapreduce(EMR)では,起動時にHadoopのオプションなどを設定できるbootstrapというものが用意されています。うまく利用すれば,細かくHadoopのチューニングをしたり,Jobが起動する前に前処理を行ったりすることができます。

Amazon Elastic MapReduceのパフォーマンスを引き出すためのHadoopの基礎知識

  1. Hadoopを使用する際は,サイズが小さいファイルを複数用意するよりも,大きいファイル(GB以上)を扱う方が効率的です
  2. Map: splitという単位で分散され,ユーザが特に意識することはない Reduce: 実際にReduceさせる数をユーザが指定する。デフォルト値は1(1つしかReduceが起動されない)

Map数はsplitという単位で分散されると前述しましたが,splitの単位はユーザが設定することができます。具体的には以下の2つの方法があります。 ①mapred-site.xmlに下記のように記述する

mapred.min.split.size:最小splitサイズ
mapred.max.split.size:最大splitサイズ

②コード中で指定する(以下はJavaの場合)

FileInputFormat.setMinInputSplitSize(job, minSize);
FileInputFormat.setMaxInputSplitSize(job, minSize);

何も指定しないのであれば,デフォルトは「HDFSブロックサイズ=splitサイズ」となります。 デフォルトでは「HDFSのブロックサイズ=split数」です。EMRの場合はHDFSではなくS3を使用するので,「⁠S3のファイル数=split数」となってしまいます。

EMRでMap数を増やすには以下のようにすることをお勧めします。

  1. mapred-site.xmlに適切なsplit値を設定し,bootstrapでEMRを設定する。Javaなどのコードであれば,InputFormatで適切なsplit値を設定する
  2. 大きいファイルであれば,S3に上げるときに,HDFSと同様,ブロックとしてファイルを細かく分ける.
rainit2006 commented 7 years ago

Pipeline

AWS Data Pipeline では、パイプラインでどのようなアクションを実行でき、どのリソースにアクセスできるかを IAM ロールで定義する必要があります。さらに、パイプラインで EC2 インスタンスや EMR クラスターなどのリソースを作成すると、IAM ロールによって、アプリケーションが実行できるアクションとアクセスできるリソースが決定します。 AWS Data Pipeline コンソールでは、次のロールが自動的に作成されます。 •DataPipelineDefaultRoleAWS Data Pipeline が AWS リソースにアクセスすることを許可 •DataPipelineDefaultResourceRole - EC2 インスタンス上のアプリケーションが AWS リソースにアクセスすることを許可