关于HDFS 通过java api进行访问的问题
请教各位高手:对于hadoop的HDFS文件系统,是不是可以通过socket容器(如tomcat)中的web程序(运用java api接口)进行访问吗?还是只能通过打包jar文件的方式,通过命令行的方式进行访问吗? HDFS提供多种访问方式。1.命令行的方式。(最直接的方式,只要你会安装Hadoop基本都会)
2.Java API的方式。(有专门的API函数,需要配置文件,可以在非Hadoop机器上访问,Xp系统也可以)
3.Thift的方式可以使用非Java语言访问HDFS。(比较复杂一点,需要现在Server段启动Thrift Server ,而后通过HDFS提供的各语言的API访问) 可以直接使用hadoop api读取HDFS上的数据,hadoop提供的eclipse插件就是这样做的,具体怎么用,你可以查一查。 回复 3# biansutao
是不是需要把hadoop的bin加到linux的环境变量中去吗?还是只需要修改hadoop中的配置文件吗? 服务器端,如果能运行的话什么都不用改,需要改的是客户端。 回复 5# biansutao
[*]Configuration config = new Configuration();
[*]FileSystem hdfs = FileSystem.get(config);
[*]LocalFileSystem hdfs = FileSystem.getLocal(config);
[*]Path srcPath = new Path(localSrc);//本地路径
[*]Path dstPath = new Path(dst);//hdfs系统路径(如:/user/wang/test)hdfs.copyFromLocalFile(srcPath, dstPath);复制代码
程序的思路:服务器端通过tomcat发布服务,通过浏览器访问该服务的上传文件功能,首先上传本地文件到服务器端,然后将服务器端的文件上传到HDFS系统中!本地上传到服务器已经解决,是服务器端的文件要通过以上的代码上传HDFS系统!
遇到的:config得不到hadoop的配置信息
弱弱的问一下,解决思路是否有吗?以上难题该如何解决!
跪求大师指点!!!!小弟已经困扰了一个多星期啦! 用户上传文件:
1.下图为文件上传的一个过程,用户通过Web的方式或其他方式比如客户端的方式,上传文件到一个临时存储中。
2.在建一个临时队列把上传上的文件通过队列的方式上传到Hadoop中。
用户下载文件:
1.用户通过URL发出指令给Web服务器,Web服务器通过用户提出的指令去Hadoop获取指定的文件最后返回给用户一个完成的文件。
备注:
为什么使用队列 吗?
使用队列避免用户上传的延时,用户只要把文件上传到临时服务器就立即返回,后台到Hadoop的过程完全异步。
fs.default.name
hdfs://hadoop59:9000
把以上的XML文件命令为core-site.xml 文件放到你自己的src目录下。
添加必须的Jar包,如果不知道添加哪个可以全部添加,Hadoop lib 目录下的和 Hadoop根目录下的jar文件。 回复 7# biansutao
谢大侠以上的回答 真的很全面!
[*] Configuration config = new Configuration(false);
[*] config.set("fs.default.name","hdfs://192.168.200.135:9000");复制代码
通过以上方式设置了config,但还是出现以下错误:
java.io.IOException: No FileSystem for scheme: hdfs
似乎还是没连上,是不是除了"fs.default.name",还需要设置其他属性吗?吗?吗? 不要写在文件中,写在配置文件中。
Configuration config = new Configuration(true);
config.set("fs.default.name","hdfs://192.168.200.135:9000"); //去掉这句。 或者如果你想在不写配置文件
Configuration config = new Configuration(true);
config.set("fs.default.name","hdfs://192.168.200.135:9000");
可以这样写,但是 Configuration config = new Configuration(false); 不要用false 。
使用false就会加载默认配置文件。
出错地点在:
private static FileSystem createFileSystem(URI uri, Configuration conf
) throws IOException {
Class clazz = conf.getClass("fs." + uri.getScheme() + ".impl", null);// 这个因为没有加载默认的配置文件为空,所以下边在判断的时候就出错了。
if (clazz == null) {
throw new IOException("No FileSystem for scheme: " + uri.getScheme());
}
FileSystem fs = (FileSystem)ReflectionUtils.newInstance(clazz, conf);
fs.initialize(uri, conf);
return fs;
}
package org.apache.hadoop.fs.FileSystem 文件中。