文档章节

HDFS API文件上传,fs.default.name配置的关键性

hiqj
 hiqj
发布于 2014/08/12 15:57
字数 1354
阅读 786
收藏 0
Exception in thread "main" java.lang.IllegalArgumentException: Wrong FS: hdfs://master:9000/index.html, expected: 
file:///

 at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:390)

 at org.apache.hadoop.fs.RawLocalFileSystem.pathToFile(RawLocalFileSystem.java:55)

 at org.apache.hadoop.fs.LocalFileSystem.pathToFile(LocalFileSystem.java:61)

 at org.apache.hadoop.fs.LocalFileSystem.exists(LocalFileSystem.java:51)

 at org.apache.hadoop.fs.FileUtil.checkDest(FileUtil.java:355)

 at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:211)

 at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:163)

 at org.apache.hadoop.fs.LocalFileSystem.copyFromLocalFile(LocalFileSystem.java:67)

 at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:1178)

 at com.lango.mapreduce.example.chainmapper.Test.fsCopy(Test.java:32)

 at com.lango.mapreduce.example.chainmapper.Test.main(Test.java:25)

1、Wrong FS: hdfs://master:9000/index.html, expected: file:///

a、解决方案:复制core-site.xml和hdfs-site.xml到当前工程下

因为是访问远程的HDFS, 需要通过URI来获得FileSystem:

hadoop需要把集群上的core-site.xml和hdfs-site.xml放到当前工程下(eclipse工作目录的bin文件夹下面)

注意:

在我的Eclipse工作目录中没有找到bin文件夹。


网上资料说“生成的class文件在项目目录中的bin目录下”,具体说法见下段参考资料:

生成的class文件在你的项目目录中的bin目录下,进入你的项目目录,可以看到一个.classpath文件,其中源文件地址,class文件存放地址,以及环境变量都是在这里面配置的,当然你可以通过myeclipse的界面配置,不过配置完成后都是修改的这个文件,<classpathentry kind="src" path="src"/>这个就是配置源文件存放地址,<classpathentry kind="lib" path="lib/activemq-console-4.1.1.jar"/>这些是将哪个目录的那个jar包导入到path中<classpathentry kind="output" path="classes"/>这个是生成的class文件存放到哪,其中目录可以为绝对目录,相对目录是相对当前目录来说的,也就是项目目录本身

所以,我觉得bin目录就是我目录结构中的build/classes文件。因此,拷贝core-site.xml和hdfs-site.xml到build/classes目录中。

再次运行之前的代码:

package com.lango.mapreduce.example.chainmapper;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class FsTest {
    public static void main(String[] args) throws IOException {
        
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);
        
        Path src = new Path("C:/Users/lango/Desktop/core-site.xml");
        Path dst = new Path("hdfs://master:9000/qj");
        
        fs.copyFromLocalFile(src, dst);
    }
}

运行通过。文件成功上传,问题解决。

2、问题引申:通过几种对文件操作方式的比较,来总结对于把文件上传到远程客户端什么是最关键的因素。

b、拷贝core-site.xml和hdfs-site.xml到当前工程下,修改目标路径形式为如下形式:

//注意和“Path dst = new Path("hdfs://master:9000/qj");”形式区分
Path dst = new Path("/qj");

整体代码如下:

package com.lango.mapreduce.example.chainmapper;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class CopyToHDFS {
    public static void main(String[] args) throws IOException {
        
        Configuration conf = new Configuration();
        
        FileSystem fs = FileSystem.get(conf);
        
        fs.copyFromLocalFile(new Path("/home/wqj/opt/140702152709log.txt"), new Path("/qj"));
        
    }
}

程序运行正常,文件上传成功。


c、不拷贝core-site.xml和hdfs-site.xml到当前工程下。配置

conf.set("fs.default.name", "hdfs://master:9000");

直接使用FileSystem类实现上传,代码如下:

package com.lango.mapreduce.example.chainmapper;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class CopyToHDFS {
    public static void main(String[] args) throws IOException {
        
        Configuration conf = new Configuration();
        conf.set("fs.default.name", "hdfs://master:9000");
        
        FileSystem fs = FileSystem.get(conf);
        
        fs.copyFromLocalFile(new Path("/home/wqj/opt/140702152709log.txt"), new Path("/qj"));
    }
}

运行通过,文件上传到远程HDFS上成功。


d、拷贝core-site.xml和hdfs-site.xml到当前工程下。直接使用FileSystem类实现上传,代码如下:

package com.lango.mapreduce.example.chainmapper;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.DistributedFileSystem;

public class FsTest {
    public static void main(String[] args) throws IOException {
        
        Configuration conf = new Configuration();

        FileSystem  fs = FileSystem.get(conf);
        
        fs.copyFromLocalFile(new Path("C:/Users/lango/Desktop/core-site.xml"), new Path("/qj-dfs"));
    }
}

运行通过,文件成功上传。


e、不拷贝core-site.xml和hdfs-site.xml到当前工程下。直接使用FileSystem类实现上传,代码和b完全相同。

和b做对比,有一个奇妙的现象。

我们上传的文件它并没有被上传到远程HDFS中,而是跑到本地Eclipse工作目录所在根目录E盘下了。并且可看见文件的存放形式:.qj.crc和qj。

Eclipse控制台输出日志信息如下:

八月 12, 2014 2:47:41 下午 org.apache.hadoop.util.NativeCodeLoader <clinit>
WARNING: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

运行通过,文件未成功上传到远程HDFS中,而是被上传到Eclipse工作目录所在根目录下了。


f、不拷贝core-site.xml和hdfs-site.xml到当前工程下。直接使用DistributedFileSystem类实现上传,代码如下:

package com.lango.mapreduce.example.chainmapper;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.DistributedFileSystem;

public class FsTest {
    public static void main(String[] args) throws IOException {
        
        Configuration conf = new Configuration();

        conf.set("fs.default.name", "hdfs://master:9000");
        DistributedFileSystem fs = (DistributedFileSystem) FileSystem.get(conf);
        
        Path src = new Path("C:/Users/lango/Desktop/core-site.xml");
        Path dst = new Path("/qj-dfs");
        
        fs.copyFromLocalFile(src, dst);
    }
}

运行通过,文件成功上传。


注意:在d中,若省略“

conf.set("fs.default.name", "hdfs://master:9000");

”则程序报错。报错信息

Exception in thread "main" java.lang.ClassCastException: org.apache.hadoop.fs.LocalFileSystem cannot be cast to org.apache.hadoop.hdfs.DistributedFileSystem
    at com.lango.mapreduce.example.chainmapper.FsTest.main(FsTest.java:16)

解决方案:拷贝core-site.xml和hdfs-site.xml到当前工程下。整体代码不改变,代码如下:

package com.lango.mapreduce.example.chainmapper;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.DistributedFileSystem;

public class FsTest {
    public static void main(String[] args) throws IOException {
        
        Configuration conf = new Configuration();

//        省略fs.default.name配置
//        conf.set("fs.default.name", "hdfs://master:9000");

        DistributedFileSystem fs = (DistributedFileSystem) FileSystem.get(conf);
        
        Path src = new Path("C:/Users/lango/Desktop/core-site.xml");
        
        Path dst = new Path("/qj-dfs");
        
        fs.copyFromLocalFile(src, dst);
    }
}

运行通过,文件上传成功。


通过上面一系列自己都觉得很晕的比较之后,感觉,无论怎么变,它们之间的最大区别就在于

fs.default.name属性的配置
conf.set("fs.default.name", "hdfs://master:9000");

综上所述:

无论我们是在代码中对"fs.default.name"进行配置,还是直接拷贝core-site.xml和hdfs-site.xml到当前工程下,最终我们的目的都是要实现对fs.default.name的配置。

只有对fs.default.name成功配置后,我们才能成功上传文件到远程客户端。


© 著作权归作者所有

hiqj
粉丝 24
博文 208
码字总数 92586
作品 0
渝北
程序员
私信 提问
HADOOP集群启动的一个报错问题,求大侠帮忙解释了啦

部署的话是一个namenode,两个datanode,一个secondarynamenode,部署的话用的是centos系统,防火墙已经关闭,selinux且是关闭的,ssh也可以直接不通过密码直接登陆, 但是启动时报如下错误,...

老佛爷
2013/03/22
465
1
hadoop配置文件详解、安装及相关操作

一、 Hadoop伪分布配置 1. 在conf/hadoop-env.sh文件中增加:export JAVA_HOME=/home/Java/jdk1.6 2. 在conf/core-site.xml文件中增加如下内容: <!-- fs.default.name - 这是一个描述集群中...

村长大神
2014/04/10
47
0
CentOS7安装配置hadoop0.20,附带虚拟机集成资源包

主要讲解hadoop的入门安装配置 环境为vmware11,CentOS 7,Hadoop 0.20.2,jdk1.8 这里解释下为什么用hadoop0.20.2,虽然最新版的hadoop性能上有了很大的提高,但是随之而来的bug也是明显增多...

奔跑的菜菜
2016/07/12
280
3
Hadoop初体验:快速搭建Hadoop伪分布式环境

0.前言 本文旨在使用一个全新安装好的Linux系统从0开始进行Hadoop伪分布式环境的搭建,以达到快速搭建的目的,从而体验Hadoop的魅力所在,为后面的继续学习提供基础环境。 对使用的系统环境作...

xpleaf
2017/08/30
0
0
Hadoop实战读书笔记(5)

HDFS文件操作 你可以把一个大数据集(100TB)在HDFS中存储为单个文件,而大多数其他的文件系统无力实现这一点。虽然该文件存在多个副本分布在多台机器上来支持并行处理,你也不必考虑这些细节...

祥林会跟你远走高飞
2014/12/08
95
0

没有更多内容

加载失败,请刷新页面

加载更多

MBTI助你成功,让你更了解你自己

MBTI助你成功,让你更了解你自己 生活总是一个七日接着又一个七日,相信看过第七日的小伙伴,很熟悉这段开场白,人生是一个测试接着又一个测试,上学的时候测试,是为了证明你的智力,可谓从...

蛤蟆丸子
今天
55
0
Android实现App版本自动更新

现在很多的App中都会有一个检查版本的功能。例如斗鱼TV App的设置界面下: 当我们点击检查更新的时候,就会向服务器发起版本检测的请求。一般的处理方式是:服务器返回的App版本与当前手机安...

shzwork
昨天
72
0
npm 发布webpack插件 webpack-html-cdn-plugin

初始化一个项目 npm init 切换到npm源 淘宝 npm config set registry https://registry.npm.taobao.org npm npm config set registry http://registry.npmjs.org 登录 npm login 登录状态......

阿豪boy
昨天
87
0
java基础(16)递归

一.说明 递归:方法内调用自己 public static void run1(){ //递归 run1(); } 二.入门: 三.执行流程: 四.无限循环:经常用 无限递归不要轻易使用,无限递归的终点是:栈内存溢出错误 五.递...

煌sir
昨天
63
0
REST接口设计规范总结

URI格式规范 URI中尽量使用连字符”-“代替下划线”_”的使用 URI中统一使用小写字母 URI中不要包含文件(脚本)的扩展名 URI命名规范 文档(Document)类型的资源用名词(短语)单数命名 集合(Co...

Treize
昨天
69
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部