EMRクラスターの起動とSpackシェル実行
1.ローカルから接続
(1)EMRクラスター起動に失敗
・原因:EMRは利用できるインスタンスタイプが限定されている。
・解決策
AWSの東京リージョン(ap-northeast-1)で利用可能で、EMR(Amazon Elastic MapReduce)のSparkで利用できるコストの安いインスタンスタイプは、主に以下のものがあります。EMRのSparkで使用する場合、メモリとCPUのバランスが重要ですので、コストと性能のバランスを考慮した選択が求められます。
(参考)コストが安いEMR対応のインスタンスタイプ
m5 インスタンス
タイプ: m5.large, m5.xlarge
特徴: 汎用のインスタンスタイプで、CPUとメモリのバランスが良く、コストパフォーマンスが高い。EMRクラスタのマスターノードやコアノードとしてもよく使われます。
用途: 小〜中規模のSparkジョブに適しており、コストを抑えつつ性能を確保したい場合に最適です。
m5a インスタンス
タイプ: m5a.large, m5a.xlarge
特徴: m5インスタンスのAMDプロセッサバージョンで、同様の性能を提供しつつ、わずかに低いコストで利用可能です。
用途: m5インスタンスと同様に汎用用途で利用でき、コストをさらに抑えたい場合に有効です。
r5 インスタンス
タイプ: r5.large, r5.xlarge
特徴: メモリ最適化されたインスタンスタイプで、Sparkジョブがメモリを多用する場合に適しています。より大きなメモリ容量を必要とするワークロードに対応。
用途: データフレーム操作や大規模なデータセットを扱うSparkジョブで、性能を優先しつつコストも抑えたい場合。
t3 インスタンス
タイプ: t3.medium, t3.large
特徴: バースト可能な汎用インスタンスで、軽量なワークロードや開発・テスト環境に適しています。ただし、EMRのSparkで大規模なプロダクションワークロードにはあまり向いていません。
用途: 開発およびテスト環境や、小規模なバッチ処理においてコストを最小限に抑える場合。
(2)The EC2 Security Groups [sg-0c010fce809502f79] contain one or more ingress rules to ports other than [22] which allow public access.
・原因:このエラーメッセージは、Amazon EMR(Elastic MapReduce)クラスタを起動しようとした際に、指定したEC2セキュリティグループが22番ポート以外のポートでパブリックアクセスを許可していることを示しています。セキュリティの観点から、EMRはクラスタの起動時にセキュリティグループが安全であることを確認し、パブリックアクセスが許可されているポートに対して警告を出します。
・解決策:22番ポートのみ許可するセキュリティグループを利用すると(3)になる
(3)Amazon EC2 permissions error when configuring required rules on securityGroup sg-0fa230fd55ff89ec8
・原因:
1.IAMポリシーの権限不足: クラスターを作成するIAMユーザーまたはロールに、EC2セキュリティグループの変更(例:追加、削除、更新)に必要な権限がない。
2.セキュリティグループ設定の競合: 指定したセキュリティグループに対して、EMRクラスターが必要とするルールを設定できない状態にある(既に競合するルールが存在するなど)。
3.セキュリティグループのリージョン不一致: EMRクラスターのリージョンとセキュリティグループのリージョンが一致していない場合。
・解決策:デフォルトっぽいセキュリティグループ(ElasticMapReduce-master)で起動した後に、AWSコンソールでEC2サービスに移動し、クラスタのセキュリティグループを編集して、インバウンドルールでポート22を許可します。
(4)Service role arn:aws:iam::527072227173:role/service-role/AmazonEMR-ServiceRole-20240824T140930 has insufficient EC2 permissions
・原因:Amazon EMR クラスターを作成または操作するためには、EMR サービスロールに特定の EC2 権限が必要です。このエラーは、サービスロールに必要な EC2 のアクション(例:ec2:DescribeInstances や ec2:CreateTags など)へのアクセスが不足していることを示しています。
・解決策:サブネットをaではなくdに戻したら作成できた
(5)TeraTermから接続する際、「認証に失敗しました。」となる
・原因:ユーザー名をpemキーのユーザーにしていた。
・解決策:ユーザー名を”hadoop”とする。
2.ローカルからコマンドを実行
コマンド:scala> sc.textFile("s3://embulk-sample/embulk.txt").flatMap(.split(" ").map(word => (word,1))).reduceByKey(+_).saveAsTextFile("s3://embulk-sample/embulk_spark.txt")
(6)java.io.IOException:
com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception:
User: arn:xxx///role/EC2InstanceProfileForImageBuilder/xxxxx is not authorized to perform: s3:ListBucket on resource: "arn:aws:s3" because no identity-based policy allows the s3:ListBucket action (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: xxx; S3 Extended Reque
・原因
①EC2からS3へアクセスする権限がない
←②Amazon EMR の EC2 インスタンスプロファイルで指定したロールが権限不足
・解決策
ロールを変える。または、ロールにポリシーを追加する。
(7)java.io.IOException: All datanodes [...] are bad. Aborting...
・原因
EC2、クラスターノードを減らした直後だった
・解決策
①時間が経ってから実行
②活きているノードで実行できたかもしれないのでS3を確認してみる
(8)org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory s3://embulk-sample/embulk_spark.txt already exists
・原因:すでにファイルがある
・解決策:なし((7)時点で作成できていた)