EMR中以Docker为YARN容器运行时,如何使用PySpark Shell与Zeppelin?
问题场景
在EMR环境中,使用Docker作为YARN容器运行Spark集群任务时,提交任务的spark-submit命令可正常调用指定Docker镜像:
spark-submit --deploy-mode cluster \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ recipe.py
但使用以下命令启动PySpark Shell时,无法找到Docker镜像中安装的Python库:
PYSPARK_PYTHON=ipython \ PYSPARK_DRIVER_PYTHON=ipython \ pyspark \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME
问题原因
PySpark Shell默认以client模式启动,Driver进程运行在执行pyspark命令的本地节点,而非YARN调度的Docker容器内。此时Driver使用的是本地节点的Python环境,而非指定的Docker镜像环境,因此无法读取镜像中安装的库。
解决方法
方法1:让Driver也运行在Docker容器中(推荐)
启动PySpark Shell时,添加Driver相关的Docker环境配置,并指定--deploy-mode cluster让Driver由YARN调度到Docker容器中:
PYSPARK_PYTHON=ipython \ PYSPARK_DRIVER_PYTHON=ipython \ pyspark \ --deploy-mode cluster \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.driverEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.driverEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME
注意:cluster模式下Driver运行在集群节点的Docker容器中,需通过YARN Web UI查看Driver的地址和端口,再通过端口转发等方式连接到交互式Shell。
方法2:在本地节点同步镜像内的Python库
如果不需要Driver运行在Docker中,可直接在执行pyspark命令的本地节点,安装与Docker镜像内完全相同版本的Python库,确保Driver和Executor的环境一致。
方法3:配置Zeppelin使用Docker容器运行Interpreter
若使用Zeppelin,需在Spark Interpreter配置中添加以下参数:
spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE=dockerspark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAMEspark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=dockerspark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAMEspark.driverEnv.YARN_CONTAINER_RUNTIME_TYPE=dockerspark.driverEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME
同时将Zeppelin的Spark Interpreter的deploy-mode设置为cluster,确保Interpreter进程运行在Docker容器中。
内容的提问来源于stack exchange,提问作者kellanburket
相关产品推荐
相关产品推荐

