特に何も設定せずにEMRのSparkを使うと、ログレベルがINFOなので、とにかくいっぱいログが出ます。
そのため、ログレベルを変更しようと思ったわけですが、クラスタ作成時に設定しておきたいなと思ったのでやってみたメモです。
検証環境
emr-5.32.0 Spark 2.4.7
案1 ブートストラップアクションを使う(失敗)
当初考えていたのは、ブートストラップアクションでの設定でした。
下記のようなスクリプトを書きました。
#!/usr/bin/bash log4j_path=/usr/lib/spark/conf/log4j.properties # マスタノードにのみlog4j.propertiesが存在するため、 # 存在する場合のみ書き換えを実施 if [ ! -e ${log4j_path} ]; then echo "log4j.properties is not found." else sudo sed -i s/log4j.rootCategory=INFO/log4j.rootCategory=WARN/ ${log4j_path} echo "log4j.properties was changed." fi
sedについては、下記の記事の内容を参考にしました。
上記の方法ですが、失敗しました。下記の通り、ブートストラップアクションはSparkのインストールより前に実行されるためです。
(スクリプト実行時点でlog4j.propertiesは存在しないわけで...調査不足でした)
2.Amazon EMR を実行するブートストラップアクション各インスタンスで指定する。ブートストラップアクションを使用してカスタムアプリケーションをインストールし、必要なカスタマイズを実行できます。詳細については、「追加のソフトウェアをインストールするためのブートストラップアクションの作成」を参照してください。このフェーズの間、クラスターの状態は BOOTSTRAPPING です。
3.Amazon EMR は、Hive、Hadoop、Spark など、クラスターの作成時に指定するネイティブアプリケーションをインストールします。
案2 「ソフトウェア設定の編集」にて設定(成功)
起動時に設定する方法として、「ソフトウェア設定の編集」もあるため、そちらを使って設定を行いました。
spark-log4j— 値を設定します。log4j.propertiesファイルを開きます。設定と詳細については Github の log4j.properties.template ファイルをご覧ください。
実際に記載したJSONが以下です。
[ ...(その他の設定) { "classification": "spark-log4j", "properties": { "log4j.rootCategory":"WARN,console" }, "configurations": [] }, ...(その他の設定) ]
案2での設定反映確認
WARN以上のメッセージのみが表示されることを確認しました。
# log4j.propertiesの確認 [hadoop@ip-192-168-2-9 ~]$ cat /usr/lib/spark/conf/log4j.properties | grep log4j.root log4j.rootCategory=WARN,console # spark-sqlでの確認 # それなりに表示はされるが、INFOよりもずいぶん減った [hadoop@ip-192-168-2-9 ~]$ spark-sql ... 21/05/25 15:46:34 WARN HiveConf: HiveConf of name hive.server2.thrift.url does not exist 21/05/25 15:46:36 WARN CredentialsLegacyConfigLocationProvider: Found the legacy config profiles file at [/home/hadoop/.aws/config]. Please move it to the latest default location [~/.aws/credentials]. ... Spark master: yarn, Application Id: application_1621957493777_0001 spark-sql>