FS Shell命令与JAVA实现操作HDFS文件

HDFS Shell命令

创建目录

shell>hadoop fs –mkdir /user

列表

shell>hadoop fs –ls /

查看文件内容

shell>hadoop fs –cat /input/file.txt

上传文件

shell>hadoop fs –put 本地文件 远程目录

获取文件

shell> hadoop fs –get 远程文件 本地目录

移动文件

shell>hadoop fs –mv远程文件1 … 远程文件n 远程目录

复制文件

shell>hadoop fs –cp 远程文件1 … 远程文件n 远程目录

删除文件

shell>hadoop fs –rmr 目录/文件

测试文件命令
文件是否存在

shell>hadoop fs –test –e 文件   // 存在返回0

文件是否0字节

shell>hadoop fs –test –z 文件   //是0返回0

文件是否为目录

shell>hadoop fs –test –d 文件 //是目录返回1,否则返回0  

显示目录中所有文件大小

shell>hadoop fs –du 目录/文件  //目录统计总大小,文件统计大小

清空回收站

shell>hadoop fs -expunge 
JAVA操作HDFS的API
hadoop文件系统API说明与编程步骤

Hadoop提供的文件系统的API

1、 Configuration 类(org.apache.hadoop.conf包):封装了一个客户端或服务器的配置文件

Configuration():

默认加载core-default.xml,该配置文件设置从本地文件读取。
默认也会加载自定义的core-site.xml,设置配置文件从hdfs中读取,但是此文件需要放到 eclipse的 src目录,系统也会自动读取。最好也放log4j.properties 

注:如果其它的配置文件如hdfs-site.xml,mapred-site.xml需要手动加载读取,记载方法是conf.addResource(“hdfs-site.xml”)格式。如果单独改变参数,conf.set(参数名,值)

2、 IOUtils类(org.apache.hadoop.io包):Hadoop提供的IO工具类

copyBytes(InputStream 输入流, OutputStream 输出流, int 缓存大小, boolean  是否关闭输入输出流):从输入流中读取数据到输出流,关闭输入输出流也可以使用IOUtils工具提供的closeStream(in)方法来关闭。

3、Path类(org.apache.hadoop.fs):一个文件被视为Path对象,该对象由文件的URI实例化。

Path(String uri):构建一个path对象

4、FileSystem类(org.apache.hadoop.fs包):代表一个文件系统,可以对文件进行操作。

static FileSystem get(Configuration conf):创建一个带有配置对象conf的FileSystem对象

static FileSystem get(URI uri, Configuration conf):创建带有URI和Conf的FileSystem对象 

注:如果在uri中指定hdfs的前缀,那么就不需要在eclipse中加载core-site.xml文件了。

例:

FileSystem.get(URI.create(“hdfs://hfbin1:9000”),conf)
InputStream open(path path):打开一个文件作为输入字节流 
FSDataOutputStream create(Path path):创建一个文件,返回值是一个输出流。
void copyFromLocalFile(Path 本地文件,Path hdfs目录):从本地上传到hdfs
copyToLocalFil e(Path hdfs文件,Path hdfs文件)
boolean delete(Path path,Boolean 是否递归删除):删除文件/目录,通常参数2为true
boolean rename(path from, path to):重命名,等价于fs shell命令的mv
FileStatus getFileStatus(Path f):查询文件的详细信息,包括大小,权限,块大小等。
FileStatus[] listStatus(Path f):列出目录的内容,返回文件的详细信息数组。

5、FileStatus类():代表文件的详细信息

文件全路径: fileStatus.getPath()
文件块大小: fileStatus.getBlockSize()
文件长度: fileStatus.getLen()
副本数量: fileStatus.getReplication()
用户: fileStatus.getOwner()
用户组: fileStatus.getGroup()
权限: fileStatus.getPermission().toString()

6、java.net.URI

create(String prefix):创建一个带有prefix前缀的uri对象

使用FileSystem API编程步骤

1、 获取Configuration对象

Configuration conf = new Configuration();   //默认加载core-default.xml
//conf.addResource("core-site.xml");        //默认从eclipse的src加载core-site.xml(这个文件可以到hadoop里面配置文件copy出来)
//conf.set(“fs.defaultFS”, “hdfs://hfbin1:9000/”); //也可以这么写不需要加载

2、 获取文件系统的实例FileSystem对象

FileSystem fs = FileSystem.get(conf);
// FileSystem.get(URI.create("hdfs://hfbin1:9000"), conf);//如果复制core-site.xml到src下了,需要的路径时不需要指定前缀,若core-site.xml没有加到src下则需要前缀。

3、 使用FileSystem对象操作文件

打开 open
创建 create
上传 copyFromLocalFile
下载  copyToLocalFile
删除 delelte
重命名 rename
文件详细信息 getFileStatus
使用hadoop提供的文件系统API操作数据(读增删改名复制和文件详细信息)

读取文件内容打印在控制台

package cn.hfbin;
import java.io.IOException;
import java.io.InputStream;
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 FileSystemCat {
    public static void main(String[] args) {
        //1、获取Configuration对象
        Configuration conf = new Configuration();
        //conf.addResource("core-site.xml");//已经自动从本地src目录加了。
        InputStream in = null;
        try {
            //2、获取文件系统的实例FileSystem对象
            //FileSystem fs = FileSystem.get(URI.create("hdfs://node1:9000"), conf);//不需要core-site.xml制定前缀
            FileSystem fs = FileSystem.get(conf);//需要core-site.xml制定前缀
            //3、使用FileSystem对象操作文件:打开一个文件作为输入字节流
            in = fs.open(new Path("/music/music1.txt"));    //例如:/input2/file4.txt
            IOUtils.copyBytes(in, System.out, 4096, false);
        } catch (IOException e) {           
            e.printStackTrace();
        } finally {
            IOUtils.closeStream(in);
        }
    }
}

都是按照步骤来操作的上面都有备注,在这里我就另外说一下IOUtils.copyBytes()方法参数的意思:

第一个参数 in:  是FSDataInputStream类的对象,是有关读取文件的类,也就是所谓“输入流”
第二个参数 out:  是FSDataOutputStream类的对象,是有关文件写入的类,也就是“输出流”(上面我是使用System.out将内容在控制台输出)
第三个参数 4096  表示用来拷贝的buffer大小(buffer是缓冲区)
第四个参数 false  表明拷贝完成后我们并不关闭拷贝源可拷贝目的地

创建文件并将Hello World写进文件中

public class FileSystemCreate { 
    public static void main(String[] args) throws IOException {     
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);       
        String filename = "/input2/file.txt";
        FSDataOutputStream outputStream = fs.create(new Path(filename));//创建一个文件
        InputStream in = new ByteArrayInputStream("Hello World".getBytes("utf-8"));
        IOUtils.copyBytes(in, outputStream, 4096, true);        
    }
}

将本文件上传到hdfs

public class FileSystemCopy {
    public static void main(String[] args) throws IOException {     
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);       
        fs.copyFromLocalFile(new Path("/home/hduser/file/file1"), new Path("/output"));//从本地上传到hdfs  (第一个参数是本地路径,第二个参数是hdf文件路径)
    }
}

删除一个文件

public class FileSystemDelete {
    public static void main(String[] args) throws IOException {
        String uri="/input/file1";
        Configuration conf = new Configuration();       
        FileSystem fs = FileSystem.get(conf);
        Path f=new Path(uri);   
        fs.delete(f,true);
}

重命名/移动文件

public class FileSystemRename {
    public static void main(String[] args) throws IOException {
        String fromFile="/input2/file1";//
        String toFile="/input2/file1new";//
        Configuration conf = new Configuration();       
        FileSystem fs = FileSystem.get(conf);
        Path fromPath=new Path(fromFile);
        Path toPath=new Path(toFile);       
        fs.rename(fromPath, toPath);
    }
}

获取文件信息

public class FileSystemGetStatus {
    public static void main(String[] args) throws IOException {
        String uri=args[0];//如:/input2/file1.txt
        Configuration conf = new Configuration();       
        FileSystem fs = FileSystem.get(conf);
        Path f=new Path(uri);
        FileStatus stat=fs.getFileStatus(f);
        System.out.println("文件路径:"+stat.getPath());             
        System.out.println("文件块大小:"+stat.getBlockSize());
        System.out.println("文件大小:"+stat.getLen());
        System.out.println("副本数量:"+stat.getReplication());
        System.out.println("用户:"+stat.getOwner());
        System.out.println("用户组:"+stat.getGroup());
        System.out.println("权限:"+stat.getPermission().toString());
    }
}

到这就讲解完毕了!!!感谢各位老铁的阅读

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值