Hadoop HDFS编程 API入门系列之路径过滤上传多个文件到HDFS(二)

简介:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

代码版本1

复制代码
  1 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs6;
  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 *
 18 *
 19 */
 20 public class CopyManyFilesToHDFS {
 21 
 22 private static FileSystem fs = null;
 23 private static FileSystem local = null;
 24 
 25 /**
 26 * @function Main 方法
 27 * @param args
 28 * @throws IOException
 29 * @throws URISyntaxException
 30 */
 31 public static void main(String[] args) throws IOException,URISyntaxException
 32 {
 33 //文件源路径 这是在 Windows 下测试运行,如果在 Linux 修改srcPath路径即可
 34 String srcPath = "/home/hadoop/data/*";
 35 //String srcPath = "D://Data/testdata/*";
 36 //或者Path srcPath =new Path("D://Data/testdata/*");
 37 
 38 
 39 //文件目的路径 如果在 Hadoop 环境下运行,使用 dstPath 的相对路径"/copyManyFilesToHDFS/"也可以
 40 String dstPath = "hdfs://HadoopMaster:9000/copyManyFilesToHDFS/";
 41 //或者Path dstPath = new Path("hdfs://HadoopMaster:9000/copyManyFilesToHDFS/");
 42 //调用文件上传 list 方法
 43 list(srcPath,dstPath);
 44 }
 45 
 46 /**
 47 * function 过滤文件格式 将多个文件上传至 HDFS
 48 * @param dstPath 目的路径
 49 * @throws IOException
 50 * @throws URISyntaxException
 51 */
 52 //2.接下来在 list 方法中,使用 globStatus 方法获取所有 txt 文件,然后通过 copyFromLocalFile 方法将文件上传至 HDFS。
 53 public static void list(String srcPath,String dstPath) throws IOException, URISyntaxException {
 54 //读取hadoop配置文件
 55 Configuration conf = new Configuration();
 56 
 57 //获取默认文件系统 在Hadoop 环境下运行,也可以使用此种方法获取文件系统
 58 fs = FileSystem.get(conf);
 59 
 60 //HDFS接口和获取文件系统对象,本地环境运行模式
 61 //URI uri = new URI("hdfs://HadoopMaster:9000");
 62 //fs = FileSystem.get(uri, conf);
 63 //获得本地文件系统
 64 local = FileSystem.getLocal(conf);
 65 //只上传Data/testdata 目录下 txt 格式的文件 ,获得文件目录,即D://Data/testdata/
 66 //FileStatus[] localStatus = local.globStatus(new Path("D://Data/testdata/*"),new RegexAcceptPathFilter("^.*txt$"));
 67 FileStatus[] localStatus = local.globStatus(new Path("/home/hadoop/data/*"),new RegexAcceptPathFilter("^.*txt$"));
 68 // 获得所有文件路径
 69 Path[] listedPaths = FileUtil.stat2Paths(localStatus);
 70 Path out= new Path(dstPath);
 71 //循坏所有文件
 72 for(Path p:listedPaths)
 73 {
 74 //将本地文件上传到HDFS
 75 fs.copyFromLocalFile(p, out);
 76 }
 77 }
 78 
 79 /**
 80 * @function 只接受 txt 格式的文件
 81 * @author 
 82 *
 83 */
 84 // 1.首先定义一个类 RegexAcceptPathFilter实现 PathFilter,过滤掉 txt 文本格式以外的文件。
 85 public static class RegexAcceptPathFilter implements PathFilter 
 86 {
 87 private final String regex;
 88 
 89 public RegexAcceptPathFilter(String regex)
 90 {
 91 this.regex = regex;
 92 }
 93 // 如果要接收 regex 格式的文件,则accept()方法就return flag; 如果想要过滤掉regex格式的文件,则accept()方法就return !flag。
 94 
 95 public boolean accept(Path path) 
 96 {
 97 // TODO Auto-generated method stub
 98 boolean flag = path.toString().matches(regex);
 99 //只接受 regex 格式的文件
100 return flag;
101 }
102 }
103 }
复制代码

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

在Hadoop集群里测试的代码版本

复制代码
 1 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs6;
 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,在Hadoop集群里测试
17 * 
18 *
19 */
20 public class CopyManyFilesToHDFS 
21 {
22 
23 private static FileSystem fs = null;//定义文件系统对象,是HDFS上的
24 private static FileSystem local = null; //定义文件系统对象,是本地上的
25 
26 /**
27 * @function Main 方法
28 * @param args    //@param args是生成文档的时候用的东西,现在不用管。以后慢慢就知道了
29 * @throws IOException
30 * @throws URISyntaxException
31 */
32 public static void main(String[] args) throws IOException,URISyntaxException
33 {
34 //文件的原路径,这是在Windows下测试运行,如果在 Linux 修改srcPath路径即可
35 String srcPath = "/home/hadoop/djt/data/*";
36 //String srcPath = "D://Data/testdata/*";
37 //或者Path srcPath =new Path("D://Data/testdata/*");
38 
39 
40 //文件目的路径 如果在 Hadoop 环境下运行,使用 dstPath 的相对路径"/middle/filter/"也可以
41 String dstPath = "hdfs://HadoopMaster:9000/middle/filter/";
42 //或者Path dstPath = new Path("hdfs://HadoopMaster:9000/middle/filter/");
43 //调用文件上传 list 方法
44 list(srcPath,dstPath);
45 }
46 
47 /**
48 * function 过滤文件格式 将多个文件上传至 HDFS
49 * @param dstPath 目的路径
50 * @throws IOException
51 * @throws URISyntaxException
52 */
53 //2.接下来在 list 方法中,使用 globStatus 方法获取所有 txt 文件,然后通过 copyFromLocalFile 方法将文件上传至 HDFS。
54 public static void list(String srcPath,String dstPath) throws IOException, URISyntaxException 
55 {
56 Configuration conf = new Configuration();//读取hadoop配置文件
57 fs = FileSystem.get(conf);//获取默认文件系统对象,fs。 在Hadoop 环境下运行,也可以使用此种方法获取文件系统
58 //URI uri = new URI("hdfs://HadoopMaster:9000");//HDFS接口和获取文件系统对象,本地环境运行模式
59 //fs = FileSystem.get(uri, conf);
60 local = FileSystem.getLocal(conf);//获得本地文件系统对象,local
61 //只上传Data/testdata 目录下 txt 格式的文件 ,获得文件目录,即D://Data/testdata/
62 //FileStatus[] localStatus = local.globStatus(new Path("D://Data/testdata/*"),new RegexAcceptPathFilter("^.*txt$"));
63 FileStatus[] localStatus = local.globStatus(new Path("/home/hadoop/djt/data/*"),new RegexAcceptPathFilter("^.*txt$"));//接收目录下的 txt 文件
64 // 获得所有文件路径
65 Path[] listedPaths = FileUtil.stat2Paths(localStatus);
66 Path out= new Path(dstPath);
67 //循坏所有文件
68 for(Path p:listedPaths)
69 {
70 //将本地文件上传到HDFS
71 fs.copyFromLocalFile(p, out);
72 }
73 }
74 
75 /**
76 * @function 只接受 txt 格式的文件
77 * @author 
78 *
79 */
80 // 1.首先定义一个类 RegexAcceptPathFilter实现 PathFilter,过滤掉 txt 文本格式以外的文件。
81 public static class RegexAcceptPathFilter implements PathFilter 
82 {
83 private final String regex;
84 
85 public RegexAcceptPathFilter(String regex)
86 {
87 this.regex = regex;
88 }
89 // 如果要接收 regex 格式的文件,则accept()方法就return flag; 如果想要过滤掉regex格式的文件,则accept()方法就return !flag。
90 @Override
91 public boolean accept(Path path) 
92 {
93 // TODO Auto-generated method stub
94 boolean flag = path.toString().matches(regex);
95 //只接受 regex 格式的文件
96 return flag;
97 }
98 }
99 }
复制代码

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

在Eclipse/MyEclipse集群里测试的代码版本

复制代码
  1 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs6;
  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,在MyEclipse里测试
 17 * @author 小讲
 18 *
 19 */
 20 public class CopyManyFilesToHDFS {
 21 
 22 
 23 private static FileSystem fs = null;//定义文件系统对象,是HDFS上的
 24 private static FileSystem local = null;//定义文件系统对象,是本地上的
 25 
 26 /**
 27 * @function Main 方法
 28 * @param args
 29 * @throws IOException
 30 * @throws URISyntaxException
 31 */
 32 public static void main(String[] args) throws IOException,URISyntaxException
 33 {
 34 //文件源路径 这是在 Windows 下测试运行,如果在 Linux 修改srcPath路径即可
 35 String srcPath = "D://data/testdata/*";
 36 //或者Path srcPath =new Path("D://Data/testdata/*");
 37 
 38 //文件目的路径 如果在 Hadoop 环境下运行,使用 dstPath 的相对路径"/middle/filter/"也可以
 39 String dstPath = "hdfs://HadoopMaster:9000/middle/filter/";
 40 //或者Path dstPath = new Path("hdfs://HadoopMaster:9000/middle/filter/");
 41 //调用文件上传 list 方法
 42 list(srcPath,dstPath);
 43 }
 44 
 45 /**
 46 * function 过滤文件格式 将多个文件上传至 HDFS
 47 * @param dstPath 目的路径
 48 * @throws IOException
 49 * @throws URISyntaxException
 50 */
 51 //2.接下来在 list 方法中,使用 globStatus 方法获取所有 txt 文件,然后通过 copyFromLocalFile 方法将文件上传至 HDFS。
 52 public static void list(String srcPath,String dstPath) throws IOException, URISyntaxException
 53 {
 54 //读取hadoop配置文件
 55 Configuration conf = new Configuration();
 56 
 57 //获取默认文件系统 在Hadoop 环境下运行,也可以使用此种方法获取文件系统
 58 //fs = FileSystem.get(conf);
 59 
 60 //HDFS接口和获取文件系统对象,本地环境运行模式
 61 URI uri = new URI("hdfs://HadoopMaster:9000");
 62 fs = FileSystem.get(uri, conf);
 63 
 64 local = FileSystem.getLocal(conf);//获得本地文件系统
 65 //只上传Data/testdata 目录下 txt 格式的文件 ,获得文件目录,即D://Data/testdata/
 66 FileStatus[] localStatus = local.globStatus(new Path("D://Data/testdata/*"),new RegexAcceptPathFilter("^.*txt$"));
 67 // 获得所有文件路径
 68 Path[] listedPaths = FileUtil.stat2Paths(localStatus);
 69 Path out= new Path(dstPath);
 70 //循坏所有文件
 71 for(Path p:listedPaths)
 72 {
 73 //将本地文件上传到HDFS
 74 fs.copyFromLocalFile(p, out);
 75 }
 76 }
 77 
 78 /**
 79 * @function 只接受 txt 格式的文件
 80 * @author 
 81 *
 82 */
 83 // 1.首先定义一个类 RegexAcceptPathFilter实现 PathFilter,过滤掉 txt 文本格式以外的文件。
 84 public static class RegexAcceptPathFilter implements PathFilter 
 85 {
 86 private final String regex;
 87 
 88 public RegexAcceptPathFilter(String regex)
 89 {
 90 this.regex = regex;
 91 }
 92 // 如果要接收 regex 格式的文件,则accept()方法就return flag; 如果想要过滤掉regex格式的文件,则accept()方法就return !flag。
 93 @Override
 94 public boolean accept(Path path) 
 95 {
 96 // TODO Auto-generated method stub
 97 boolean flag = path.toString().matches(regex);
 98 //只接受 regex 格式的文件
 99 return flag;
100 }
101 }
102 }
复制代码

 

 

 

 

 

 

代码版本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 }
复制代码

 


本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/6173719.html,如需转载请自行联系原作者

相关文章
|
21天前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
55 0
|
1月前
|
JavaScript API 开发者
RESTful API 设计的传奇征程:突破常规,拥抱最佳实践,铸就编程巅峰!
【8月更文挑战第7天】希望通过以上的探讨,能让您对 RESTful API 设计有更深入的理解和认识。
50 5
|
19天前
|
存储 分布式计算 Hadoop
|
19天前
|
JSON API 数据库
神秘编程力量来袭!Rails 究竟隐藏着怎样的魔力,能构建出强大的 RESTful API?快来一探究竟!
【8月更文挑战第31天】《构建 RESTful API:使用 Rails 进行服务端开发》介绍了如何利用 Ruby on Rails 框架高效构建可扩展的 RESTful API。Rails 采用“约定优于配置”,简化开发流程,通过示例展示了路由定义、控制器设计及模型层交互等内容,帮助开发者快速搭建稳定可靠的服务端。无论小型项目还是大型应用,Rails 均能提供强大支持,提升开发效率。
22 0
|
22天前
|
分布式计算 Hadoop Java
面向开发者的Hadoop编程指南
【8月更文第28天】Hadoop是一个开源软件框架,用于分布式存储和处理大规模数据集。它由Hadoop分布式文件系统(HDFS)和MapReduce编程模型组成。本指南旨在帮助初学者和中级开发者快速掌握Hadoop的基本概念和编程技巧,并通过一些简单的示例来加深理解。
17 0
|
26天前
|
存储 API 开发工具
【Azure API 管理】讨论APIM是否适合直接存储文件到Azure Storage Account呢?
【Azure API 管理】讨论APIM是否适合直接存储文件到Azure Storage Account呢?
|
2月前
|
分布式计算 Hadoop 关系型数据库
实时计算 Flink版操作报错合集之Hadoop在将文件写入HDFS时,无法在所有指定的数据节点上进行复制,该如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
3月前
|
SQL JSON 数据处理
实时计算 Flink版产品使用问题之把hdfs集群里的core-site.xml hdfs.xml两个文件放到flink/conf/目录下,启动集群说找不到hdfs,该如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
分布式计算 Hadoop Java
Hadoop MapReduce编程
该教程指导编写Hadoop MapReduce程序处理天气数据。任务包括计算每个城市ID的最高、最低气温、气温出现次数和平均气温。在读取数据时需忽略表头,且数据应为整数。教程中提供了环境变量设置、Java编译、jar包创建及MapReduce执行的步骤说明,但假设读者已具备基础操作技能。此外,还提到一个扩展练习,通过分区功能将具有相同尾数的数字分组到不同文件。
44 1
|
3月前
|
分布式计算 Hadoop Java
分布式系统详解--框架(Hadoop--JAVA操作HDFS文件)
分布式系统详解--框架(Hadoop--JAVA操作HDFS文件)
33 0

热门文章

最新文章