前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HDFS:常用客户端API及IO操作

HDFS:常用客户端API及IO操作

作者头像
吟风者
发布2019-08-07 15:03:26
5530
发布2019-08-07 15:03:26
举报
文章被收录于专栏:吟风者吟风者

简洁代码的配置

将core-site.xml复制到根目录下,配置如下:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<!-- 指定HDFS中NameNode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://pdc:9000</value>
    </property>

    <!-- 指定hadoop运行时产生文件的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-2.7.2/data/tmp</value>
    </property>
</configuration>

代码模板

代码语言:javascript
复制
    @Test
    public void mkdirAtHDFS() throws Exception{
        //1.创建配置信息对象
        Configuration configuration = new Configuration();
        //2.创建文件系统,如果配置上面的core-site.xml,则传configuration即可
        FileSystem fs = FileSystem.get(new URI("hdfs://pdc:9000"),configuration, "root");   
        //3.调用API
        fs.xxx(xxx);
    }

1.获取文件系统

代码语言:javascript
复制
FileSystem fs = FileSystem.get(configuration);

2.文件上传

API:

代码语言:javascript
复制
// 创建要上传文件所在的本地路径
Path src = new Path("e:/pdc.txt");
//  创建要上传到hdfs的目标路径
Path dst = new Path("hdfs://pdc:9000/user/pdc");
//  拷贝文件,并删除源文件
fs.copyFromLocalFile(true,src, dst);

注:不用hadoop的API进行流操作是因为运算可能会基于Spark,更快,用io就不用依赖于hadoop IO:

代码语言:javascript
复制
//创建输入流
FileInputStream inStream = new FileInputStream(new File("e:/hello.txt"));
//获取输出路径
String putFileName = "hdfs://pdc:9000/user/pdc/hello1.txt";
Path writePath = new Path(putFileName);
//创建输出流
FSDataOutputStream outStream = fs.create(writePath);
// 5 流对接
try{
    IOUtils.copyBytes(inStream, outStream, 4096, false);
}catch(Exception e){
    e.printStackTrace();
}finally{
    IOUtils.closeStream(inStream);
    IOUtils.closeStream(outStream);
}

3.文件下载

API:

代码语言:javascript
复制
fs.copyToLocalFile(false, new Path("hdfs://pdc:9000/user/atguigu/hello.txt"), new Path("e:/hellocopy.txt"), true);

IO:

代码语言:javascript
复制
//获取读取文件路径
String filename = "hdfs://pdc:9000/user/pdc/hello1.txt";
//创建读取path
Path readPath = new Path(filename);
// 4 创建输入流
FSDataInputStream inStream = fs.open(readPath);
//流对接输出到控制台
try{
    IOUtils.copyBytes(inStream, System.out, 4096, false);
}catch(Exception e){
    e.printStackTrace();
}finally{
    IOUtils.closeStream(inStream);
}

4.创建目录

代码语言:javascript
复制
fs.mkdirs(new Path("hdfs://pdc:9000/user/pdc/output"));

5.删除文件夹

代码语言:javascript
复制
fs.delete(new Path("hdfs://pdc:9000/user/root/output"), true);

6.修改文件名

代码语言:javascript
复制
fs.rename(new Path("hdfs://pdc:9000/user/root/hello.txt"), new Path("hdfs://pdc:9000/user/root/hellonihao.txt"));

7.查看文件详情

代码语言:javascript
复制
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
//注意返回的是迭代器
while (listFiles.hasNext()) {
    LocatedFileStatus fileStatus = listFiles.next();
        
    System.out.println(fileStatus.getPath().getName());
    System.out.println(fileStatus.getBlockSize());
    System.out.println(fileStatus.getPermission());
    System.out.println(fileStatus.getLen());
        
    BlockLocation[] blockLocations = fileStatus.getBlockLocations();
        
    for (BlockLocation bl : blockLocations) {
            
        System.out.println("block-offset:" + bl.getOffset());
            
        String[] hosts = bl.getHosts();
            
        for (String host : hosts) {
            System.out.println(host);
        }
    }
}

8.查看文件夹

代码语言:javascript
复制
//获取查询路径下的文件状态信息
FileStatus[] listStatus = fs.listStatus(new Path("/"));

//遍历所有文件状态
for (FileStatus status : listStatus) {
    if (status.isFile()) {
        System.out.println("f--" + status.getPath().getName());
    } else {
        System.out.println("d--" + status.getPath().getName());
    }
}

9.IO流定位文件读取

下载第一块

代码语言:javascript
复制
@Test
//定位下载第一块内容
public void readFileSeek1() throws Exception {

    //创建配置信息对象
    Configuration configuration = new Configuration();
    FileSystem fs = FileSystem.get(new URI("hdfs://pdc:9000"), configuration, "root");
    //获取输入流路径
    Path path = new Path("hdfs://pdc:9000/user/root/tmp/hadoop-2.7.2.tar.gz");
    //打开输入流
    FSDataInputStream fis = fs.open(path);
    // 4 创建输出流
    FileOutputStream fos = new FileOutputStream("e:/hadoop-2.7.2.tar.gz.part1");
    // 5 流对接
    byte[] buf = new byte[1024];
    for (int i = 0; i < 128 * 1024; i++) {
        fis.read(buf);
        fos.write(buf);
    }
    //关闭流
    IOUtils.closeStream(fis);
    IOUtils.closeStream(fos);
}

下载第二块

代码语言:javascript
复制
@Test
// 定位下载第二块内容
public void readFileSeek2() throws Exception{
    //创建配置信息对象
    Configuration configuration = new Configuration();
    FileSystem fs = FileSystem.get(new URI("hdfs://pdc:9000"), configuration, "root");
    //获取输入流路径
    Path path = new Path("hdfs://pdc:9000/user/pdc/tmp/hadoop-2.7.2.tar.gz");
    //打开输入流
    FSDataInputStream fis = fs.open(path);
    //创建输出流
    FileOutputStream fos = new FileOutputStream("e:/hadoop-2.7.2.tar.gz.part2");
    //定位偏移量(第二块的首位)
    fis.seek(1024 * 1024 * 128);
    //流对接
    IOUtils.copyBytes(fis, fos, 1024);
    //关闭流
    IOUtils.closeStream(fis);
    IOUtils.closeStream(fos);
}

合并文件 cmd中:

代码语言:javascript
复制
type hadoop-2.7.2.tar.gz.part2 >> hadoop-2.7.2.tar.gz.part1

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.08.05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简洁代码的配置
  • 1.获取文件系统
  • 2.文件上传
  • 3.文件下载
  • 4.创建目录
  • 5.删除文件夹
  • 6.修改文件名
  • 7.查看文件详情
  • 8.查看文件夹
  • 9.IO流定位文件读取
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档