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

 


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

相关文章
|
23天前
|
存储 分布式计算 资源调度
Hadoop入门基础(三):如何巧妙划分Hadoop集群,全面提升数据处理性能?
Hadoop入门基础(三):如何巧妙划分Hadoop集群,全面提升数据处理性能?
|
21天前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
53 0
|
23天前
|
分布式计算 资源调度 Hadoop
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
|
23天前
|
分布式计算 资源调度 Hadoop
Hadoop入门基础(四):Hadoop启动踩坑记录
Hadoop入门基础(四):Hadoop启动踩坑记录
|
23天前
|
分布式计算 资源调度 Hadoop
Hadoop入门基础(二):Hadoop集群安装与部署详解(超详细教程)(二)
Hadoop入门基础(二):Hadoop集群安装与部署详解(超详细教程)(二)
|
23天前
|
分布式计算 Ubuntu Hadoop
Hadoop入门基础(二):Hadoop集群安装与部署详解(超详细教程)(一)
Hadoop入门基础(二):Hadoop集群安装与部署详解(超详细教程)(一)
|
26天前
|
存储 分布式计算 Hadoop
【揭秘Hadoop背后的秘密!】HDFS读写流程大曝光:从理论到实践,带你深入了解Hadoop分布式文件系统!
【8月更文挑战第24天】Hadoop分布式文件系统(HDFS)是Hadoop生态系统的关键组件,专为大规模数据集提供高效率存储及访问。本文深入解析HDFS数据读写流程并附带示例代码。HDFS采用NameNode和DataNode架构,前者负责元数据管理,后者承担数据块存储任务。文章通过Java示例演示了如何利用Hadoop API实现数据的写入与读取,有助于理解HDFS的工作原理及其在大数据处理中的应用价值。
38 1
|
1月前
|
存储 分布式计算 资源调度
Hadoop入门基础(一):深入探索Hadoop内部处理流程与核心三剑客
Hadoop入门基础(一):深入探索Hadoop内部处理流程与核心三剑客
|
1月前
|
存储 缓存 分布式计算