SparkのSpark Web UI
(localhost:4040)だけが何故か接続できなかったので、色々調べていたのですが解決策が乗っておらず、慣れていない人であれば同じ悩みを抱えている人がいると思ったので、初投稿します。また業務中に起きたエラーのため、コードなどは一切載せていませんのでご理解のほどよろしくお願いいたします。
環境
DockerでPythonのコンテナとSparkのコンテナ(wokerを接続している)をBridgeしている
どちらの環境にもPyspark
、java
の環境がインストールされている。
環境構築の参考
SparkのMaster1つとWorker1つをdocker-composeで上げてpysparkを動かすまで
https://qiita.com/hrkt/items/fe9b1162f7a08a07e812
ゴール
PythonのDockerの中に入って(docker exec...) spark-submitを行い、処理を行っている間にlocalhost:4040に接続してWebUIを確認したい。
問題について
起動してからlocalhost:8080はつながるのになぜか4040は接続ができない
解決策
- Sparkが処理中時にのみlocalhost:4040にアクセスできる
- docker-compose.ymlのSparkのコンテナにport 4040:4040と書いていたが、Job管理をするPython側にport 4040:4040を書く必要があった。(今回はこれが該当)
まとめ
StackOverFlowなどを読んでも全く分からなかったが、先輩に聞いたら一発で解決した。インフラにもっと強くなりたいです。
おまけ
sparkの中でサンプルコードを動かしていたが、df.show()
すると
initial job has not accepted any resources; check your cluster ui to ensure that workers are registered and have sufficient resources
と出て止まってしまう。リソースが足りないとのことで、メモリ設定などを変えたが解決しなかった。
サンプルコードはこちらから借りてきました。
PySpark のスクリプトファイルで引数を扱う
https://blog.amedama.jp/entry/2018/03/17/113516
参考にしたサンプルコード
from pyspark import SparkConf
from pyspark import SparkContext
from pyspark.sql import SparkSession
def main():
conf = SparkConf()
conf.setAppName('example')
sc = SparkContext(conf=conf)
spark = SparkSession(sc)
df = spark.sql('SELECT "Hello, World!" AS message')
df.show()
解決策
conf = SparkConf().setMaster('local')