所以我在我的机器上安装了Hadoop文件系统,并且我使用maven依赖来提供我的代码spark环境。 (火花mllib_2.10) 现在,我的代码使用spark mllib。并使用此代码从Hadoop文件系统访问数据。
String finalData = ProjectProperties.hadoopBasePath + ProjectProperties.finalDataPath;
JavaRDD<LabeledPoint> data = MLUtils.loadLibSVMFile(jsc.sc(), finalData).toJavaRDD();
设置以下属性。
finalDataPath = /data/finalInput.txt
hadoopBasePath = hdfs://127.0.0.1:54310
我通过命令
在外部启动dfs节点start-dfs.sh
现在,从eclipse运行时,我的代码运行得非常好。但是,如果我将整个代码导出到可执行jar,它会给我以下异常。
Exception in thread "main" java.io.IOException: No FileSystem for scheme: hdfs
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2421)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2428)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:88)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2467)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2449)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:367)
at org.apache.hadoop.fs.Path.getFileSystem(Path.java:287)
at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:221)
at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:270)
我还在线检查了针对此问题的不同解决方案,其中有人要求我添加以下
hadoopConfig.set("fs.hdfs.impl",
org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()
);
hadoopConfig.set("fs.file.impl",
org.apache.hadoop.fs.LocalFileSystem.class.getName()
);
OR
<property>
<name>fs.file.impl</name>
<value>org.apache.hadoop.fs.LocalFileSystem</value>
<description>The FileSystem for file: uris.</description>
</property>
<property>
<name>fs.hdfs.impl</name>
<value>org.apache.hadoop.hdfs.DistributedFileSystem</value>
<description>The FileSystem for hdfs: uris.</description>
</property>
但是我没有在我的项目中使用任何Hadoop上下文或hadoop配置。只需使用URL从Hadoop加载数据。
有人可以给出与此问题相关的答案吗? 请注意,这完全适用于Eclipse。如果我将同一个项目导出为可执行的Jar,那么它才起作用。
更新 正如评论和网上发现的解决方案所示,我尝试了两件事。
hadoop-core
,hadoop-hdfs
和hadoop-client
库添加了依赖项。但是仍然没有运气来解决错误。在我的机器上本地提供相同的问题以及我尝试过的其中一台远程机器。
我也使用上面提到的链接在我的机器上安装了hadoop。