【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

posted @ 2025-06-30 18:24  一杯半盏  阅读(45)  评论(0)    收藏  举报