Hadoop3.2.0之HDFS文件系统JavaAPI接口

HDFS是存取数据的分布式文件系统,HDFS文件操作常有两种方式。
一种是命令行方式,即Hadoop提供了一套与Linux文件命令类似的命令行工具。
另一种是JavaAPI,即利用Hadoop的Java库,采用编程的方式操作HDFS的文件。

新建maven项目,添加hadoop相关jar包

1.配置pom.xml文件

 
   <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 Java- API操作

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
Hadoop3.2.0之HDFS文件系统JavaAPI接口_第1张图片
而在/etc/hosts也增加上ip
Hadoop3.2.0之HDFS文件系统JavaAPI接口_第2张图片
执行该程序就完成了将文件下载到本地.

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"));


    }
}

你可能感兴趣的:(hadoop)