hdfs客户端的理解,多种方式操作hdfs

hdfs的客户端有多种形式:
1、网页形式
2、命令行形式
3、客户端在哪里运行,没有约束,只要运行客户端的机器能够跟hdfs集群通信即可
文件的切块大小和存储的副本数量,都是由客户端决定!
所谓的由客户端决定,是通过配置参数来定的
hdfs的客户端会读以下两个参数,来决定切块大小、副本数量:
切块大小的参数: dfs.blocksize
副本数量的参数: dfs.replication
这两个配置文件只对客户端起作用,上传文件的时候,副本数量和文件的块大小,就是由则这两个参数决定的。

命令行操作hdfs

准备任意一台机器,上面放一个hadoop安装目录
然后,配置hadoop-env.sh,添加JAVA_HOME
然后,配置core-site.xml,写一个参数fs.defaultFS:值为hdfs集群的uri
(hdfs://hdp-01:9000)
然后,用安装目录中的hadoop命令即可启动hdfs的命令行客户端

hdfs命令行客户端的所有命令列表
Usage: hadoop fs [generic options]
[-appendToFile … ] 同时上传多个文件到HDFS
[-cat [-ignoreCrc] …] 查看文件内容
[-checksum …] //校验完整性?不清楚这个
[-chgrp [-R] GROUP PATH…] 修改文件所属组
[-chmod [-R] 《MODE[,MODE]… | OCTALMODE> PATH…] 修改文件权限
[-chown [-R] [OWNER][:[GROUP]] PATH…] 修改文件所有者及组
[-copyFromLocal [-f] [-p] [-l] [-d] … ] 本地copy文件到hdfs=上传
[-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] … ] 从hdfs copy文件到本地=下载
[-count [-q] [-h] [-v] [-t []] [-u] [-x] …] 统计文件及文件夹数目
[-cp [-f] [-p | -p[topax]] [-d] … ] 拷贝
[-createSnapshot []] 创建快照(数据备份)
[-deleteSnapshot ] 删除快照
[-df [-h] [ …]] 磁盘空间大小
[-du [-s] [-h] [-x] …] 文件夹/文件总大小
[-expunge] 清空回收站(文件被删除时会移到临时目录.Trash/中,当超过延迟时间之后,文件才会被永久删除)
[-find … …] 查询
[-get [-f] [-p] [-ignoreCrc] [-crc] … ] 下载
[-getfacl [-R] ] 查看ACL(访问权限组拥有者)
[-getfattr [-R] {-n name | -d} [-e en] ] 显示文件扩展名
[-getmerge [-nl] [-skip-empty-file] ] 合并多个文件下载
[-help [cmd …]] 帮助。。。
[-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [ …]] 查看目录。。。
[-mkdir [-p] …] 创建文件夹
[-moveFromLocal … ] 本地移动文件到hdfs
[-moveToLocal ] 从hdfs移动文件到本地
[-mv … ] hdfs内移动
[-put [-f] [-p] [-l] [-d] … ] 上传
[-renameSnapshot ] 重命名快照
[-rm [-f] [-r|-R] [-skipTrash] [-safely] …] 删除文件/文件夹
[-rmdir [–ignore-fail-on-non-empty]

…] 递归删除
[-setfacl [-R] [{-b|-k} {-m|-x } ]|[–set ]] 设置ACL
[-setfattr {-n name [-v value] | -x name} ] 设置扩展名
[-setrep [-R] [-w] …] 设置副本数
[-stat [format] …] 显示文件统计信息
[-tail [-f] ] 查看文件尾部信息
[-test -[defsz] ] 查看文件信息(-e PATH是否存在,-z 文件是否为空,-d 是否为目录)
[-text [-ignoreCrc] …] 产看文件内容
[-touchz …] 创建空文件
[-truncate [-w] …] 文件尾部截断
[-usage [cmd …]] 显示给定命令或所有命令用法,对比help不含说明文档

其中常用的
1、查看hdfs中的目录信息
hadoop fs -ls /hdfs路径
hadoop fs -ls /bbb/xxx/
hadoop fs -ls -R / ##递归显示指定路径下的所有文件和文件夹信息

2、上传文件到hdfs中
hadoop fs -put test.txt /
hadoop fs -copyFromLocal test.txt /test.txt.2
copyFromLocal等价于 put
hadoop fs -moveFromLocal /本地文件 /hdfs路径 ## 跟copyFromLocal的区别是:从本地移动到hdfs中

3、下载文件到客户端本地磁盘
hadoop fs -get /hdfs中的路径 /本地磁盘目录
hadoop fs -copyToLocal /hdfs中的路径 /本地磁盘路径 ## 跟get等价
hadoop fs -get /test.txt.2
hadoop fs -copyToLocal /test.txt.2

4、在hdfs中创建文件夹
hadoop fs -mkdir /aaa
hadoop fs -mkdir -p /bbb/xxx

5、拷贝文件
hadoop fs -cp /test.txt /bbb/

6、移动hdfs中的文件(更名)
hadoop fs -mv /test.txt.2 /test.txt.3
hadoop fs -mv /test.txt.3 /bbb/test.txt.4

7、删除hdfs中的文件或文件夹
hadoop fs -rm -r /aaa

8、追加内容到已存在的文件
hadoop fs -appendToFile /本地文件 /hdfs中的文件

9、显示文本文件的内容
hadoop fs -cat /test.txt
hadoop fs -tail /test.txt

10、下载多个文件在本地生成一个合并文件
hadoop fs -getmerge /test/*.dat ./xx.dat

11、修改文件的权限
hadoop fs -chown user:group /aaa
hadoop fs -chmod 700 /aaa

使用java api操作hdfs文件

这里采用的windows运程连接集群

jar:hadoop安装包中找到common和hdfs下的lib内的jar

public class hdfs {
    FileSystem fs;
@Before
public void start() throws IOException, InterruptedException, URISyntaxException {//创建连接,为了获取root权限,有三种方式
    //1,假装自己是root用户,在vm参数里添上-DHADOOP_USER_NAME=root
    //2,假装自己是root用户,在系统变量设置用户名为root
    /*
        Configuration conf = new Configuration();
        //需要指定hdfs文件系统,同时指定namenode所在的机器
        conf.set("fs.defaultFS", "hdfs://hdp-01:9000"); fs.defaultFS
        //指定用户名,注意是System
        System.setProperty("HADOOP_USER_NAME", "root");
        fs= FileSystem.get(conf);
    */
    //直接在连接时指定用户名
    Configuration conf = new Configuration();
    conf.set("dfs.replication", "2");
    conf.set("dfs.blocksize","64m");
     fs= FileSystem.get(new URI("hdfs://hdp-01:9000"),conf,"root");

}
//上传
@Test
public void put() throws IOException {//覆盖上传
    Path src = new Path("G:/result2.txt");
    Path dst = new Path("/test");   
    fs.copyFromLocalFile(src, dst);
}
//下载
@Test
public void load() throws IOException {//覆盖上传
    Path src = new Path("G:/result2.txt");
    Path dst = new Path("/test/result.txt");    
    fs.copyToLocalFile(dst, src);
}
//新建文件夹
@Test
public void add() throws Exception {
    fs.mkdirs(new Path("/path"));
}
//删除文件或文件夹,bollean代表是否递归删除
@Test
public void delete() throws IOException {
    fs.delete(new Path("/result.txt"),true);

}
//修改文件
@Test
public void update() throws Exception {
    FSDataOutputStream append = fs.append(new Path("/result2.txt"));//追加 >>
    //FSDataOutputStream append = fs.create(new Path("/result2.txt"));//覆盖 > 其实是创建新文件 echo "" > xxx
    //FSDataOutputStream append = fs.create(new Path("/result2.txt"),false);//设置为不覆盖,如果文件已存在,将运行失败
    append.write("王八蛋黄鹤".getBytes("utf-8"));
    append.close();
    fs.close();

}
//读文件
@Test
public void show()throws Exception {
    FSDataInputStream inputStream = fs.open(new Path("/result2.txt"));
    byte[] b = new byte[1024] ;
    int len=0;
    while((len=inputStream.read(b))>0) {

    String str = new String(b);
    System.out.println(str);
    }
    inputStream.close();
    fs.close();
}
//移动和重命名
@Test
public void move() throws Exception {
    fs.rename(new Path("/test/result.txt"), new Path("/result2.txt"));
}
//判断是否存在
@Test
public void testExist() throws Exception{
    boolean exists = fs.exists(new Path("/result2.txt"));
    System.out.println(exists);
}
// 随机读文件
@Test
public void randomRead() throws Exception{
    FSDataInputStream open = fs.open(new Path("/result2.txt"));
    open.seek(2);
    byte [] buff = new byte [10];
    open.read(buff);    
    System.out.println(new String(buff));
}

// 查看文件的相关信息
@Test
public void testLisFile() throws Exception{
    RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);//true表示递归
    while (listFiles.hasNext()) {
        LocatedFileStatus file = listFiles.next();//文件信息
        System.out.println("最后访问时间:"+new Date(file.getAccessTime()));//不算本次
        System.out.println("块大小:"+file.getBlockSize());
        System.out.println("文件路径:"+file.getPath());
        System.out.println("副本数量:"+file.getReplication());
        System.out.println("文件所有者"+file.getOwner()+"所属的组"+file.getGroup());
        BlockLocation[] blockLocation = file.getBlockLocations();
        System.out.println("---文件块信息----");
        for (BlockLocation blk: blockLocation ) {
            System.out.println("---块大小="+blk.getLength());
            System.out.println("块所在的节点:"+Arrays.toString(blk.getHosts()));
            System.out.println("块的起始偏移量:"+blk.getOffset());

        }
        System.out.println("----------------------");
    }
}
//查看文件夹的相关信息
@Test
public void testListStatus() throws Exception{
    FileStatus[] listStatus = fs.listStatus(new Path("/"));
    for (FileStatus fss : listStatus) {
        System.out.println("路径:"+fss.getPath());
        System.out.println(fss.isFile()?"是文件":"是目录");
        System.out.println("块大小参数:"+fss.getBlockSize());
    }
}
//复制
@Test
public void copy() {//貌似不支持,似乎也不需要

}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值