• Hadoop HDFS编程 API入门系列之从本地上传文件到HDFS(一)


      不多说,直接上代码。

     

    代码版本1

     1 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs5;
     2 
     3 import java.io.IOException;
     4 
     5 import java.net.URI;
     6 import java.net.URISyntaxException;
     7 
     8 import org.apache.hadoop.conf.Configuration;
     9 import org.apache.hadoop.fs.FileSystem;
    10 import org.apache.hadoop.fs.Path;
    11 
    12 /**
    13  * 
    14  * @author 
    15  * @function Copying from Local file system to HDFS,即把本地文件(如windows或linux文件拷贝到hdfs上)
    16  * 
    17  */
    18 public class CopyingLocalFileToHDFS
    19 {
    20     /**
    21      * @function Main() 方法
    22      * @param args
    23      * @throws IOException
    24      * @throws URISyntaxException
    25      */
    26     public static void main(String[] args) throws IOException,URISyntaxException{
    27         // 本地文件路径(如windows或linux文件)
    28 //        String source = "D://Data/weibo.txt";
    29         String source = "./data/weibo.txt";
    30         // hdfs文件路径
    31         String dest = "hdfs://HadoopMaster:9000/middle/weibo/";
    32         copyFromLocal(source, dest);
    33     }
    34 
    35     /**
    36      * @function 本地文件上传至 HDFS
    37      * @param source 原文件路径
    38      * @param dest  目的文件路径
    39      * @throws IOException
    40      * @throws URISyntaxException
    41      */
    42     public static void copyFromLocal(String source, String dest)throws IOException, URISyntaxException {
    43         // 读取hadoop文件系统的配置
    44         Configuration conf = new Configuration();
    45         URI uri = new URI("hdfs://HadoopMaster:9000");
    46         // FileSystem是用户操作HDFS的核心类,它获得URI对应的HDFS文件系统
    47         FileSystem fileSystem = FileSystem.get(uri, conf);
    48         // 源文件路径
    49         Path srcPath = new Path(source);
    50         // 目的路径
    51         Path dstPath = new Path(dest);
    52         // 查看目的路径是否存在
    53         if (!(fileSystem.exists(dstPath))) {
    54             // 如果路径不存在,即刻创建
    55             fileSystem.mkdirs(dstPath);
    56         }
    57         // 得到本地文件名称
    58         String filename = source.substring(source.lastIndexOf('/') + 1,source.length());
    59         try {
    60             // 将本地文件上传到HDFS
    61             fileSystem.copyFromLocalFile(srcPath, dstPath);
    62             System.out.println("File " + filename + " copied to " + dest);
    63         } catch (Exception e) {
    64             System.err.println("Exception caught! :" + e);
    65             System.exit(1);
    66         } finally {
    67             fileSystem.close();
    68         }
    69     }
    70 
    71 }

    代码版本2

      1 package com.dajiangtai.Hadoop.HDFS;
      2 
      3 import java.io.IOException;
      4 import java.net.URI;
      5 import java.net.URISyntaxException;
      6 
      7 import org.apache.hadoop.conf.Configuration;
      8 import org.apache.hadoop.fs.FSDataInputStream;
      9 import org.apache.hadoop.fs.FSDataOutputStream;
     10 import org.apache.hadoop.fs.FileStatus;
     11 import org.apache.hadoop.fs.FileSystem;
     12 import org.apache.hadoop.fs.FileUtil;
     13 import org.apache.hadoop.fs.Path;
     14 import org.apache.hadoop.fs.PathFilter;
     15 /**
     16  * @function 将指定格式的多个文件上传至 HDFS
     17  * 使用文件模式,实现多文件上传至HDFS
     18  * @author 小讲
     19  *
     20  */
     21 @SuppressWarnings("unused")
     22 public class CopyManyFilesToHDFS {
     23     
     24     private static FileSystem fs = null;//FileSystem实例对象,即fs
     25     private static FileSystem local = null;//FileSystem实例对象,即Local,本地文件系统
     26 
     27     /**
     28      * @function Main 方法
     29      * @param args
     30      * @throws IOException
     31      * @throws URISyntaxException
     32      */
     33     public static void main(String[] args) throws IOException,URISyntaxException {
     34         //文件上传路径
     35 //        Path dstPath = new Path("hdfs://djt002:9000/outData/copyManyFilesToHDFS/");//这样会在这个默认的copyManyFilesToHDFS.txt里
     36         Path dstPath = new Path("hdfs://djt002:9000/outCopyManyFilesToHDFS/");//要么,你先可以新建好outCopyManyFilesToHDFS这个目录
     37 
     38         
     39         //调用文件上传 list 方法
     40         list(dstPath);
     41     }
     42 
     43     /**
     44      * function 过滤文件格式   将多个文件上传至 HDFS
     45      * @param dstPath 目的路径
     46      * @throws IOException
     47      * @throws URISyntaxException
     48      */
     49     public static void list(Path dstPath) throws IOException, URISyntaxException {
     50         //读取hadoop文件系统的配置
     51         Configuration conf = new Configuration();
     52         //HDFS 接口
     53         URI uri = new URI("hdfs://djt002:9000");
     54         
     55 //        URL、URI与Path三者的区别
     56 //        Hadoop文件系统中通过Hadoop Path对象来代表一个文件    
     57 //        URL(相当于绝对路径)    ->   (文件) ->    URI(相当于相对路径,即代表URL前面的那一部分)
     58 //        URI:如hdfs://dajiangtai:9000
     59 //        如,URL.openStream
     60         
     61         
     62         //获得FileSystem实例fs
     63         fs = FileSystem.get(uri, conf);
     64 //        返回类型是FileSystem,等价于  FileSystem fs = FileSystem.get(uri, conf);
     65     
     66         
     67         //获得FileSystem实例,即Local
     68         local = FileSystem.getLocal(conf);
     69 //        返回类型是LocalFileSystem,等价于  LocalFileSystem  local = FileSystem.getLocal(conf);
     70         
     71 //        为什么要获取到Local呢,因为,我们要把本地D盘下data/74目录下的文件要合并后,上传到HDFS里,所以,我们需先获取到Local,再来做复制工作啦!
     72 
     73          
     74         //只上传data/testdata 目录下 txt 格式的文件
     75         FileStatus[] localStatus = local.globStatus(new Path("D://data/74/*"),new RegexAcceptPathFilter("^.*txt$"));
     76 //        FileStatus[] localStatus = local.globStatus(new Path("./data/copyManyFilesToHDFS/*"),new RegexAcceptPathFilter("^.*txt$"));
     77 //        ^表示匹配我们字符串开始的位置               *代表0到多个字符                        $代表字符串结束的位置
     78 //        RegexAcceptPathFilter来只接收我们需要的,即格式
     79 //        RegexAcceptPathFilter这个方法我们自己写
     80         
     81 //        但是我们,最终是要处理文件里的东西,最终是要转成Path类型,因为Path对象f,它对应着一个文件。
     82         
     83         //获取74目录下的所有文件路径,注意FIleUtil中stat2Paths()的使用,它将一个FileStatus对象数组转换为Path对象数组。
     84         Path[] listedPaths = FileUtil.stat2Paths(localStatus);//localStatus是FileStatus数组类型
     85 
     86         for(Path p:listedPaths){//for星型循环,即将listedPaths是Path对象数组,一一传给Path p
     87             //将本地文件上传到HDFS
     88             fs.copyFromLocalFile(p, dstPath);
     89             //因为每一个Path对象p,就是对应本地下的一个文件,
     90             
     91         }
     92     }
     93 
     94     /**
     95      * @function 只接受 txt 格式的文件aa
     96      * @author 小讲
     97      *
     98      */
     99     public static class RegexAcceptPathFilter implements PathFilter {
    100         private final String regex;//变量
    101 
    102         public RegexAcceptPathFilter(String regex) {
    103             this.regex = regex;//意思是String regex的值,赋给当前类RegexAcceptPathFilter所定义的private final String regex;
    104         }
    105 
    106         public boolean accept(Path path) {//主要是实现accept方法
    107             // TODO Auto-generated method stub
    108             boolean flag = path.toString().matches(regex);//匹配正则表达式,这里是^.*txt$
    109             //只接受 regex 格式的文件
    110             return flag;//如果要接收 regex 格式的文件,则accept()方法就return flag; 如果想要过滤掉regex格式的文件,则accept()方法就return !flag。
    111         }
    112     }
    113 }
  • 相关阅读:
    英语发音-自然拼读法
    最小二乘法
    BZOJ 1650 [Usaco2006 Dec]River Hopscotch 跳石子
    洛谷 1803 凌乱的yyy
    【模板】矩阵加速(数列)
    【模板】矩阵快速幂
    洛谷 4246 BZOJ 1018 [SHOI2008]堵塞的交通
    洛谷 1276 校门外的树(增强版)
    BZOJ 1468 Tree 【模板】树上点分治
    洛谷 1501 [国家集训队]Tree II BZOJ 2631 Tree
  • 原文地址:https://www.cnblogs.com/zlslch/p/6172322.html
Copyright © 2020-2023  润新知