设为首页 收藏本站
查看: 1002|回复: 0

[经验分享] Hadoop2.6.0学习笔记(二)HDFS访问

[复制链接]

尚未签到

发表于 2018-10-30 09:30:23 | 显示全部楼层 |阅读模式
package com.invic.hdfs;  

  
import java.io.IOException;
  
import java.io.OutputStream;
  
import java.net.URI;
  
import java.util.Scanner;
  

  
import org.apache.hadoop.conf.Configuration;
  
import org.apache.hadoop.fs.FSDataInputStream;
  
import org.apache.hadoop.fs.FSDataOutputStream;
  
import org.apache.hadoop.fs.FileStatus;
  
import org.apache.hadoop.fs.FileSystem;
  
import org.apache.hadoop.fs.FileUtil;
  
import org.apache.hadoop.fs.LocatedFileStatus;
  
import org.apache.hadoop.fs.Path;
  
import org.apache.hadoop.fs.PathFilter;
  
import org.apache.hadoop.fs.RemoteIterator;
  
import org.apache.hadoop.io.IOUtils;
  
import org.apache.hadoop.util.Progressable;
  

  
/**
  
*
  
* @author lucl
  
* @ 通过FileSystem API来实现
  
*  FileSystem get(Configuration)            通过设置配置文件core-site.xml读取类路径来实现,默认本地文件系统
  
*  FileSystem get(URI, Configuration)       通过URI来设定要使用的文件系统
  
*  FileSystem get(URI, Configuration, user) 作为给定用户来访问文件系统,对安全来说至关重要
  
*/
  
public class MyHdfsOfFS {
  

  
    private static String HOST = "hdfs://nnode";
  
    private static String PORT = "8020";
  

  
    private static String NAMENODE = HOST + ":" + PORT;
  

  
    public static void main(String[] args) throws IOException {
  
        Configuration conf = new Configuration();
  

  
        String path = NAMENODE + "/user/";
  

  
        /**
  
         * 由于这里设计的为hadoop的user目录,默认会查询hdfs的用户家目录下的文件
  
         */
  
        String user = "hadoop";
  
        FileSystem fs = null;
  
        try {
  
            fs = FileSystem.get(URI.create(path), conf, user);
  
        } catch (InterruptedException e) {
  
            e.printStackTrace();
  
        }
  

  
        if (null == fs) {
  
            return;
  
        }
  

  
        /**
  
         * 递归创建目录
  
         */
  
        boolean mkdirs = fs.mkdirs(new Path("invic/test/mvtech"));
  
        if (mkdirs) {
  
            System.out.println("Dir ‘invic/test/mvtech’ create success.");
  
        }
  

  
        /**
  
         * 判断目录是否存在
  
         */
  
        boolean exists = fs.exists(new Path("invic/test/mvtech"));
  
        if (exists) {
  
            System.out.println("Dir ‘invic/test/mvtech’ exists.");
  
        }
  

  
        /**
  
         * FSDataInputStream支持随意位置访问
  
         * 这里的lucl.txt默认查找路径为/user/Administrator/lucl.txt
  
             因为我是windows的eclipse
  
         * 如果我上面的get方法最后指定了user
  
             则查询的路径为/user/get方法指定的user/lucl.txt
  
         */
  
        FSDataInputStream in = fs.open(new Path("lucl.txt"));
  

  
        OutputStream os = System.out;
  

  
        int buffSize = 4098;
  

  
        boolean close = false;
  

  
        IOUtils.copyBytes(in, os, buffSize, close);
  

  
        System.out.println("\r\n跳到文件开始重新读取文件。。。。。。");
  
        in.seek(0);
  
        IOUtils.copyBytes(in, os, buffSize, close);
  

  
        IOUtils.closeStream(in);
  

  
        /**
  
         * 创建文件
  
         */
  
        FSDataOutputStream create = fs.create(new Path("sample.txt"));
  
        create.write("This is my first sample file.".getBytes());
  
        create.flush();
  
        create.close();
  

  
        /**
  
         * 文件拷贝
  
         */
  
        fs.copyFromLocalFile(new Path("F:\\Mvtech\\ftpfile\\cg-10086.com.csv"),
  
        new Path("cg-10086.com.csv"));
  

  
        /**
  
         * 文件追加
  
         */
  
        FSDataOutputStream append = fs.append(new Path("sample.txt"));
  
        append.writeChars("\r\n");
  
        append.writeChars("New day, new World.");
  
        append.writeChars("\r\n");
  

  
        IOUtils.closeStream(append);
  

  
        /**
  
         * progress的使用
  
         */
  
        FSDataOutputStream progress = fs.create(new Path("progress.txt"),
  
        new Progressable() {
  

  
            @Override
  
            public void progress() {
  
                System.out.println("write is in progress......");
  
            }
  
        });
  

  
        // 接收键盘输入到hdfs上
  
        Scanner sc = new Scanner(System.in);
  
        System.out.print("Please type your enter : ");
  
        String name = sc.nextLine();
  
        while (!"quit".equals(name)) {
  
            if (null == name || "".equals(name.trim())) {
  
                continue;
  
            }
  
            progress.writeChars(name);
  

  
            System.out.print("Please type your enter : ");
  
            name = sc.nextLine();
  
        }
  

  
        /**
  
         * 递归列出文件
  
         */
  
        RemoteIterator it = fs.listFiles(new Path(path), true);
  
        while (it.hasNext()) {
  
            LocatedFileStatus loc = it.next();
  
            System.out.println(loc.getPath().getName() + "|" + loc.getLen() + "|"
  
            + loc.getOwner());
  
        }
  

  
        /**
  
         * 文件或目录元数据:文件长度、块大小、复本、修改时间、所有者及权限信息
  
         */
  
        FileStatus status = fs.getFileStatus(new Path("lucl.txt"));
  
        System.out.println(status.getPath().getName() + "|" +
  
        status.getPath().getParent().getName() + "|" + status.getBlockSize() + "|"
  
        + status.getReplication() + "|" + status.getOwner());
  

  
        /**
  
         * 列出目录中文件listStatus,若参数为文件则以数组方式返回长度为1的FileStatus对象
  
         */
  
        fs.listStatus(new Path(path));
  
        fs.listStatus(new Path(path), new PathFilter() {
  

  
            @Override
  
            public boolean accept(Path tmpPath) {
  
                String tmpName = tmpPath.getName();
  
                if (tmpName.endsWith(".txt")) {
  
                    return true;
  
                }
  
                return false;
  
            }
  
        });
  

  
        // 可以传入一组路径,会最终累计合并成一个数组返回
  
        // fs.listStatus(Path [] files);
  
        FileStatus [] mergeStatus = fs.listStatus(new Path[]{new Path("lucl.txt"),
  
         new Path("progress.txt"), new Path("sample.txt")});
  
        Path [] listPaths = FileUtil.stat2Paths(mergeStatus);
  
        for (Path p : listPaths) {
  
            System.out.println(p);
  
        }
  

  
        /**
  
         * 文件模式匹配
  
         */
  
        FileStatus [] patternStatus = fs.globStatus(new Path("*.txt"));
  
        for (FileStatus stat : patternStatus) {
  
            System.out.println(stat.getPath());
  
        }
  

  
        /**
  
         * 删除数据
  
         */
  
        boolean recursive = true;
  
        fs.delete(new Path("demo.txt"), recursive);
  

  
        fs.close();
  
    }
  
}



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-628292-1-1.html 上篇帖子: Hadoop集群硬盘故障分析与自动化修复 下篇帖子: Python菜鸟的Hadoop实战——Hadoop2.6.0集群搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表