HDFS的基本使用

HDFS——shell:

1,ls

    hadoop fs -ls /

    列出 hdfs 文件系统根目录下的目录和文件

    hadoop fs -ls -R /

    列出 hdfs 文件系统所有的目录和文件

2.put

    hadoop fs -put < local file > < hdfs file >

    hdfs file 的父目录一定要存在,否则命令不会执行hadoop fs -put < local file or dir >...< hdfs dir >

    hdfs dir 一定要存在,否则命令不会执行hadoop fs -put - < hdsf file>

    从键盘读取输入到 hdfs file 中,按 Ctrl+D 结束输入,hdfs file 不能存在,否则命令不会执行

扫描二维码关注公众号,回复: 4230814 查看本文章

2.1.moveFromLocal

    hadoop fs -moveFromLocal < local src > ... < hdfs dst >

    与 put 相类似,命令执行后源文件 local src 被删除,也可以从从键盘读取输入到 hdfs file 中

2.2.copyFromLocal

    hadoop fs -copyFromLocal < local src > ... < hdfs dst >

    与 put 相类似,也可以从从键盘读取输入到 hdfs file 中

3.get

    hadoop fs -get < hdfs file > < local file or dir>

    local file 不能和 hdfs file 名字不能相同,否则会提示文件已存在,没有重名的文件会复制到本地

    hadoop fs -get < hdfs file or dir > ... < local dir >

    拷贝多个文件或目录到本地时,本地要为文件夹路径

    注意:如果用户不是 root, local 路径要为用户文件夹下的路径,否则会出现权限问题,

3.2.copyToLocal

    hadoop fs -copyToLocal < local src > ... < hdfs dst >

    与 get 相类似

4.rm

    hadoop fs -rm < hdfs file > ...

    hadoop fs -rm -r < hdfs dir>...

    每次可以删除多个文件或目录

5.mkdir

    hadoop fs -mkdir < hdfs path>

    只能一级一级的建目录,父目录不存在的话使用这个命令会报错

    hadoop fs -mkdir -p < hdfs path>

    所创建的目录如果父目录不存在就创建该父目录

6.getmerge

    hadoop fs -getmerge < hdfs dir > < local file >

    将 hdfs 指定目录下所有文件排序后合并到 local 指定的文件中,文件不存在时会自动创建,文件存在时会覆盖里面的内容

    hadoop fs -getmerge -nl < hdfs dir > < local file >

    加上 nl 后,合并到 local file 中的 hdfs 文件之间会空出一行

7.cp

    hadoop fs -cp < hdfs file > < hdfs file >

    目标文件不能存在,否则命令不能执行,相当于给文件重命名并保存,源文件还存在

    hadoop fs -cp < hdfs file or dir >... < hdfs dir >

    目标文件夹要存在,否则命令不能执行

8.mv

    hadoop fs -mv < hdfs file > < hdfs file >

    目标文件不能存在,否则命令不能执行,相当于给文件重命名并保存,源文件不存在

    hadoop fs -mv < hdfs file or dir >... < hdfs dir >

    源路径有多个时,目标路径必须为目录,且必须存在。

    注意:跨文件系统的移动(local 到 hdfs 或者反过来)都是不允许的

9.count

    hadoop fs -count < hdfs path >

    统计 hdfs 对应路径下的目录个数,文件个数,文件总计大小

    显示为目录个数,文件个数,文件总计大小,输入路径

10.du

    hadoop fs -du < hdsf path>

    显示 hdfs 对应路径下每个文件夹和文件的大小

    hadoop fs -du -s < hdsf path>

    显示 hdfs 对应路径下所有文件和的大小

    hadoop fs -du - h < hdsf path>

    显示 hdfs 对应路径下每个文件夹和文件的大小,文件的大小用方便阅读的形式表示,例如用 64M 代替 67108864

11.text

    hadoop fs -text < hdsf file>

    将文本文件或某些格式的非文本文件通过文本格式输出

12.setrep

    hadoop fs -setrep -R 3 < hdfs path >

    改变一个文件在 hdfs 中的副本个数,上述命令中数字 3 为所设置的副本个数,-R 选项可以对一个人目录下的所有目录+文件递归执行改变副本个数的操作

13.stat

    hdoop fs -stat [format] < hdfs path >

    返回对应路径的状态信息

    [format]可选参数有:%b(文件大小),%o(Block 大小),%n(文件名),%r(副本个数),%y(最后一次修改日期和时间)

    可以这样书写 hadoop fs -stat %b%o%n < hdfs path >,不过不建议,这样每个字符输出的结果不是太容易分清楚

14.tail

    hadoop fs -tail < hdfs file >

    在标准输出中显示文件末尾的 1KB 数据

15.archive

    hadoop archive -archiveName name.har -p < hdfs parent dir > < src >* < hdfs dst >

    命令中参数 name:压缩文件名,自己任意取;< hdfs parent dir > :压缩文件所在的父目录;<src >*:要压缩的文件名;< hdfs dst >:压缩文件存放路径

    示例:hadoop archive -archiveName hadoop.har -p /user 1.txt 2.txt /des    

    示例中将 hdfs 中/user 目录下的文件 1.txt,2.txt 压缩成一个名叫 hadoop.har 的文件存放在 hdfs中/des 目录下,如果 1.txt,2.txt 不写就是将/user 目录下所有的目录和文件压缩成一个名叫hadoop.har 的文件存放在 hdfs 中/des 目录下

    显示 har 的内容可以用如下命令:

    hadoop fs -ls /des/hadoop.jar

    显示 har 压缩的是那些文件可以用如下命令

    hadoop fs -ls -R har:///des/hadoop.har

    **注意:**har 文件不能进行二次压缩。如果想给.har 加文件,只能找到原来的文件,重新创建一个。

    har 文件中原来文件的数据并没有变化,har 文件真正的作用是减少 NameNode 和 DataNode 过多的空间浪费

16.balancer

    hdfs balancer

    如果管理员发现某些 DataNode 保存数据过多,某些 DataNode 保存数据相对较少,可以使用上述命令手动启动内部的均衡过程

17.dfsadmin

    hdfs dfsadmin -help

    管理员可以通过 dfsadmin 管理 HDFS,用法可以通过上述命令查看

    hdfs dfsadmin -report

    显示文件系统的基本数据

    hdfs dfsadmin -safemode < enter | leave | get | wait >

    enter:进入安全模式;leave:离开安全模式;get:获知是否开启安全模式;

    wait:等待离开安全模式

18.distcp

    用来在两个 HDFS 之间拷贝数据

    hadoop distcp hdfs://caozhan:9000/a  hdfs://cao:9000/ca

    命令行中还可以指定多个源目录:

    hadoop distcp hdfs://caozhan:9000/a hdfs://caozhan:9000/a  hdfs://cao:9000/ca

    或者使用-f选项,从文件里获得多个源:        

    hadoop distcp -f hdfs://caozhan:9000/dirlist hdfs://caozhan:9000/d

    其中dirlist下是:

    hdfs://caozhan:9000/dirlist/a
    hdfs://caozhan:9000/dirlist/b

HDFS_JAVA_API:

    HDFS 是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件、删除文件、读取文件内容等操作。

    Java 程序使用 HDFS Java API 与 HDFS 交互。使用这个 API,我们可以从 Java 程序中使用存储在 HDFS 中的数据,以及使用其它非 Hadoop 计算框架来处理这些数据。

    有时,也会遇见这种情况-想要从一个 MapReduce 应用程序中直接访问 HDFS。不过,如果是直接从一个 Map 或 Reduce 任务中写入或修改 HDFS 中的文件,请注意这违背了MapReduce 的 side-effect-free(无副作用)特性,这有可能导致数据一致性问题。

    对分布在 HDFS 中的文件操作主要涉及一下几个类:
         Configuration类:该类的对象封装了客户端或者服务器的配置。

         FileSystem类:该类的对象代表一个文件系统对象,可以用该对象的一些方法来对文件进行操作。

            FileSystem fs = FileSystem.get(conf); // 通过 FileSystem 类的静态方法 get 获得该对象

         FSDataInputStream 和 FSDataOutputStream:这两个类是 HDFS 中的输入输出流。分别通过 FileSystem 的 open 方法和 create 方法获得。

         Path:代表文件或文件对象。
        下面这个示例演示了怎样通过 Java 程序使用 HDFS Java API 来执行在 HDFS 上的文件系统操作。

【示例】通过 Java 程序使用 HDFS Java API 操作 HDFS 文件系统。请按以下步骤执行:

    1、在 Eclipse 中新创建一个名为 HDFSJavaAPIExample 的 project;

    2、在项目的 src 目录下创建一个名为 HDFSJavaAPIDemo.java 的源文件,该 java 程序会在 HDFS 中创建一个新的文件,并在其中写入一些文本,然后从 HDFS 读取回这个文件。编辑代码如下:

package com.edu360.api;

import com.edu360.Util.HadoopUtil;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * java 一出 谁与争锋
 * <p>
 * .............................................
 * 佛祖保佑             永无BUG
 *
 * @Auther: caozhan
 * @Date: 2018/10/13 17:54
 * @Description:
 */
public class HadoopApi {
    public static void main(String [] args){
        FileSystem fs = HadoopUtil.getFileSystem();
        download(fs,"/test/test1.txt","/Users/caozhan/a.txt");

    }
    //创建文件
    public static  FSDataOutputStream createFile(FileSystem fileSystem,String path){
        try{
           FSDataOutputStream outputStream = fileSystem.create(new Path(path));
           if(outputStream!=null){
                System.out.println("创建成功");
               return outputStream;
           }
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("创建失败");
        return null;
    }

    //写入文件
    public static  void writeFile(FileSystem fileSystem,String Filepath,String values){
        FSDataOutputStream out;
        try{
                System.out.println("文件不存在,正在创建...");
                out = createFile( fileSystem, Filepath);
                out.writeBytes(values);
                out.close();

        }catch (Exception e){
            e.printStackTrace();
        }

    }

    //读取文件
    public static void readFile(FileSystem fileSystem,String Filepath){
        try{
            FSDataInputStream input = fileSystem.open(new Path(Filepath));
            IOUtils.copyBytes(input,System.out,1024,true);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    //删除文件
    public static void delFile(FileSystem fileSystem,String Filepath){
        try{
            boolean flag=fileSystem.delete(new Path(Filepath));
            if(flag==true){
                tell("删除成功");
            }else {
                tell("删除失败");
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //上穿文件
    public static void upload(FileSystem fileSystem,String resp,String destp){
        try{
            Path resP = new Path(resp);
            Path destP = new Path(destp);
            if(!fileSystem.exists(destP)){
                fileSystem.mkdirs(destP);
            }
            fileSystem.copyFromLocalFile(resP,destP);
            fileSystem.close();
            System.out.println("***********************");
            System.out.println("上传成功!");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //下载文件
    public static void download(FileSystem fileSystem,String destp,String local){
        try {
            FSDataInputStream input = fileSystem.open(new Path(destp));
            OutputStream output=new FileOutputStream(local);
            IOUtils.copyBytes(input,output,4096,true);
            System.out.println("***********************");
            System.out.println("下载成功!");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //查看目录信息
    public static void listDir(FileSystem fileSystem,String path) throws IOException {
        RemoteIterator<LocatedFileStatus> fileIter = fileSystem.listFiles(new Path(path),true);
        while(fileIter.hasNext()){
            LocatedFileStatus fileInfo = fileIter.next();
            tell("文件路径"+fileInfo.getPath());
            tell("文件所属组"+fileInfo.getGroup());
            tell(fileInfo.getBlockLocations());
            tell("--------------------------------------");
        }
    }
    //输出语句
    public static void tell(Object obj){
        System.out.println(obj);
    }


}

猜你喜欢

转载自my.oschina.net/u/4009325/blog/2396180