• 熟练掌握HDFS的Shell访问和Java API访问


    官方文档链接:http://hadoop.apache.org/docs/r2.6.5/hadoop-project-dist/hadoop-common/FileSystemShell.html#test

     HDFS设计的主要目的是对海量数据进行处理,也就是说在其上能够存储很大量文件(可以存储TB级的文件)。HDFS将这些文件分割之后,存储在不同的DataNode上, HDFS 提供了两种数据访问接口:Shell接口和Java API 接口,对HDFS里面的文件进行操作,具体每个Block放在哪台DataNode上面,对于开发者来说是透明(简而言之就是看不见的)的。

    Shell 接口

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

            HDFS基本命令:

    hadoop fs -cmd
    cmd:具体的操作,基本上与UNIX的命令行相同
    args:参数

            HDFS 资源URI格式:

    scheme://authority/path
    scheme:协议名,file或hdfs
    authority:namenode主机名
    path:路径
    示例:hdfs://cloud004:9000/middle/test.txt
    假设已经在core-site.xml里配置了fs.default.name=hdfs://cloud004:9000,则仅使用/middle/test.txt即可。

    shell 操作单个 HDFS 集群

            下面列举出几个常用场景下的命令。

            1、创建文件夹

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

    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -mkdir  /middle/weibo

            2、上传文件 weibo.txt 到 weibo 目录下。

    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -put weibo.txt /middle/weibo/

            还可以使用 -copyFromLocal 参数。

    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -copyFromLocal weibo.txt /middle/weibo/

            3、查看 weibo.txt 文件内容。

    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -text /middle/weibo/weibo.txt

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

    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -cat /middle/weibo/weibo.txt
    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -tail /middle/weibo/weibo.txt

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

    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -get /middle/weibo/weibo.txt

            还可以用 -copyToLocal 参数。

    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -copyToLocal /middle/weibo/weibo.txt

            5、删除 weibo.txt 文件。

    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -rm /middle/weibo/weibo.txt

            删除/middle/weibo文件夹。

    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -rmr /middle/weibo

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

    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -ls /middle

    shell 操作多个 HDFS 集群

            上面我们介绍的是单线程访问的 HDFS 访问模型,但是 多个Hadoop 集群需要复制数据该怎么办呢?幸运的是,Hadoop 有一个有用的 distcp 分布式复制程序,该程序是由 MapReduce 作业来实现的,它是通过集群中并行运行的 map 来完成集群之间大量数据的复制。 下面我们将介绍 distcp 在不同场景下该如何使用。

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

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

    [hadoop@cloud0042 hadoop-2.2.0-x64]$ hadoop distcp hdfs://cloud004:9000/weather hdfs://cloud0042:9000/middle

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

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

    [hadoop@cloud0042 hadoop-2.2.0-x64]$ hadoop distcp -overwrite hdfs://cloud004:9000/weather hdfs://cloud0042:9000/middle

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

    [hadoop@cloud0042 hadoop-2.2.0-x64]$ hadoop distcp -update hdfs://cloud004:9000/weather hdfs://cloud0042:9000/middle

            两个集群运行不同版本的 Hadoop。

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

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

    [hadoop@cloud0042 hadoop-2.2.0-x64]$ hadoop distcp hftp://cloud004:9000/weather hdfs://cloud0042:9000/middle

            注意,这里需要在 URI 源中指定 namenode 的 Web 端口。这是由 dfs.http.address 属性决定的,其默认值为 50070。

            如果使用新出的 webhdfs 协议(替代 hftp)后,对源集群和目标集群均可以使用 HTTP 协议进行通信,且不会造成任何不兼容的问题。

    [hadoop@cloud0042 hadoop-2.2.0-x64]$ hadoop distcp webhdfs://cloud004:9000/weather webhdfs://cloud0042:9000/middle

    Hadoop 管理员其他常见shell操作

            掌握了 shell 如何访问 HDFS,作为 Hadoop 管理员,还需要掌握如下常见命令:

            1、查看正在运行的 Job。

    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop job -list

    
    

            2、关闭正在运行的 Job。

    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop job -kill job_1432108212572_0001

            3、检查 HDFS 块状态,查看是否损坏。

    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fsck /
    [hadoop@test jar]$ hadoop fsck /
    DEPRECATED: Use of this script to execute hdfs command is deprecated.
    Instead use the hdfs command for it.
    
    18/04/08 19:57:11 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    Connecting to namenode via http://test:50070
    FSCK started by hadoop (auth:SIMPLE) from /192.168.80.128 for path / at Sun Apr 08 19:57:19 CST 2018
    ..
    /second/anagram.txt:  Under replicated BP-1804412879-192.168.80.128-1522874281586:blk_1073741827_1003. Target Replicas is 3 but found 1 replica(s).
    .....Status: HEALTHY
     Total size:    1483101 B
     Total dirs:    12
     Total files:    7
     Total symlinks:        0
     Total blocks (validated):    6 (avg. block size 247183 B)
     Minimally replicated blocks:    6 (100.0 %)
     Over-replicated blocks:    0 (0.0 %)
     Under-replicated blocks:    1 (16.666666 %)
     Mis-replicated blocks:        0 (0.0 %)
     Default replication factor:    1
     Average block replication:    1.0
     Corrupt blocks:        0
     Missing replicas:        2 (25.0 %)
     Number of data-nodes:        1
     Number of racks:        1
    FSCK ended at Sun Apr 08 19:57:19 CST 2018 in 80 milliseconds
    
    
    The filesystem under path '/' is HEALTHY

            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
    Configured Capacity: 18569568256 (17.29 GB)
    Present Capacity: 16106115072 (15.00 GB)
    DFS Remaining: 16104345600 (15.00 GB)
    DFS Used: 1769472 (1.69 MB)
    DFS Used%: 0.01%
    Under replicated blocks: 1
    Blocks with corrupt replicas: 0
    Missing blocks: 0
    
    -------------------------------------------------
    Live datanodes (1):
    
    Name: 192.168.80.128:50010 (test)
    Hostname: test
    Decommission Status : Normal
    Configured Capacity: 18569568256 (17.29 GB)
    DFS Used: 1769472 (1.69 MB)
    Non DFS Used: 2463453184 (2.29 GB)
    DFS Remaining: 16104345600 (15.00 GB)
    DFS Used%: 0.01%
    DFS Remaining%: 86.72%
    Configured Cache Capacity: 0 (0 B)
    Cache Used: 0 (0 B)
    Cache Remaining: 0 (0 B)
    Cache Used%: 100.00%
    Cache Remaining%: 0.00%
    Xceivers: 1
    Last contact: Sun Apr 08 19:58:51 CST 2018

            6、Hadoop 进入安全模式。

    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop dfsadmin -safemode enter
    [hadoop@test jar]$ hadoop dfsadmin -safemode enter
    DEPRECATED: Use of this script to execute hdfs command is deprecated.
    Instead use the hdfs command for it.
    
    18/04/08 19:59:57 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    Safe mode is ON

            7、Hadoop 离开安全模式。

    [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop dfsadmin -safemode leave
    [hadoop@test jar]$ hdfs dfsadmin -safemode leave
    18/04/08 20:00:59 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    Safe mode is OFF

            8、平衡集群中的文件

    [hadoop@cloud004 hadoop-2.2.0-x64]$ sbin/start-balancer.sh

    Java API接口

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

            1、获取 HDFS 文件系统

    
    
    public static FileSystem getFileSystem() throws IOException, URISyntaxException{
            //1、获取配置文件
            Configuration conf = new Configuration();
            
    //        FileSystem fs = FileSystem.get(conf);//集群环境下直接获取默认文件系统
            //2、指定的文件系统地址
            URI path = new URI("hdfs://test:9000");
            //3、返回指定的文件系统地址 ------本地测试使用此方法
            FileSystem fs = FileSystem.get(path, conf);
            //4、此处关闭文件系统流会报错,导致之后的操作无法进行
            /**
             * fs.close();
             * Exception in thread "main" java.io.IOException: Filesystem closed
        at org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:795)
        at org.apache.hadoop.hdfs.DFSClient.primitiveMkdir(DFSClient.java:2743)
        at org.apache.hadoop.hdfs.DFSClient.mkdirs(DFSClient.java:2724)
        at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:870)
        at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:866)
        at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
        at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirsInternal(DistributedFileSystem.java:866)
        at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirs(DistributedFileSystem.java:859)
        at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:1817)
        at com.dajiangtai.hdfsJavaAPI.FileTest.mkdir(FileTest.java:33)
        at com.dajiangtai.hdfsJavaAPI.FileTest.main(FileTest.java:46)
    
             * 
             * */
            return fs;
        }

            如果放到 hadoop 集群上面运行,获取文件系统可以直接使用 FileSystem.get(conf)。

            2、创建文件目录

    //创建文件目录
        public static void mkdir() throws IOException, URISyntaxException{
        
            //1、调用刚刚获得的HDFS文件系统,返回文件系统对象
            FileSystem fs = getFileSystem();
            //2、指定创建的文件系统路径
            fs.mkdirs(new Path("hdfs://test:9000/filetest"));
            //3、关闭文件流--------此处不关闭流的情况下,创建文件会正常运行,且不报错
            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 getAllFile() throws IOException, URISyntaxException{
            //1、获取文件系统对象
            FileSystem fs = getFileSystem();
            //2、获取该目录下的文件名称---FileStatus获取文件的元数据
            FileStatus[] listStatus = fs.listStatus(new Path("hdfs://test:9000/filetest/"));
            //3.获取文件的path路径
            Path[] stat2Paths = FileUtil.stat2Paths(listStatus);
            //4、循环遍历路径,输出结果
            for(Path path: stat2Paths){
                System.out.println(path);
            }
            fs.close();
            /**打印结果
             * hdfs://test:9000/filetest/file0.txt
    hdfs://test:9000/filetest/file1.txt
    hdfs://test:9000/filetest/file2.txt
    hdfs://test:9000/filetest/file3.txt
    hdfs://test:9000/filetest/file4.txt
    hdfs://test:9000/filetest/file5.txt
             * */
        }
        

            5、文件上传至 HDFS

    //上传文件到hdfs
        public static void copyToHdfs() throws IOException, URISyntaxException{
            //1、获取文件系统对象
            FileSystem fs = getFileSystem();
            /*
             * Exception in thread "main" java.io.FileNotFoundException: File does not exist: /home/hadoop/app/hadoop-2.6.0/filetest/copyToHdfs.txt
             * 
             * Exception in thread "main" java.lang.IllegalArgumentException: Pathname /C:/Users/yizhijing/Desktop/llllllll/file1.txt from C:/Users/yizhijing/Desktop/llllllll/file1.txt is not a valid DFS filename.
             * */
            //本地文件路径,并且集群中同文件目录下不存在同名文件的情况下
            //2、获取本地文件路径------在windows环境下就是wondows路径,在Linux环境下就是linux路径eg:/home/hadoop/app/hadoop-2.6.0/filetest/file.txt
            Path path = new Path("D://file.txt");
            //3、获取集群文件路径
            Path path2 = new Path("hdfs://test:9000/filetest");
            //4、调用文件系统的方法上传文件
            fs.copyFromLocalFile(path, path2);
            //5、关闭文件流
            fs.close();
        }

            6、从 HDFS 下载文件

    //从hdfs下载文件到到本地windows系统
        public static void copyToLocal() throws IOException, URISyntaxException{
            //1、获取文件系统对象
            FileSystem fs = getFileSystem();
            //2、指定下载的hdfs文件路径
            Path path = new Path("hdfs://test:9000/filetest/file.txt");
            //3、指定本地接收的文件路径
            Path path2 = new Path("F://软件all/微信/WeChat Files/WeChat Files/l1067021152/Files");
            //4、调用文件系统的下载文件系统方法
            fs.copyToLocalFile(path, path2);
            //5、关闭文件流
            fs.close();
        }    

            7、获取 HDFS 集群节点信息

    //获取hdfs节点信息
        public static void getNodeMessage() throws IOException, URISyntaxException{
            //1、获取文件系统对象
            FileSystem fs = getFileSystem();
            //2、获取分布式文件系统对象
            DistributedFileSystem hdfs = (DistributedFileSystem)fs;
            //3、获取分布式系统所有节点信息
            DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats();
            //4、打印节点
            for(int i = 0;i<dataNodeStats.length;i++){
                System.out.println("datanode_"+i+"name:"+dataNodeStats[i].getHostName());
            }
        }

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

    //查询某个文件在集群中的位置信息
        public static void getFileMessage() throws IOException, URISyntaxException{
            //1、获取分布式文件系统
            FileSystem fs = getFileSystem();
            //2、获取某文件的路径
            Path path = new Path("hdfs://test:9000/filetest/file.txt");
            //3、获取某文件的目录
            FileStatus fileStatus = fs.getFileStatus(path);
            //4、获取文件块位置列表
            BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
            //5、循环输出块信息
            for (int i = 0; i < fileBlockLocations.length; i++) {
                String[] hosts = fileBlockLocations[i].getHosts();
                System.out.println("block"+i+"location"+hosts[0]);
            }
        }

            上述 Java API对 HDFS 的操作方法,完整代码如下所示:

    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.BlockLocation;
    import org.apache.hadoop.fs.FileStatus;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.FileUtil;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.hdfs.DistributedFileSystem;
    import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
    
    public class FileTest {
        //获取HDFS文件系统
        public static FileSystem getFileSystem() throws IOException, URISyntaxException{
            //1、获取配置文件
            Configuration conf = new Configuration();
            
    //        FileSystem fs = FileSystem.get(conf);//集群环境下直接获取默认文件系统
            //2、指定的文件系统地址
            URI path = new URI("hdfs://test:9000");
            //3、返回指定的文件系统地址 ------本地测试使用此方法
            FileSystem fs = FileSystem.get(path, conf);
            /**
             * fs.close();
             * Exception in thread "main" java.io.IOException: Filesystem closed
        at org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:795)
        at org.apache.hadoop.hdfs.DFSClient.primitiveMkdir(DFSClient.java:2743)
        at org.apache.hadoop.hdfs.DFSClient.mkdirs(DFSClient.java:2724)
        at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:870)
        at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:866)
        at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
        at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirsInternal(DistributedFileSystem.java:866)
        at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirs(DistributedFileSystem.java:859)
        at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:1817)
        at com.dajiangtai.hdfsJavaAPI.FileTest.mkdir(FileTest.java:33)
        at com.dajiangtai.hdfsJavaAPI.FileTest.main(FileTest.java:46)
    
             * 
             * */
            return fs;
        }
        
        //创建文件目录
        public static void mkdir() throws IOException, URISyntaxException{
        
            //1、调用刚刚获得的HDFS文件系统,返回文件系统对象
            FileSystem fs = getFileSystem();
            //2、指定创建的文件系统路径
            fs.mkdirs(new Path("hdfs://test:9000/filetest"));
            
            for(int i=0;i<6;i++){
                Path path = new Path("hdfs://test:9000/filetest/file"+i+".txt");
                fs.create(path);
            }
            //3、关闭文件流
            fs.close();
        }
        
        //删除文件操作
        public static void rmFile() throws IOException, URISyntaxException{
            //1、获取文件系统对象
            FileSystem fs = getFileSystem();
            //删除指定的文件系统路径
            fs.delete(new Path("hdfs://test:9000/filetest"),true);
            //3、关闭文件流
            fs.close();
        }
        
        //获取目录下的所有文件
        public static void getAllFile() throws IOException, URISyntaxException{
            //1、获取文件系统对象
            FileSystem fs = getFileSystem();
            //2、获取该目录下的文件名称---FileStatus获取文件的元数据
            FileStatus[] listStatus = fs.listStatus(new Path("hdfs://test:9000/filetest/"));
            //3.获取文件的path路径
            Path[] stat2Paths = FileUtil.stat2Paths(listStatus);
            //4、循环遍历路径,输出结果
            for(Path path: stat2Paths){
                System.out.println(path);
            }
            fs.close();
            /**打印结果
             * hdfs://test:9000/filetest/file0.txt
    hdfs://test:9000/filetest/file1.txt
    hdfs://test:9000/filetest/file2.txt
    hdfs://test:9000/filetest/file3.txt
    hdfs://test:9000/filetest/file4.txt
    hdfs://test:9000/filetest/file5.txt
             * */
        }
        
        //上传文件到hdfs
        public static void copyToHdfs() throws IOException, URISyntaxException{
            //1、获取文件系统对象
            FileSystem fs = getFileSystem();
            /*
             * Exception in thread "main" java.io.FileNotFoundException: File does not exist: /home/hadoop/app/hadoop-2.6.0/filetest/copyToHdfs.txt
             * 
             * Exception in thread "main" java.lang.IllegalArgumentException: Pathname /C:/Users/yizhijing/Desktop/llllllll/file1.txt from C:/Users/yizhijing/Desktop/llllllll/file1.txt is not a valid DFS filename.
             * */
            //本地文件路径,并且集群中同文件目录下不存在同名文件的情况下
            //2、获取本地文件路径
            Path path = new Path("D://file.txt");
            //3、获取集群文件路径
            Path path2 = new Path("hdfs://test:9000/filetest");
            //4、调用文件系统的方法上传文件
            fs.copyFromLocalFile(path, path2);
            //5、关闭文件流
            fs.close();
        }
        
        //从hdfs下载文件到到本地windows系统
        public static void copyToLocal() throws IOException, URISyntaxException{
            //1、获取文件系统对象
            FileSystem fs = getFileSystem();
            //2、指定下载的hdfs文件路径
            Path path = new Path("hdfs://test:9000/filetest/file.txt");
            //3、指定本地接收的文件路径
            Path path2 = new Path("F://软件all/微信/WeChat Files/WeChat Files/l1067021152/Files");
            //4、调用文件系统的下载文件系统方法
            fs.copyToLocalFile(path, path2);
            //5、关闭文件流
            fs.close();
        }
        
        //获取hdfs节点信息
        public static void getNodeMessage() throws IOException, URISyntaxException{
            //1、获取文件系统对象
            FileSystem fs = getFileSystem();
            //2、获取分布式文件系统对象
            DistributedFileSystem hdfs = (DistributedFileSystem)fs;
            //3、获取分布式系统所有节点信息
            DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats();
            //4、打印节点
            for(int i = 0;i<dataNodeStats.length;i++){
                System.out.println("datanode_"+i+"name:"+dataNodeStats[i].getHostName());
            }
        }
        
        //查询某个文件在集群中的位置信息
        public static void getFileMessage() throws IOException, URISyntaxException{
            //1、获取分布式文件系统
            FileSystem fs = getFileSystem();
            //2、获取某文件的路径
            Path path = new Path("hdfs://test:9000/filetest/file.txt");
            //3、获取某文件的目录
            FileStatus fileStatus = fs.getFileStatus(path);
            //4、获取文件块位置列表
            BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
            //5、循环输出块信息
            for (int i = 0; i < fileBlockLocations.length; i++) {
                String[] hosts = fileBlockLocations[i].getHosts();
                System.out.println("block"+i+"location"+hosts[0]);
            }
        }
        
        public static void main(String[] args) throws IOException, URISyntaxException {
    
    //        getFileSystem();
    //        mkdir();
    //        rmFile();
    //        getAllFile();
    //        copyToHdfs();
    //        copyToLocal();
    //        getNodeMessage();
            getFileMessage();
        }
    
    }

    运行程序

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

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

    FileTest.jar

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

    [hadoop@test djt]$ ls
    FileTest.jar

            第3步:我们需要切换到 hadoop 的安装目录bin下来运行 FileTest.jar 文件,否则无法找到需要的 jar包来执行程序。

    [hadoop@testhadoop-2.2.0-x64]$ hadoop jar /home/hadoop/djt/FileTest.jar 包名.类名
  • 相关阅读:
    在线免费学习全世界的课程
    【安卓】imageView.scaleType取centerCrop后,再用padding时显示异常?
    win8+VS2012搭建OpenGL超级宝典的环境
    leetcode第一刷_Plus One
    HASH JION AND NESTED JION
    Hive创建外部表以及分区
    Android数字签名解析(一)
    Alex 的 Hadoop 菜鸟教程: 第3课 Hadoop 安装教程
    用C#生成不反复的随机数
    Swift数据类型及数据类型转换
  • 原文地址:https://www.cnblogs.com/ljangle/p/8733071.html
Copyright © 2020-2023  润新知