开发者社区> 技术小哥哥> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

MapReduce中使用SequenceFile的方式上传文件到集群中

简介:
+关注继续查看

HDFS上不适合存储小文件,因为如果有很多的小文件,上传到HDFS集群,每个文件都会对应一个block块,一个block块的大小默认是128M,对于很多的小文件来说占用了非常多的block数量,就会影响到内存的消耗,

MapReduce处理这些文件的话也是需要很多的Map来处理.

HDFS提供的小文件的解决方案可以使用SequenceFile和MapFile:

如果存在大量的小数据文件,可以使用SequenceFile.

同时使用SequenceFile还可以用SequenceFile自带的一些压缩算法来减少这些细小文件的占用空间.

1.使用SequenceFile相关代码把本地Windows上的很多小文件上传到HDFS集群.

复制代码
 1 package seq;
 2 
 3 import java.io.File;
 4 import java.net.URI;
 5 
 6 import org.apache.commons.io.FileUtils;
 7 import org.apache.hadoop.conf.Configuration;
 8 import org.apache.hadoop.fs.FileSystem;
 9 import org.apache.hadoop.fs.Path;
10 import org.apache.hadoop.io.BytesWritable;
11 import org.apache.hadoop.io.SequenceFile;
12 import org.apache.hadoop.io.Text;
13 
14 public class Test2 {
15     public static void main(String[] args) throws Exception {
16         Configuration conf = new Configuration();
17         org.apache.hadoop.fs.FileSystem fs = FileSystem.newInstance(new URI("hdfs://crxy99:9000"),conf);
18         Path out = new Path("/members.seq");//输出到HDFS的根目录下"/" 文件命名为memebers.seq
19         SequenceFile.Writer writer = new SequenceFile.Writer(fs, conf, out, Text.class, BytesWritable.class);//文件名作为key 类型是Text  文件内容作为值上传上去,类型是BytesWritable
20 
21         File localDir = new File("F:\\360Downloads\\crxy\\video\\2016-05-10【mapreduce】 - 副本\\members2000");
22         for (File file : localDir.listFiles()) {
23             Text key = new Text(file.getName());
24             BytesWritable val = new BytesWritable(FileUtils.readFileToByteArray(file));
25             writer.append(key, val);
26             System.out.println(file.getName());
27         }
28         writer.close();
29     }    
30 }
复制代码

 程序运行之后查看HDFS目录:

 

 通过Web浏览HDFS集群可以看到members.seq文件的大小是126.54MB....只占用一个block.

上传的是一个在Windows本地的members的文件.  Windows本地用户是ABC.

 

2.使用SequenceFile的block和record压缩算法进行上传文件的相关代码:

复制代码
 1 import java.io.File;
 2 import java.net.URI;
 3 
 4 import org.apache.commons.io.FileUtils;
 5 import org.apache.hadoop.conf.Configuration;
 6 import org.apache.hadoop.fs.FSDataOutputStream;
 7 import org.apache.hadoop.fs.FileSystem;
 8 import org.apache.hadoop.fs.Path;
 9 import org.apache.hadoop.io.BytesWritable;
10 import org.apache.hadoop.io.IOUtils;
11 import org.apache.hadoop.io.SequenceFile;
12 import org.apache.hadoop.io.SequenceFile.CompressionType;
13 import org.apache.hadoop.io.Text;
14 import org.apache.hadoop.io.compress.GzipCodec;
15 
16 public class Test1 {
17     public static void main(String[] args) throws Exception {
18         Configuration conf = new Configuration();
19         org.apache.hadoop.fs.FileSystem fs = FileSystem.newInstance(new URI("hdfs://crxy99:9000"),conf);
20         CompressionType type = null;
21         if("record".equals(args[0])){
22             type = CompressionType.RECORD;
23         }
24         if("block".equals(args[0])){
25             type = CompressionType.BLOCK;
26         }
27         FSDataOutputStream out = fs.create(new Path(args[1]));
28         SequenceFile.Writer writer = SequenceFile.createWriter(conf, out, Text.class, BytesWritable.class,type,new GzipCodec());
29         
30         File localDir = new File("/usr/local/hadoop_repo/files/members2000");
31         for (File file : localDir.listFiles()) {
32             Text key = new Text(file.getName());
33             BytesWritable val = new BytesWritable(FileUtils.readFileToByteArray(file));
34             writer.append(key, val);
35             System.out.println(file.getName());
36         }
37         writer.close();
38         IOUtils.closeStream(out);
39     }    
40 }
复制代码

  结果仍然如上图,文件占用的空间更小.

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5500112.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
云原生|kubernetes|多集群管理之kubeconfig文件配置和使用(定义,使用方法,合并管理多集群)(一)
云原生|kubernetes|多集群管理之kubeconfig文件配置和使用(定义,使用方法,合并管理多集群)
65 0
Cannot resolve plugin org.apache.tomcat.maven:tomcat7-maven-plugin:<unknown>
Cannot resolve plugin org.apache.tomcat.maven:tomcat7-maven-plugin:<unknown>
843 0
Google开源git代码仓库备份工具 Hesokuri
对于开发者而言,代码是最重要的数据。因此,我们需要经常地备份这些代码,同时,我们也需要很方便地从不同电脑访问这些源代码。
227 0
Confluence 6 管理文件
文件是被附加到 Confluence 的页面上的。请参考 Upload Files 页面中的内容来了解如何附加文件到页面中。 一旦文件被附加到页面上了,你可以下载,删除和编辑这些文件。例如,你可以根据需要上传一个文件的新版本,或者修改附加的页面为别的页面。
834 0
6 Major Changes in Science and Technology Reshaping the Retail Industry
As the transformation of the retail industry deepens, consumers are now at the center of the entire industry ecosystem.
3600 0
能够管理ASM instance的三种角色
能够管理ASM instance的角色有三种,他们的分工如下:组描述     OS指定的组      具有的权限    能做的事情OSASM      asmadmin        SYSASM           ASM所有管理工作OSDBA      asmdb...
1059 0
resx文件在X64位编译,提示“未能加载文件或程序集”的问题?
原文:resx文件在X64位编译,提示“未能加载文件或程序集”的问题? resx文件在X64位编译,提示“未能加载文件或程序集”的问题? 解答: 错误现象如下 此问题最多在VS2010或者(SP1)上出现过,属于VS2010的缺陷,估计在VS更高的版本不会出现此问题。
1019 0
【《Objective-C基础教程 》笔记】(七)OC的关键字用意小结
1.  #import     #import 从system目录中查找头文件,不会检查当前目录。     #import "" 首先在当前目录中查找,如果未找到,则在Xcode设置的预处理程序搜索路径中查找文件。
690 0
Silverlight 4 MVVM开发方式(二)
转自http://www.dotblogs.com.tw/help/archive/2010/07/29/16883.aspx   做好通讯录之后,为了炫耀​​,小黑很得意的拿给上司小柯看,也很理所当然的被打枪! 『为什么每次ADD后,左边的列表全都被改变了? 有人输入年龄的吗?是要每年都去修改一次喔? 说到修改,到底要怎么改??』 小黑只好摸摸鼻子,回去跟卡玛商量。
751 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
spark替代HIVE实现ETL作业
立即下载
大批量处理excel文件到ODPS中方案
立即下载
Hive Bucketing in Apache Spark
立即下载