在Amazon EMR 7.2+Apache Hudi环境启动Spark Shell遇权限拒绝问题
解决Amazon EMR 7.2 + Apache Hudi启动Spark Shell的权限拒绝问题
问题原因
报错核心信息:
org.apache.hadoop.security.AccessControlException: 权限拒绝:user=ec2-user, access=WRITE, inode="/user":hdfs:hdfsadmingroup:drwxr-xr-x
HDFS的/user目录权限为drwxr-xr-x,仅属主hdfs和组hdfsadmingroup拥有写权限。Spark初始化时需要在/user下创建用户专属工作目录(如/user/ec2-user),而ec2-user作为普通用户无写入权限,因此触发报错。
解决方案
方案1:切换到hdfs用户执行命令
hdfs用户拥有/user目录的写权限,切换后直接启动Spark Shell:
sudo su - hdfs spark-shell --jars /usr/lib/hudi/hudi-spark-bundle.jar \ --conf "spark.serializer=org.apache.spark.serializer.KryoSerializer" \ --conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog" \ --conf "spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension"
方案2:为ec2-user创建HDFS专属目录并授权
保持ec2-user身份,先创建自己的HDFS主目录并设置权限:
# 创建ec2-user的HDFS目录 hdfs dfs -mkdir /user/ec2-user # 赋予ec2-user完全控制权 hdfs dfs -chown ec2-user:ec2-user /user/ec2-user # 设置目录权限(按需调整) hdfs dfs -chmod 755 /user/ec2-user
完成后重新执行原Spark Shell启动命令即可。
方案3:指定Spark临时工作目录
通过配置指定一个所有用户有权写入的目录作为Spark工作目录,避免访问/user:
spark-shell --jars /usr/lib/hudi/hudi-spark-bundle.jar \ --conf "spark.serializer=org.apache.spark.serializer.KryoSerializer" \ --conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog" \ --conf "spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension" \ --conf "spark.local.dir=/tmp" \ --conf "spark.sql.warehouse.dir=hdfs:///tmp/ec2-user-warehouse"
注:/tmp目录默认开放所有用户写权限,也可替换为其他已授权的HDFS路径。
额外处理:消除Log4j警告
启动时的Log4j热补丁缺失警告不影响核心功能,若要消除,可在启动命令中添加配置关闭该功能:
--conf "spark.log4jHotPatch.enabled=false"
内容的提问来源于stack exchange,提问作者Albert T. Wong
相关产品推荐
相关产品推荐

