Hadoop学习篇(二)——HDFS编程操作2

上篇链接:

Hadoop学习篇(二)——HDFS编程操作1

Hadoop学习篇(二)——HDFS编程操作2

说明:如涉及到侵权,请及时联系我,并在第一时间删除文章。

2.3.2 编程操作

HDFS的编程操作,实际上就是用高级语言模拟HDFS的命令行操作,从而做到机器代替人工的大量处理。

我们的编程操作主要进行模拟的有:

  • 判断文件是否存在
  • 实现ls命令
  • 实现cat命令
  • 写入HDFS
  • HDFS文件的下载与上传
2.3.2.4 写入HDFS

写入文件到HDFS通过创建FSDataOutputStream数据输出流,将写入内容转换为二进制形式放入流中,写入文件。

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 java.io.IOException;

public class HadoopOp {
    
    private static Configuration conf;
    private static FileSystem fs;
    
    public static void main(String[] args) {
        conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://localhost:9000");
        conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
        fs = FileSystem.get(conf);
        writeFile();
        fs.close();
    }
    
    public static void writeFile(Configuration conf, FileSystem fs, String filePath, String content) {
        try {
            byte[] buff = content.getBytes(); // 写入文件内容转换为字节数组
            FSDataOutputStream fsDataOutputStream = fs.create(new Path(filePath));
            fsDataOutputStream.write(buff, 0, buff.length);	// 写入文件内容
            fsDataOutputStream.close();
        } catch (IOExpection e) {
            e.printStackTrace();
        } finally {
            System.out.println(content + "\n已写入\n" + filePath);
        }
    }
}

运行结果:
在这里插入图片描述
查看HDFS上创建的文件内容:
在这里插入图片描述
在进行HDFS写入文件内容的编程操作时,应注意两点:1、如果文件不存在,程序会自动创建;2、对于已存在文件的写入,这种写操作是覆盖写,和Java读写本地文件不同的是,HDFS没有提供追加写的相关API,这里我们可以自己通过修改变成逻辑,来实现追加写入。

2.3.2.5 HDFS文件的下载与上传
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;

import java.io.*;

public class HadoopOp {
    
    private static Configuration conf;
    private static FileSystem fs;
    
    public static void main(String[] args) {
        conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://localhost:9000");
        conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
        fs = FileSystem.get(conf);
        System.out.println("----------------------------------------------------------------");
        putFile(conf, fs, "/usr/local/Cellar/hadoop/Exp/wanghe/wanghe1.txt", "/wanghe/text/wanghe1.txt");
        System.out.println("----------------------------------------------------------------");
        getFile(conf, fs, "/usr/local/Cellar/hadoop/Exp/wanghe/wanghe2.txt", "/wanghe/text/wanghe2.txt");
        fs.close();
    }
    
    public static void putFile(Configuration conf, FileSystem fs, String localFile, String hdfsPath) {
        try {
            FileInputStream fileInputStream = new FileInputStream(new File(localFile));
            FSDataOutputStream fileOutputStream = fs.create(new Path(hdfsPath));
            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len = fileInputStream.read()) != -1) {
                fileOutputStream.write(bytes, 0, len);
            }
            fileInputStream.close();
            fileOutputStream.close();
            System.out.println("本地文件:" + localFile + "\n已写入HDFS:" + hdfsPath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static void getFile(Configuration conf, FileSystem fs, String localFile, String hdfsPath) {
        try {
            FSDataInputStream fsDataInputStream = fs.create(new Path(hdfsPath));
            File file = new File(localFile);
            if (!file.isExists()) {
                file.createNewFile();
            }
            FileOutputStream fileOutputStream = new FileOutputStream(file, true);	// 追加写入文件
            byte[] b = new byte[1024];
            int len = 0;
            while ((len = fileInputStream.read(b)) != -1) {
                fileOutputStream.write(bytes, 0, len);
            }
            fsDataInputStream.close();
            fileOutputStream.close();
            System.out.println("HDFS文件:" + hdfsPath + "\n已下载到本地:" + localFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
}

运行结果为:
在这里插入图片描述
我们查看下载至本地文件内容与源文件内容:
在这里插入图片描述
我们查看上传至HDFS文件内容与源文件内容:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值