我们发现时常在用户邮件列表上会出现一个有关作业失败的问题,这个失败伴随着错误消息“java.lang.ClassNotFoundException:Class alluxio.hadoop.FileSystemnot found”。这篇博客分析解释了这种失败的原因以及发生该问题时的解决方案。
为什么会发生这个错误?
这个错误说明Alluxio客户端在运行时不可用。当作业尝试访问Alluxio文件系统但没能找到Alluxio客户端的实现以连接到对应的服务时,就会导致异常。
Alluxio客户端是一个Java包,它定义了alluxio.hadoop.FileSystem类,以便根据用户请求调用Alluxio服务(例如,创建文件、列出目录内容等)。它通常被预编译成一个名为alluxio-1.8.1-client.jar(对于v1.8.1而言)的jar文件,并与Alluxio压缩包一起发布。为了能够与应用程序协作,Alluxio客户端jar文件应该位于JVM的classpath中。如果应用程序无法在classpath中找到这个文件,它就不知道类alluxio.hadoop.FileSystem的实现,因此会抛出异常。
如何解决这个问题?
该问题的解决方案就是确保Alluxio客户端jar在应用程序的classpath中。在故障排除时有几个因素应当考虑。
如果应用程序分布在多个节点上,那么应该将这个jar分发给其中每一个节点。根据计算框架的不同,具体的配置方法可能有很大差异:
-
对于MapReduce或YARN应用程序,可以将Alluxio客户端jar的路径加到mapreduce.application.classpath或yarn.application.classpath以确保每个任务都能找到它。除此之外,你也可以将这个路径作为-libjars的参数,如下所示:
取决于Hadoop的发行版,设置$HADOOP_CLASSPATH也可能有用:
-
对于Spark应用程序,在每个Spark运行节点上的spark/conf/spark-defaults.conf文件中添加如下设置,并重启长期运行的Spark服务器进程:
-
对于Hive,在conf/hive-env.sh文件中设置环境变量HIVE_AUX_JARS_PATH:
在某些情况下,一个计算引擎依赖于另一个计算引擎。例如,Hive服务可以使用MapReduce作为分布式查询的引擎。在这种情况下,必须为Hive和MapReduce两者分别都设置classpath才能正确配置。
总结
-
对于使用Alluxio的应用程序,它们必须将Alluxio客户端jar文件加入其classpath中。
-
如何将Alluxio客户端jar文件配置到classpath可以根据计算框架的具体情况进行具体分析。