您的位置:

hdfs的java程序(java访问hdfs)

本文目录一览:

如何用java程序把本地文件拷贝到hdfs上并显示进度

把程序打成jar包放到Linux上

转到目录下执行命令 hadoop jar mapreducer.jar /home/clq/export/java/count.jar hdfs://ubuntu:9000/out06/count/

上面一个是本地文件,一个是上传hdfs位置

成功后出现:打印出来,你所要打印的字符。

package com.clq.hdfs;

import java.io.BufferedInputStream;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.URI;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataOutputStream;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IOUtils;

import org.apache.hadoop.util.Progressable;

public class FileCopyWithProgress {

//********************************

//把本地的一个文件拷贝到hdfs上

//********************************

public static void main(String[] args) throws IOException {

String localSrc = args[0];

String dst = args[1];

InputStream in = new BufferedInputStream(new FileInputStream(localSrc));

Configuration conf = new Configuration();

FileSystem fs = FileSystem.get(URI.create(dst), conf);

FSDataOutputStream out = fs.create(new Path(dst), new Progressable() {

@Override

public void progress() {

System.out.print(".");

}

});

IOUtils.copyBytes(in, out, conf, true);

}

}

可能出现异常:

Exception in thread "main" org.apache.hadoop.ipc.RemoteException: java.io.IOException: Cannot create /out06; already exists as a directory

at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInternal(FSNamesystem.java:1569)

at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:1527)

at org.apache.hadoop.hdfs.server.namenode.NameNode.create(NameNode.java:710)

at org.apache.hadoop.hdfs.server.namenode.NameNode.create(NameNode.java:689)

at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:587)

at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1432)

at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1428)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAs(Subject.java:415)

说明你这个路径在hdfs上已经存在,换一个即可。

关于用java写程序把本地文件上传到HDFS中的问题

将这FileSystem hdfs = FileSystem.get(config);

改成FileSystem hdfs = FileSystem.get(URI.create("hdfs://master:9000"),config)

上面那句取得的是本地文件系统对象,改成下面这个才是取得hdfs文件系统对象,当你要操作本地文件对象的时候就要用上面那句取得本地文件对象,我在2.7.4刚开始也是跟你一样的错误,改为下面的就可以了

如何使用Java API读写HDFS

//流读入和写入

InputStream in=null;

//获取HDFS的conf

//读取HDFS上的文件系统

FileSystem hdfs=FileSystem.get(conf);

//使用缓冲流,进行按行读取的功能

BufferedReader buff=null;

//获取日志文件的根目录

Path listf =new Path("hdfs://10.2.143.5:9090/root/myfile/");

//获取根目录下的所有2级子文件目录

FileStatus stats[]=hdfs.listStatus(listf);

//自定义j,方便查看插入信息

int j=0;

for(int i = 0; i stats.length; i++){

//获取子目录下的文件路径

FileStatus temp[]=hdfs.listStatus(new Path(stats[i].getPath().toString()));

for(int k = 0; k temp.length;k++){

System.out.println("文件路径名:"+temp[k].getPath().toString());

//获取Path

Path p=new Path(temp[k].getPath().toString());

//打开文件流

in=hdfs.open(p);

//BufferedReader包装一个流

buff=new BufferedReader(new InputStreamReader(in));

String str=null;

while((str=buff.readLine())!=null){

System.out.println(str);

}

buff.close();

in.close();

}

Java程序访问不了HDFS下的文件,报缺失块的异常,请高手解决一下

现在我们来深入了解一下Hadoop的FileSystem类。这个类是用来跟Hadoop的文件系统进行交互的。虽然我们这里主要是针对HDFS,但是我们还是应该让我们的代码只使用抽象类FileSystem,这样我们的代码就可以跟任何一个Hadoop的文件系统交互了。在写测试代码时,我们可以用本地文件系统测试,部署时使用HDFS,只需配置一下,不需要修改代码了。

在Hadoop 1.x以后的版本中引入了一个新的文件系统接口叫FileContext,一个FileContext实例可以处理多种文件系统,而且接口更加清晰和统一。