HDFS的shell和API操作

1. HDFS的shell操作

hadoop  version     //查看版本
hadoop   fs   -appendToFile  src(Linux中的文件) dest(hdfs目录下的文件)  //追加
hadoop   fs   -cat file(hdfs目录下的文件)   //查看文件内容
Hadoop   fs   -tail file(hdfs目录下的文件)   //查看文件末尾1kb的数据
hadoop   fs  -checksum  file(hdfs目录下的文件)  //校验当前文件是否正确
hadoop   fs  -copyFromLocal src dest  //从本地复制文件到HDFS
hadoop   fs  -copyToLocal   dest src  //从hdfs复制文件到本地
hadoop   fs  -count path    //对目录内容做计数
hadoop   fs  -find  path     //查看某个hdfs目录中是否相应的文件
hadoop   fs  -getmerge   src dest  //合并下载
hadoop   fs  -ls   path     //列表
hadoop   fs  -put  file(本地)  dest(hdfs)   //将本地文件上传到hdfs
hadoop   fs  -setrep  num  file   //设置hdfs系统中的某个文件的副本数(只能是hdfs中已上传的文件)
hadoop   fs  -setrep -R num file //设置hdfs系统中的目录下的所有文件的副本数
hadoop   fs  -text 压缩文件   //查看hdfs中的压缩文件
hadoop   fs  -truncate   dir  //清空hdfs目录
hdfs  getconf  -confkey  [key](配置文件的name)  //查看相应的配置的value

2. HDFS的API操作

1)eclipse中的hdfs的开发环境搭建:

  • 下载一个新版的eclipse,将自己集成的hadoop-eclipse-plugin-2.7.4.jar放入eclipse的安装目录中的…\eclipse-hadoop\plugins中。
    插件下载地址:http://down.51cto.com/data/2457877
    然后打开eclipse:


    能查看到以上的两个组件,表示eclipse环境配置成功。
  • 配置eclipse插件连接集群

    配置成功之后,在DFS Locations中就会出现hdfs的文件目录
  • window平台使用hadoop:
    • 在windows下配置hadoop的环境变量,将hadoop的解压包放置一个位置,然后加入:HADOOP_HOME:../hadoop2.7.4/,在path中%HADOOP_HOME:%/bin、
      hadoop.dll,winutils.exe下载地址:http://down.51cto.com/data/2457878
    • 将hadoop.dll 放入c:\windows\system32中
    • 将winutils.exe,放入hadoop 的bin目录下
    • 将eclipse集成hadoop

2)添加hadoop依赖包的三种方式:

  • 在项目中创建一个文件夹,然后将所有需要依赖的jar拷贝到这个目录,右击add build path 将jar导入项目
  • 创建一个用户的library,在本地将相应的jar包导入到项目中:

    注意这里的两个lib中所有jar包都要添加
  • 使用maven导入jar包(推荐)

    3)hdfs编程中的重要的 两个对象:

      Configuration类的介绍
      Configuration类是加载hadoop中的相应的配置文件

    Configuration conf=new Configuration(true);
    如果在这里没有在source folder中放入相应的配置文件:
    core-site.xml、hdfs-site.xml、yarn-site.xml、mapreduce-site.xml…
    那么Configuration类会自动的加载jar包中的配置文件:
    hadoop-hdfs-2.7.6.jar/hdfs-default.xml
    只有在sourcefolder中放入相应的配置时,才能够加载相应的配置,但是配置文件的名称必须是site 或者default的文件,才能够正确加载

      使用相应的方法加载配置文件:

    Configuration conf=new Configuration();
    conf.addResource(""); //这例实参的内容为配置文件的权限定名称

      FileSystem类的介绍
    获取FileSystem对象:

    //以这种方式获取的fs对象是本地的文件系统的对象,如果在windows下就是windows的对象
    Configuration conf=new Configuration();
    FileSystem fs=FileSystem.get(conf);
    //能加载自己集群的文件系统对象
    conf.set("fs.defaultFS", "hdfs://hadoop01:9000");

    解决编程时的权限问题:
     由于hdfs文件系统是基于用户的,在Windows下eclipse中操作hdfs默认的用户是Windows的用户,在操作hdfs文件系统时没有权限的,所以在做读写操作时,可能会报出:

    解决方案
    (1)在运行时使用run configuration,配置相应的参数:-DHADOOP_USER_NAME=hadoop(指定运行用户)
    (2)在代码中指定用户:FileSystem.get(newURI("hdfs://hadoop01:9000"),conf,"hadoop");
    (3)在代码中指定jvm运行时使用的用户System.setProperty("HADOOP_USER_NAME", "hadoop"); 这里需要使用run configuration运行
    (4)在Windows中添加一个hadoop用户,不建议使用
    如果以上方式仍然出现问题,那么就需要在window的path中配置一个环境变量:
    DHADOOP_USER_NAME = hadoop 即可。

4)hdfs的实战编程:

public class HDFSApp {

    //文件系统
    FileSystem fileSystem = null;
    //配置类
    Configuration configuration = null;

    @Before
    public void setup() {
        configuration = new Configuration();
        configuration.set("fs.defautlFS", "hdfs://zzy:9000");
        configuration.addResource("core-site.xml");
        configuration.addResource("hdfs-site.xml");
        try {
            fileSystem = FileSystem.get(configuration);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //创建目录
    @Test
    public void mkdir() {
        try {
            System.setProperty("HADOOP_USER_NAME", "hadoop");
            boolean isMkdirs = fileSystem.mkdirs(new Path("/user/hadoop/test"));
            if (isMkdirs) {
                System.out.println("创建成功!!");
            } else {
                System.out.println("创建失败!!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //删除目录
    @Test
    public void deletedir() {
        System.setProperty("HADOOP_USER_NAME", "hadoop");
        try {
            fileSystem.delete(new Path("/每日任务.txt"), true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //将本地文件copy到hdfs中
    @Test
    public void CopyFromeLocal() {
        System.setProperty("HADOOP_USER_NAME", "hadoop");
        Path  src=new Path("C:\\Users\\aura-bd\\Desktop\\每日任务.txt");
        Path dest=new Path("/");
        try {
            fileSystem.copyFromLocalFile(src,dest);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //将hdfs文件copy到本地
    @Test public void CopyToLocal(){
        System.setProperty("HADOOP_USER_NAME", "hadoop");
        Path  src=new Path("C:\\Users\\aura-bd\\Desktop\\");
        Path dest=new Path("/user/hive/warehouse/test.db/pokes/data.txt");
        try {
            fileSystem.copyToLocalFile(dest,src);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //显示目录下的文件夹信息
    @Test
    public void FSListFile(){
        try {
            RemoteIterator<LocatedFileStatus> filelist = fileSystem.listFiles(new Path("/user/hive/warehouse/test.db"), true);
            while(filelist.hasNext()){
                LocatedFileStatus fileStatus = filelist.next();
                System.out.println(fileStatus.getPath());
                System.out.println(fileStatus.getGroup());
                System.out.println(fileStatus.getPath().getName());
                System.out.println(fileStatus.getReplication());

                BlockLocation[] blockLocations = fileStatus.getBlockLocations();
                for(BlockLocation block :blockLocations){
                    System.out.println(block.getHosts().toString());
                    System.out.println(block.getNames());
                    System.out.println(block.getOffset());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //显示文件夹以及文件信息
    @Test
    public void ListFiles(){
        try {
            FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/"));
            for(FileStatus file:fileStatuses){
                if(file.isDirectory()){
                    System.out.println("directory:"+file.getPath().getName());
                }else{
                    System.out.println("file:"+file.getPath().getName());
                }
            }

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

    //下载文件
    @Test
    public void DownLoadFileToLocal(){
        System.setProperty("HADOOP_USER_NAME", "hadoop");
        try {
            FSDataInputStream open = fileSystem.open(new
                    Path("/user/hive/warehouse/test.db/pokes/data.txt"));
            OutputStream out=new FileOutputStream(new File("D:\\data.txt"));
            IOUtils.copyBytes(open,out,1024);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //上传文件
    @Test
    public void upLoadFileToLocal(){
        System.setProperty("HADOOP_USER_NAME", "hadoop");
        try {
            FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path("/a.txt"));
            InputStream in=new FileInputStream("D:\\data.txt");
            IOUtils.copyBytes(in,fsDataOutputStream,4096);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

原文地址:http://blog.51cto.com/14048416/2341623

时间: 2024-08-27 06:30:23

HDFS的shell和API操作的相关文章

HDFS基础和java api操作

1. 概括 适合一次写入多次查询情况,不支持并发写情况 通过hadoop shell 上传的文件存放在DataNode的block中,通过linux shell只能看见block,看不见文件(HDFS将客户端的大文件存放在很多节点的数据块中,Block本质上是一个逻辑概念,它是hdfs读写数据的基本单位) HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间 2. fs 可以使用hdfs shell操作hdfs,常用 fs命令如下: eg: hadoop fs -cat fi

HDFS的操作SHELL和API

HDFS的shell操作和JavaAPI的使用: WEB WEB端口50090查看SecondaryNameNode信息.可以查看Hadoop的版本,NameNode的IP,Checkpoint等信息. WEB端口50070可以查看HDFS的信息和目录结构 SHELL 查看 hdfs dfs -ls [-d][-h][-R] <paths> [-d]:返回path [-h]:按照KMG数据大小单位显示文件大小,默认B [-R]:级联显示paths下文件 创建文件夹 hdfs dfs -mkdi

Java API操作HDFS

HDFS是存储数据的分布式文件系统,对HDFS的操作,就是对文件系统的操作,除了用HDFS的shell命令对文件系统进行操作,我们也可以利用Java API对文件系统进行操作,比如文件的创建.删除.修改权限等等,还有文件夹的创建.删除.重命名等等. 使用Java API对文件系统进行操作主要涉及以下几个类: 1.Configuration类:该类的对象封装了客户端或者服务端的配置. 2.FileSystem类:该类的对象是一个文件系统对象,可以利用该对象的一些方法来对文件进行操作,FileSys

Hadoop读书笔记(三)Java API操作HDFS

Hadoop读书笔记(一)Hadoop介绍:http://blog.csdn.net/caicongyang/article/details/39898629 Hadoop读书笔记(二)HDFS的shell操作:http://blog.csdn.net/caicongyang/article/details/41253927 JAVA URL 操作HDFS OperateByURL.java package hdfs; import java.io.InputStream; import jav

大数据技术之_04_Hadoop学习_01_HDFS_HDFS概述+HDFS的Shell操作(开发重点)+HDFS客户端操作(开发重点)+HDFS的数据流(面试重点)+NameNode和SecondaryNameNode(面试开发重点)

第1章 HDFS概述1.1 HDFS产出背景及定义1.2 HDFS优缺点1.3 HDFS组成架构1.4 HDFS文件块大小(面试重点)第2章 HDFS的Shell操作(开发重点)第3章 HDFS客户端操作(开发重点)3.1 HDFS客户端环境准备3.2 HDFS的API操作3.2.1 HDFS文件上传(测试参数优先级)3.2.2 HDFS文件下载3.2.3 HDFS文件夹删除3.2.4 HDFS文件名更改3.2.5 HDFS文件详情查看3.2.6 HDFS文件和文件夹判断3.3 HDFS的I/O

HDFS的shell操作

既然HDFS 是存取数据的分布式文件系统,那么对HDFS的操作,就是对文件系统的基本操作,比如文件的创建.修改.删除.修改权限等,文件夹的创建.删除.重命名等.对 HDFS 的操作命令类似于Linux 的shell 对文件的操作,只是在HDFS中,hadoop fs是主命令,其他像ls,mv,cp都是被作为该命令的选项. 以下表格列出一些常用的HDFS shell命令选项. 选项名称 使用格式 含义 -ls -ls <路径> 查看指定路径的当前目录结构 -lsr -lsr <路径>

Hadoop之HDFS(客户端操作) 2 HDFS的API操作 3 HDFS的I/O流操作

2 HDFS的API操作 2.1 HDFS文件上传(测试参数优先级) 1.编写源代码 // 文件上传 @Test public void testPut() throws Exception { Configuration conf = new Configuration(); conf.set("dfs.replication", "2"); // 1.获取fs对象 FileSystem fs = FileSystem.get(new URI("hdfs

HDFS的API操作

1:在Windows下配置Hadoop的运行环境 第一步:将hadoop2.7.5文件夹拷贝到一个没有中文没有空格的路径下面 第二步:在windows上面配置hadoop的环境变量: HADOOP_HOME,并将%HADOOP_HOME%\bin添加到path中 第三步:把hadoop2.7.5文件夹中bin目录下的hadoop.dll文件放到系统盘:C:\Windows\System32 目录 第四步:关闭windows重启 2:获取FileSystem的方式 @Test public voi

五、通过API操作hdfs

一.基本api操作 1.获取HDFS对象的两种方式: 方式1: public static FileSystem initFileSystem1() throws IOException { //获取配置对象 Configuration conf = new Configuration(); //指定namenode地址 conf.set("fs.defaultFS", "hdfs://bigdata121:9000"); //获取hdfs文件系统访问对象 File