Apache Drill启动失败:出现NoClassDefFoundError - org.apache.hadoop.security.SecurityUtil错误
我之前配置Drill对接MinIO的时候也碰到过一模一样的错误,折腾了好半天才搞定。这个错误本质是Drill在初始化Hadoop安全组件时找不到必要的类,或者Hadoop的配置没搭对,给你几个亲测有效的排查和解决方向:
检查Hadoop依赖包是否完整
Drill对接S3/MinIO依赖Hadoop的核心类库,你得确保$DRILL_HOME/jars/3rdparty目录下有hadoop-common-*.jar和hadoop-auth-*.jar这两个关键包。如果是从官网下载的Drill二进制包,有些轻量版本可能默认没带全这些依赖,这时候可以从你的Hadoop安装目录(或者对应版本的Hadoop包)里把这两个jar复制到Drill的3rdparty目录下就行。配置正确的
core-site.xml文件
这个是我当时踩的坑!Drill启动时会加载Hadoop的配置,你需要在$DRILL_HOME/conf目录下创建或修改core-site.xml,补充MinIO的连接参数和安全认证配置,比如:<configuration> <property> <name>fs.s3a.endpoint</name> <value>http://你的MinIO地址:9000</value> </property> <property> <name>fs.s3a.access.key</name> <value>你的MinIO访问密钥</value> </property> <property> <name>fs.s3a.secret.key</name> <value>你的MinIO秘密密钥</value> </property> <property> <name>hadoop.security.authentication</name> <value>simple</value> </property> </configuration>重点是
hadoop.security.authentication设为simple,MinIO默认用简单认证,不设置这个的话,SecurityUtil会尝试初始化Kerberos相关的组件,直接就崩了。在
drill-env.sh中指定Hadoop环境
打开$DRILL_HOME/conf/drill-env.sh,添加Hadoop相关的环境变量,让Drill能正确找到Hadoop的配置和依赖:export HADOOP_HOME=/你的Hadoop安装路径 export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop如果没装完整的Hadoop,也可以把
HADOOP_CONF_DIR指向Drill的conf目录,这样Drill会用你刚才配置的core-site.xml。验证依赖类是否存在
要是你不确定依赖包有没有问题,可以用jar命令检查hadoop-common包是否包含目标类:jar tf $DRILL_HOME/jars/3rdparty/hadoop-common-*.jar | grep org/apache/hadoop/security/SecurityUtil.class如果输出里能看到这个类的路径,说明依赖没问题,重点排查配置;要是没输出,就是jar包缺失或者版本不对,换个对应版本的Hadoop common jar就行。
我当时就是漏了core-site.xml里的安全认证配置,加上之后Drill就顺利启动,还能正常访问MinIO里的数据了。
内容来源于stack exchange

