欢迎投稿

今日深度:

Hadoop文件合并,

Hadoop文件合并,


转自:http://acesdream.blog.51cto.com/10029622/1625442


   整个代码的工作就是把本地目录下个若干个小文件,合并成一个较大的文件,写入到HDFS中。话不多说,代码如下:

    补充说明:后来发现,书上的源代码是没有问题的,只不过是书上的源代码要打成jar包,放在集群的机器上去运行,如果在Eclipse下面调试运行的话,就会出现问题。出现问题的原因如下

1 2 3 4 5 6 7 //读取本地文件系统,如果要想正确运行,必须要打成jar包,在hadoop集群的机器上面运行 FileSystem hdfs = FileSystem.get(conf); FileSystem local = FileSystem.getLocal(conf);   //通过URI可以远程读取HDFS,所以Eclipse下面调试要使用这种写法,打成jar包这种形式也是可以的 FileSystem hdfs = FileSystem.get(URI.create(serverPath), conf); FileSystem local = FileSystem.getLocal(conf);


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 package com.hadoop.examples; import java.io.IOException; import java.net.URI;   import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path;   /**  * @Package  * @ClassName: PutMerge  * @Description: 读取本地目录下的文件,写入到HDFS,在写入的过程中,  *                 把这三个文件合成一个文件  * @author lxy  * @date 2015年3月25日 上午9:59:38  * @version V1.0  */   public class PutMerge {       public static void main(String[] args) throws IOException {           // 输入目录,目录下有三个txt,文章最后面会儿给出文件内容         String localPathStr = "E:\\test";         // 输出目录,HDFS路径,文章最后面会给出合并之后的文件内容         String serverPath =                 "hdfs://192.168.3.57:8020/user/lxy/mergeresult/merge.txt";                   //输入目录,是一个本地目录         Path inputDir = new Path(localPathStr);         //输出目录,是一个HDFS路径         Path hdfsFile = new Path(serverPath);           Configuration conf = new Configuration();           /**          * Hadoop in Action的原代码如下           * FileSystem hdfs = FileSystem.get(conf);          * 但是这样的话,使用Eclipse调试时,执行下面的语句是就会报异常,因为它是读取本地          * 文件系统          *  FSDataOutputStream out = hdfs.create(hdfsFile);          */         // 根据上面的serverPath,获取到的是一个org.apache.hadoop.hdfs.DistributedFileSystem对象         FileSystem hdfs = FileSystem.get(URI.create(serverPath), conf);         FileSystem local = FileSystem.getLocal(conf);           try {             //获取输入目录下的文件以及文件夹列表             FileStatus[] inputFiles = local.listStatus(inputDir);             //在hdfs上创建一个文件             FSDataOutputStream out = hdfs.create(hdfsFile);               for (int i = 0; i < inputFiles.length; i++) {                 System.out.println(inputFiles[i].getPath().getName());                 //打开本地输入流                 FSDataInputStream in = local.open(inputFiles[i].getPath());                 byte buffer[] = new byte[256];                 int bytesRead = 0;                 while ((bytesRead = in.read(buffer)) > 0) {                     //往hdfs上的文件写数据                     out.write(buffer, 0, bytesRead);                 }                 //释放资源                 in.close();             }             //释放资源             out.close();         }         catch (IOException e) {             e.printStackTrace();         }     } }

    我的测试目录下有三个txt文件


    1.txt

1 2 3 4 5 6 7 1 hello Hadoop 2 hello Hadoop 3 hello Hadoop 4 hello Hadoop 5 hello Hadoop 6 hello Hadoop 7 hello Hadoop

    2.txt

1 2 3 4 5 6 7 8 hello Hadoop 9 hello Hadoop 10 hello Hadoop 11 hello Hadoop 12 hello Hadoop 13 hello Hadoop 14 hello Hadoop

    3.txt

1 2 3 4 5 6 7 15 hello Hadoop 16 hello Hadoop 17 hello Hadoop 18 hello Hadoop 19 hello Hadoop 20 hello Hadoop 21 hello Hadoop

    合并之后的文件如下所示:

www.htsjk.Com true http://www.htsjk.com/Hadoop/32068.html NewsArticle Hadoop文件合并, 转自:http://acesdream.blog.51cto.com/10029622/1625442    整个代码的工作就是把本地目录下个若干个小文件,合并成一个较大的文件,写入到HDFS中。话不多说,代码如下:   ...
相关文章
    暂无相关文章
评论暂时关闭