HDFS是存取数据的分布式文件系统,HDFS文件操作常有两种方式。
一种是命令行方式,即Hadoop提供了一套与Linux文件命令类似的命令行工具。
另一种是JavaAPI,即利用Hadoop的Java库,采用编程的方式操作HDFS的文件。
新建maven项目,添加hadoop相关jar包
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
2.1文件下载
Java代码实现:从HDFS文件系统复制文件到本地。
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
public class hdfs{
public static void main(String[] args) throws IOException, URISyntaxException {
// 获得FileSystem对象
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.0.0:9000"), new Configuration());
// 调用open方法进行下载,参数HDFS路径
InputStream in = fileSystem.open(new Path("/a.txt"));
// 创建输出流,参数指定文件输出地址
OutputStream out = new FileOutputStream("F://3.txt");
// 使用Hadoop提供的IOUtils,将in的内容copy到out,设置buffSize大小,是否关闭流设置true
IOUtils.copyBytes(in, out, 4096, true);
}
}
其中hadoop配置如下core-site.xml
而在/etc/hosts也增加上ip
执行该程序就完成了将文件下载到本地.
2.2文件上传
Java代码实现:从本地文件上传到HDFS文件服务器上。
public class UpLoadDemo {
public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
// 获得FileSystem对象,指定使用root用户上传
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.0.0:9000"), new Configuration(), "root");
// 创建输入流,参数指定文件输出地址
InputStream in = new FileInputStream("F:\\3.txt");
// 调用create方法指定文件上传,参数HDFS上传路径
OutputStream out = fileSystem.create(new Path("/"));
// 使用Hadoop提供的IOUtils,将in的内容copy到out,设置buffSize大小,是否关闭流设置true
IOUtils.copyBytes(in, out, 4096, true);
}
}
这里可能会遇上权限问题报错如下
Exception in thread "main" org.apache.hadoop.security.AccessControlException:
Permission denied: user=xxx, access=WRITE, inode="/":root:supergroup:drwxr-xr-x
解决方案:
方案一:
将对应的目录设置最大权限777
hadoop fs -chmod 777 /
ps:相对便捷的一个方案
方案二:
在win7系统的环境变量或java JVM变量里面添加 HADOOP_USER_NAME,值为运行HADOOP上的Linux的用户名。在Eclipse里面运行,修改完环境变量后,需要重启一下eclipse,不然可能不会生效。
ps:推荐使用的方案
方案三:
将当前系统的帐号名称修改为运行HADOOP上的Linux的用户名。
2.3删除文件
Java代码实现:删除HDFS文件服务器上的文件
public class Delete {
public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
// 获得FileSystem对象
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.0.0:9000"), new Configuration(), "root");
// 调用delete方法,删除指定的文件。参数:false:表示是否递归删除
boolean flag = fileSystem.delete(new Path("/a.txt"), false);
// 执行结果:true
System.out.println(flag);
}
}
2.4 创建文件
Java代码实理:在HDFS文件服务器上创建文件夹。
public class Mkdir {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.0.0:9000");
FileSystem fs = null;
fs = FileSystem.get(conf);
fs.mkdirs(new Path("/test2"));
}
}