大数据学习——java代码实现对HDFS文件的read、append、write操作

在之前的环节进行了HDFS 的搭建过程,接下来学习的内容是通过java代码实现对HDFS中文件进行操作。

这部分学习是为了之后在使用到的MapRedce对HDFS 文件进行操作。

在eclipse上编写java代码对HDFS上的文件进行操作首先要在项目中进行jar包导入。这里我们通过建立maven项目,方便jar包的导入。

需要注意的是在使用mave时导入本地不存在的jar包需要在有网的环境下进行

这里我们导入的jar包有以下几部分,在pom.xml中配置以下几个部分,会自动下载相关jar包

<dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>jdk.tools</groupId>
            <artifactId>jdk.tools</artifactId>
            <version>1.8</version>
            <scope>system</scope>
            <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
        </dependency>
    </dependencies>

 建立HDFSClient类,进行操作其中:

write:写入操作,文件不存在时自动创建文件并写入数据

append:追加写入操作,写入文件需存在

read:读取文件操作

代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

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

public class HDFSClient {
    public static void main(String[] args) {
        
        write();
         //append(); 
         read();
    }
    //主加写入文件,必须是已有文件
    public static void append(){
        Configuration conf=new Configuration();
        conf.set("fs.defaultFS", "hdfs://192.168.98.141:9000");
        conf.set("dfs.support.append", "true");
        conf.set("dfs.client.block.write.replace-datanode-on-failure.policy", "NEVER");//配置权限
        conf.set("dfs.client.block.write.replace-datanode-on-failure.enable", "true");//配置权限
        try {
            FileSystem fs=FileSystem.get(conf);
            FSDataOutputStream outpustream = fs.append(new Path("/hp/abc.txt"));//FSDataOutputStream文件输出流 //追加文件
            outpustream.writeBytes("xxxxxx");//追加内容
            outpustream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //写入文件
    public static void write(){
        Configuration conf=new Configuration();
        conf.set("fs.defaultFS", "hdfs://192.168.98.141:9000");
        try {
            FileSystem fs=FileSystem.get(conf);
            FSDataOutputStream outputStream = fs.create(new Path("/hp/abc.txt"));
            outputStream.writeBytes("abcde");
            outputStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public static void read(){
        // 配置对象
        Configuration conf=new Configuration();
        // 在配置对象中设置 namenode
        conf.set("fs.defaultFS", "hdfs://192.168.98.141:9000");
        try {
            // 创建 FileSystem 
            FileSystem fs=FileSystem.get(conf) ;
            // 穿件输入流
            FSDataInputStream inputstream = fs.open(new Path("/hp/abc.txt"));
            // 字节流转字符流
            InputStreamReader isr=new InputStreamReader(inputstream);
            BufferedReader br=new BufferedReader(isr);
            String str=br.readLine();
            while(str!=null){
                System.out.println(str);
                str=br.readLine();
            }
            br.close();
            isr.close();
            inputstream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

注:这里不能write append方法同时使用会报出错误,具体如何解决和原因我也没有弄清楚