不多说,直接上代码。
代码版本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 }