zoukankan      html  css  js  c++  java
  • 熟练掌握HDFS的Shell访问和JavaAPI访问

            HDFS设计的主要目的是对海量数据进行处理,也就是说在其上能够储存很大量文件(可以储存TB级的文件)。HDFS将这些文件分割之后,储存在不同的DataNode上,HDFS提供了两种数据访问接口:Shell接口和javaAPI接口,对HDFS里面的文件进行操作。

            Shell接口

        HDFS处理文件的命令和linux命令基本相同,这里区分大小写。下面介绍HDFS操作分布式文件系统的命令。

            HDFS基本命令

            hadoop fs -cmd  其中cmd:具体的操作,基本上与unix的命令相同

       args:参数

       HDFS资源URI格式

            scheme://authority/path  其中scheme:协议名,file或hdfs

            authority:namenode主机名

        path:路径   示例:hdfs://qq58053439:9000/middle/test.txt

         假设已经在core-site.xml里配置了fs.default.name=hdfs://xuweiwei:9000,则仅使用/middle/test.txt即可。

        shell操作单个HDFS集群

       1、创建文件夹

        HDFS上的文件目录结构类似Linux,根目录使用"/"表示。下面的命令将在/middle目录下建立目录weibo

        [hadoop@qq58053439 hadoop]$hadoop fs -mkdir /middle/weibo

         2、上传到weibo.txt到weibo目录下

             [hadoop@qq58053439 hadoop]$hadoop fs -put weibo.txt /middle/weibo

        还可以使用-copyFromLocal参数

        [hadoop@qq58053439 hadoop]$hadoop fs -copyFromLocal weibo.txt /middle/weibo

        3、查看weibo.txt文件内容

              [hadoop@qq58053439 hadoop]$hadoop fs -text /middle/weibo/weibo.txt

        还可以用-cat、-tail参数查看文件的内容。但是对于压缩的结果文件只能用-text参数来查看,否则还是乱码。

         [hadoop@qq58053439 hadoop]$hadoop fs -cat /middle/weibo/weibo.txt

         [hadoop@qq58053439 hadoop]$hadoop fs -tail /middle/weibo/weibo.txt

        4、把weibo.txt文件复制到本地

         [hadoop@qq58053439 hadoop]$hadoop fs -get /middle/weibo/weibo.txt

        还可以用-copyToLocal参数

         [hadoop@qq58053439 hadoop]$hadoop fs -copyToLocal /middle/weibo/weibo.txt

        5、删除weibo.txt文件

        [hadoop@qq58053439 hadoop]$hadoop fs -rm /middle/weibo/weibo.txt

        删除/middle/weibo文件夹

        [hadoop@qq58053439 hadoop]$hadoop fs -rmr /middle/weibo

       6、显示/middle目录下的文件

        [hadoop@qq58053439 hadoop]$hadoop fs -ls /middle

        两个集群运行相同的版本的Hadoop

          两个HDFS集群之间传输数据,默认情况下distcp会跳过目标路径下已经存在的文件

        [hadoop@qq58053439 hadoop]$hadoop distcp hdfs://qq58053439:9000/weather   hdfs://qq:9000/middle

        这条指令把第一个集群/weather目录及内容复制到第二个集群的/middle目录下,所以第二个集群最后的目录结构为/middle/weather。如果/middle不存在,则新建一个。也可以指定多个源路径,并把所有路径复制到目标路径下。这里的源路径必须是绝对路径。

        两个HDFS集群之间传输数据,覆盖现有的文件使用overwrite。

        [hadoop@qq58053439 hadoop]$hadoop distcp -overwrite hdfs://qq58053439:9000 hdfs://xu:9000/middle

        两个HDFS集群之间传输数据,更新有改动过的文件使用update

        [hadoop@qq58053439 hadoop]$hadoop distcp update hdfs://qq58053439:9000/weather hdfs://xu:58053439/middle

        两个集群不同版本的Hadoop

        不同版本Hadoop集群的RPC是不兼容的,使用distcp复制数据并使用hdfs协议,会导致复制作业失败。要想弥补这种情况,可以使用基于只读HTTP协议的HFTP文件系统并从源文件系统中读取数据。这个作业必须运行在目标集群上,进而实现hdfs RPC版本的兼容。

        还以两个HDFS集群之间传输数据为例

        [hadoop@xu hadoop]$ hadoop distcp hftp://xu:9000/weather hdfs://xu2:9000/middle

          注意,这里需要在 URI 源中指定 namenode 的 Web 端口。这是由 dfs.http.address 属性决定的,其默认值为 50070。如果使用新出的 webhdfs 协议(替代 hftp)后,对源集群和目标集群均可以使用 HTTP 协议进行通信,且不会造成任何不兼容的问题。

        [hadoop@xu hadoop]$ hadoop distcp webhdfs://xu:9000/weather webhdfs://xu2:9000/middle

        Hadoop 管理员其他常见shell操作

        1、查看正在运行的 Job。[hadoop@xu ]$ hadoop job -list

        2、关闭正在运行的 Job。[hadoop@xu hadoop]$ hadoop job -kill job_1432108212572_0001

        3、检查HDFS块状态,查看是否损坏[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fsck /

        4、检查HDFS快状态,并删除损坏的块[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fsck / -delete

          5、检查HDFS状态,包括DataNode信息[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop dfsadmin -report

        6、Hadoop进入安全模式。[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop dfsadmin -safemode enter

        7、Hadoop离开安全模式。[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop dfsadmin -safemode leave

        8、平衡集群中的文件。[hadoop@cloud004 hadoop-2.2.0-x64]$ sbin/start-balancer.sh

        Java API接口

        HDFS提供了JavaApI接口对HDFS进行操作。如果以下程序在Hadoop集群上运行,Path中可以写相对路径,比如"/middle/weibo";如果以下程序在本地Eclipse上面测试,Path中的路径需要写为绝对路径,比如"hdfs://xu:9000/middle/weibo"。

        1、获取 HDFS 文件系统

    //获取文件系统
    public static FileSystem getFileSystem() throws IOException {

    //读取配置文件
    Configuration conf = new Configuration();

    //返回默认文件系统 如果在 Hadoop集群下运行,使用此种方法可直接获取默认文件系统
    //FileSystem fs = FileSystem.get(conf);

    //指定的文件系统地址
    URI uri = new URI("hdfs://cloud004:9000");
    //返回指定的文件系统 如果在本地测试,需要使用此种方法获取文件系统
    FileSystem fs = FileSystem.get(uri,conf);

    return fs;
    }

        2、创建文件目录

    //创建文件目录
    public static void mkdir() throws Exception {

    //获取文件系统
    FileSystem fs = getFileSystem();

    //创建文件目录
    fs.mkdirs(new Path("hdfs://cloud004:9000/middle/weibo"));

    //释放资源
    fs.close();
    }

          3、删除文件或文件目录

    //删除文件或者文件目录
    public static void rmdir() throws Exception {

    //返回FileSystem对象
    FileSystem fs = getFileSystem();

    //删除文件或者文件目录 delete(Path f) 此方法已经弃用
    fs.delete(new Path("hdfs://cloud004:9000/middle/weibo"),true);

    //释放资源
    fs.close();
    }

        4、获取目录下的所有文件

    //获取目录下的所有文件
    public static void ListAllFile() throws IOException{

    //返回FileSystem对象
    FileSystem fs = getFileSystem();

    //列出目录内容
    FileStatus[] status = fs.listStatus(new Path("hdfs://cloud004:9000/middle/weibo/"));

    //获取目录下的所有文件路径
    Path[] listedPaths = FileUtil.stat2Paths(status);

    //循环读取每个文件
    for(Path p : listedPaths){

    System.out.println(p);

    }
    //释放资源
    fs.close();
    }

        5、文件上传至 HDFS

    //文件上传至 HDFS
    public static void copyToHDFS() throws IOException{

    //返回FileSystem对象
    FileSystem fs = getFileSystem();

    //源文件路径是Linux下的路径,如果在 windows 下测试,需要改写为Windows下的路径,比如D://hadoop/djt/weibo.txt
    Path srcPath = new Path("/home/hadoop/djt/weibo.txt");

    // 目的路径
    Path dstPath = new Path("hdfs://cloud004:9000/middle/weibo");

    //实现文件上传
    fs.copyFromLocalFile(srcPath, dstPath);

    //释放资源
    fs.close();
    }

     6、从 HDFS 下载文件

    //从 HDFS 下载文件
    public static void getFile() throws IOException{

    //返回FileSystem对象
    FileSystem fs = getFileSystem();

    //源文件路径
    Path srcPath = new Path("hdfs://cloud004:9000/middle/weibo/weibo.txt");

    //目的路径是Linux下的路径,如果在 windows 下测试,需要改写为Windows下的路径,比如D://hadoop/djt/
    Path dstPath = new Path("/home/hadoop/djt/");

    //下载hdfs上的文件
    fs.copyToLocalFile(srcPath, dstPath);

    //释放资源
    fs.close();
    }
        7、获取 HDFS 集群节点信息

    //获取 HDFS 集群节点信息
    public static void getHDFSNodes() throws IOException{

    //返回FileSystem对象
    FileSystem fs = getFileSystem();

    //获取分布式文件系统
    DistributedFileSystem hdfs = (DistributedFileSystem)fs;

    //获取所有节点
    DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats();
    //循环打印所有节点
    for(int i=0;i< dataNodeStats.length;i++){
    System.out.println("DataNode_"+i+"_Name:"+dataNodeStats[i].getHostName());
    }

    8、查找某个文件在 HDFS 集群的位置

    /查找某个文件在 HDFS 集群的位置
    public static void getFileLocal() throws IOException{

    //返回FileSystem对象
    FileSystem fs = getFileSystem();

    //文件路径
    Path path = new Path("hdfs://cloud004:9000/middle/weibo/weibo.txt");

    //获取文件目录
    FileStatus filestatus = fs.getFileStatus(path);
    //获取文件块位置列表
    BlockLocation[] blkLocations = fs.getFileBlockLocations(filestatus, 0, filestatus.getLen());
    //循环输出块信息
    for(int i=0;i< blkLocations.length;i++){
    String[] hosts = blkLocations[i].getHosts();
    System.out.println("block_"+i+"_location:"+hosts[0]);
    }

    运行程序
    以上 Java API 操作 HDFS 的各种方法,在本地测试完成后,可以根据自己实际情况,稍加修改Path路径就可以直接放到 Hadoop 环境下运行。大致需要以下几步:

    第一步:我们使用 Eclipse 将 Test.java 类打包为 test.jar。因为这里不涉及第三方 jar 包,而且 Hadoop 集群上面已经存在 hadoop 所需要的jar包,所以我们只需要打包 Test.java 即可。

    test.jar
    第二步:在root用户下,通过 xshell 客户端,将 test.jar 上传至 hadoop服务器本地目录/home/hadoop/djt/的下面。

    [root@cloud004 djt]$ ls
    test.jar
    第三步:需要在 root 用户下,将我们上传的 test.jar 文件权限赋予 hadoop 用户组。

    [root@cloud004 ~]# chown -R hadoop:hadoop /home/hadoop/djt/test.jar
    第四步:我们需要切换到 hadoop 的安装目录(/usr/java/hadoop-2.2.0-x64)下来运行 test.jar 文件,否则无法找到需要的 jar包来执行程序。

    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop jar /home/hadoop/djt/test.jar com.dajiangtai.hadoop.middle.Test

  • 相关阅读:
    NPOIHelper.cs (NPOI 2.1.1)
    使用哈希加盐法来为密码加密【转】
    让普通控件拥有左键移动窗体的功能
    Reflector反编译.NET文件后修复【转】
    SD卡中FAT32文件格式快速入门(图文详细介绍)【转】
    项目管理知识体系指南(PMBOOK指南)(第5版) 阅读摘要
    数学
    位运算小结
    字符串(1)——Detect Capital
    数组和矩阵(3)——Next Greater Element I
  • 原文地址:https://www.cnblogs.com/wenhouniba/p/5304237.html
Copyright © 2011-2022 走看看