分享

今天遇到个题 让我列出至少两个hadoop压缩的方式,具体该怎么压缩,如何实现

rsgg03 发表于 2013-11-1 23:31:02 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 2 5155
今天遇到个题  让我列出至少两个hadoop压缩的方式,hadoop都有什么压缩方式?具体该怎么压缩,如何实现

欢迎大家如about云官方群371358502,更新咨询,更新资源,随时关注

已有(2)人评论

跳转到指定楼层
yuwenge 发表于 2013-11-1 23:32:17
Gzip,low这两种压缩方式
回复

使用道具 举报

yuwenge 发表于 2013-11-1 23:36:24

实现可以参考下面内容:
文件的压缩有两大好处:1、可以减少存储文件所需要的磁盘空间;2、可以加速数据在网络和磁盘上的传输。尤其是在处理大数据时,这两大好处是相当重要的。  下面是一个使用gzip工具压缩文件的例子。将文件/user/hadoop/aa.txt进行压缩,压缩后为/user/hadoop/text.gz
  1. package com.hdfs;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.net.URI;
  6. import org.apache.hadoop.conf.Configuration;
  7. import org.apache.hadoop.fs.FSDataInputStream;
  8. import org.apache.hadoop.fs.FSDataOutputStream;
  9. import org.apache.hadoop.fs.FileSystem;
  10. import org.apache.hadoop.fs.Path;
  11. import org.apache.hadoop.io.IOUtils;
  12. import org.apache.hadoop.io.compress.CompressionCodec;
  13. import org.apache.hadoop.io.compress.CompressionCodecFactory;
  14. import org.apache.hadoop.io.compress.CompressionInputStream;
  15. import org.apache.hadoop.io.compress.CompressionOutputStream;
  16. import org.apache.hadoop.util.ReflectionUtils;
  17. public class CodecTest {
  18. //压缩文件
  19. public static void compress(String codecClassName) throws Exception{
  20. Class<?> codecClass = Class.forName(codecClassName);
  21. Configuration conf = new Configuration();
  22. FileSystem fs = FileSystem.get(conf);
  23. CompressionCodec codec = (CompressionCodec)ReflectionUtils.newInstance(codecClass, conf);
  24. //指定压缩文件路径
  25. FSDataOutputStream outputStream = fs.create(new Path("/user/hadoop/text.gz"));
  26. //指定要被压缩的文件路径
  27. FSDataInputStream in = fs.open(new Path("/user/hadoop/aa.txt"));
  28. //创建压缩输出流
  29. CompressionOutputStream out = codec.createOutputStream(outputStream);
  30. IOUtils.copyBytes(in, out, conf);
  31. IOUtils.closeStream(in);
  32. IOUtils.closeStream(out);
  33. }
  34. //解压缩
  35. public static void uncompress(String fileName) throws Exception{
  36. Class<?> codecClass = Class.forName("org.apache.hadoop.io.compress.GzipCodec");
  37. Configuration conf = new Configuration();
  38. FileSystem fs = FileSystem.get(conf);
  39. CompressionCodec codec = (CompressionCodec)ReflectionUtils.newInstance(codecClass, conf);
  40. FSDataInputStream inputStream = fs.open(new Path("/user/hadoop/text.gz"));
  41. //把text文件里到数据解压,然后输出到控制台
  42. InputStream in = codec.createInputStream(inputStream);
  43. IOUtils.copyBytes(in, System.out, conf);
  44. IOUtils.closeStream(in);
  45. }
  46. //使用文件扩展名来推断二来的codec来对文件进行解压缩
  47. public static void uncompress1(String uri) throws IOException{
  48. Configuration conf = new Configuration();
  49. FileSystem fs = FileSystem.get(URI.create(uri), conf);
  50. Path inputPath = new Path(uri);
  51. CompressionCodecFactory factory = new CompressionCodecFactory(conf);
  52. CompressionCodec codec = factory.getCodec(inputPath);
  53. if(codec == null){
  54. System.out.println("no codec found for " + uri);
  55. System.exit(1);
  56. }
  57. String outputUri = CompressionCodecFactory.removeSuffix(uri, codec.getDefaultExtension());
  58. InputStream in = null;
  59. OutputStream out = null;
  60. try {
  61. in = codec.createInputStream(fs.open(inputPath));
  62. out = fs.create(new Path(outputUri));
  63. IOUtils.copyBytes(in, out, conf);
  64. } finally{
  65. IOUtils.closeStream(out);
  66. IOUtils.closeStream(in);
  67. }
  68. }
  69. public static void main(String[] args) throws Exception {
  70. //compress("org.apache.hadoop.io.compress.GzipCodec");
  71. //uncompress("text");
  72. uncompress1("hdfs://master:9000/user/hadoop/text.gz");
  73. }
  74. }
复制代码
 首先执行77行进行压缩,压缩后执行第78行进行解压缩,这里解压到标准输出,所以执行78行会再控制台看到文件/user/hadoop/aa.txt的内容。如果执行79行的话会将文件解压到/user/hadoop/text,他是根据/user/hadoop/text.gz的扩展名判断使用哪个解压工具进行解压的。解压后的路径就是去掉扩展名。  进行文件压缩后,在执行命令./hadoop fs -ls /user/hadoop/查看文件信息,如下:
  1. [hadoop@master bin]$ ./hadoop fs -ls /user/hadoop/
  2. Found 7 items
  3. -rw-r--r-- 3 hadoop supergroup 76805248 2013-06-17 23:55 /user/hadoop/aa.mp4
  4. -rw-r--r-- 3 hadoop supergroup 520 2013-06-17 22:29 /user/hadoop/aa.txt
  5. drwxr-xr-x - hadoop supergroup 0 2013-06-16 17:19 /user/hadoop/input
  6. drwxr-xr-x - hadoop supergroup 0 2013-06-16 19:32 /user/hadoop/output
  7. drwxr-xr-x - hadoop supergroup 0 2013-06-18 17:08 /user/hadoop/test
  8. drwxr-xr-x - hadoop supergroup 0 2013-06-18 19:45 /user/hadoop/test1
  9. -rw-r--r-- 3 hadoop supergroup 46 2013-06-19 20:09 /user/hadoop/text.gz
复制代码
第4行为压缩之前的文件,大小为520个字节。第9行为压缩后的文件,大小为46个字节。由此可以看出上面讲的压缩的两大好处了。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条