【Bash】Error: Could not find or load main class org.apache.hadoop.fs.FsShell
问题
写了一段代码,发现报错,不能执行脚本
报错内容:
Error: Could not find or load main class org.apache.hadoop.fs.FsShell
原始代码
function step_hdfs() {
echo "Step 3 + 4: 上传到 HDFS 并设置权限..."
su - hue -c "bash -c '
export HADOOP_PROXY_USER=hdfs
export HADOOP_CONF_DIR=/usr/local/spark/conf
export HADOOP_CLIENT_OPTS=\"-Dlog4j.configuration=file:/etc/hadoop/conf/log4j.properties\"
hdfs dfs -put -f \"$LOCAL_FILE\" \"$HDFS_PATH\" || exit 1
hdfs dfs -chmod 644 \"$HDFS_PATH/$LOCAL_FILE\" || exit 1
'" || { echo "HDFS 操作失败"; exit 1; }
}
分析1:
hdfs 命令本质上是一个脚本,它需要环境变量,需要 /bin/bash 去执行,怀疑应当使用 su - hue -c 改成 su - hue bash -c
GPT回答说需要检查:
你可以确认 hue 用户的默认 shell 是不是 bash:
grep hue /etc/passwd
如果不是 /bin/bash,那 su - hue -c 就不会用 bash,这就是出错的根本原因之一。
事实:默认shell就是 /bin/bash
分析2
GPT说:
既然你:
✅ 使用了 su - hue bash -c;
✅ 打印的 hadoop classpath 是正确的;
❌ 仍然遇到 Error: Could not find or load main class org.apache.hadoop.fs.FsShell;
那么我们可以高度怀疑:HADOOP_CLIENT_OPTS 设置方式有问题,或环境变量顺序/污染导致 Hadoop 启动类找不到 FsShell。
🧠 背景:hdfs dfs 实际是执行 Java 类 org.apache.hadoop.fs.FsShell,它依赖:
正确的 CLASSPATH;
正确的 HADOOP_CLIENT_OPTS;
启动时没有污染的环境。
事实:HADOOP_CONF_DIR 确实影响了HADOOP的环境。
结论
原因找到了 HADOOP_CONF_DIR 这行变量指定的目录下没有 hadoop-env.sh
很好!你找到问题核心了 ✅:
🎯 根本原因:
HADOOP_CONF_DIR 下缺少 hadoop-env.sh,导致:
Hadoop 启动脚本(如 hdfs, yarn, mapred)执行时,未加载关键环境变量配置,比如:
JAVA_HOME
HADOOP_HEAPSIZE
HADOOP_CLIENT_OPTS(默认设置)
以及 shell function/classpath 处理
于是 hdfs dfs 最终无法定位主类 org.apache.hadoop.fs.FsShell,报:
Error: Could not find or load main class org.apache.hadoop.fs.FsShell

浙公网安备 33010602011771号