hadoop归档、压缩

配额:
    目录配额:hdfs dfsadmin -setQuota
    空间配额:hdfs dfsadmin -setSpaceQuota    块大小x副本数

快照:
    和Linux的硬链接类似,作为数据块的引用
    原文件发生改变,快照不会改变

回收站:
    core-site.xml

    hdfs dfs -expunge

序列化
    序列化是将结构化对象转化为字节流
    序列化出现的领域:
        进程间通信
        永久存储

    hadoop中的进程间通信是通过RPC实现的,
    RPC是一种协议,使用的是序列化技术


    特点:
        紧凑
        快速
        可扩展
        支持互操作

    writable:是java中基本类型的封装

        int    ==> intWritable
        String    ==> Text

hadoop归档文件:har
    
    1文件 ====> 150字节
    hadoop archive -archiveName my.har /data data1 data2 /        //启动yarn
    hdfs dfs -lsr har:///my.har

hadoop的压缩:
    deflate(default)
    gzip
    bzip2
    lzo
    lz4
    snappy



    .deflate压缩耗时:    1029    压缩大小:    1646396        .deflate解压耗时:    841 
    .gz压缩耗时:        405    压缩大小:    1646408        .gz解压耗时:        173 
    .bz2压缩耗时:        4347    压缩大小:    1139847        .bz2解压耗时:        1225
    .lz4压缩耗时:        68    压缩大小:    2531023        .lz4解压耗时:        104 

    压缩效率:lz4 < gzip < deflate < bzip2
    解压效率:lz4 < gzip < deflate < bzip2
    压缩占比:bzip2 < deflate < gzip < lz4


引入lzo依赖:pom
    <!-- Lzo的依赖 -->
    <dependency>
            <groupId>org.anarres.lzo</groupId>
            <artifactId>lzo-hadoop</artifactId>
            <version>1.0.0</version>
        </dependency>


    apache的hadoop默认不支持snappy:
        1、将s101的hadoop配置文件的etc文件夹备份到~下
            mv /soft/hadoop/etc ~
        2、删除/soft/hadoop-2.7.3目录'
            rm -rf /soft/hadoop-2.7.3
        3、将hadoop-2.7.3_snappy.tar.gz发送到s101,并解压到/soft目录
            tar -xzvf hadoop-2.7.3_snappy.tar.gz -C /soft
        4、将新文件夹的etc目录删除
            rm -rf /soft/hadoop-2.7.3/etc
        5、将备份的etc文件夹移动到/soft/hadoop即可
            mv ~/etc /soft/hadoop/


将代码稍作修改,将其打成jar放在Linux上运行
    1、修改代码
    2、在idea上进行build
        <build>
            <plugins>
                <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
                </plugin>
                <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                    <manifest>
                        <mainClass>com.oldboy.compression.TestCodec</mainClass>
                    </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                        <goal>single</goal>
                    </goals>
                    </execution>
                </executions>
                </plugin>
                
            </plugins>
            </build>

.deflate压缩耗时:       763     压缩大小:       1646396 .deflate解压耗时:       254
.gz压缩耗时:        294     压缩大小:       1646408 .gz解压耗时:    89
.bz2压缩耗时:        2992    压缩大小:       1139847 .bz2解压耗时:   730
.lz4压缩耗时:        70      压缩大小:       2531023 .lz4解压耗时:   81
.lzo_deflate压缩耗时:   184     压缩大小:       2564953 .lzo_deflate解压耗时:   148
.snappy压缩耗时:        65      压缩大小:       2563606 .snappy解压耗时:        47

    
    压缩效率:snappy <  lz4 < lzo < gzip < deflate < bzip2
    解压效率:snappy <  lz4 < gzip < lzo < deflate < bzip2
    压缩占比:bzip2 < deflate < gzip < lz4 < snappy < lzo


    所以,在生产环境中,序列化或者网络间传输数据一般都使用压缩技术
    平衡硬件占用率:压缩使用cpu的多线程实现,解决空间占用和网络带宽的消耗


解决小文件:
    har        //hadoop archive
    压缩        //codec
    序列文件    //sequenceFile



sequenceFile:序列文件

    SeqFile是扁平化文件包含二进制的K-V

    SequenceFile在内部支持压缩,并包括以下三种压缩类型:
        不压缩:    //不压缩
        记录压缩:    //只压缩value
        块压缩 :    //k-v以block的形式聚合在一起并进行压缩,block可配置

    SequenceFile的数据格式:
        版本:        //包括3个字节的SEQ,和真实版本号(e.g. SEQ4 or SEQ6)
        key的类名    //e.g. org.apache.hadoop.io.IntWritabe
        value的类名    //
        是否压缩    //boolean
        是否是块压缩    //boolean
        压缩编解码器    //compression codec
        元数据        //真实数据
        同步点        //
    

    创建SeqFile:1、
    读取SeqFile:12、hdfs dfs -text file:///F:/seq/1.seq


    sequenceFile可切割:
        1、物理切割:hdfs块切割
        2、逻辑切割:mapreduce计算单位是行,所以文件需要逻辑可切割
                 即在文件的任意位置都能定位到文件数据
                 能够进行逻辑切割的文件形式:
                1)bzip2压缩    //自带压缩
                2)Lzo压缩    //手动加索引
                        //LzoIndexer indexer = new LzoIndexer(conf);
                        //indexer.index(new Path(lzoPath));

                3)sequenceFile    //通过同步点(sync)机制获取数据定位,并进行计算
    

SequenceFile的seek和Sync:
    seek:硬性定位指针,从此位置开始读取
    sync:定位到最近同步点(当前位置之后的),从同步点读取数据


SequenceFile的sort:


MapFile:排序且带索引的seqFile
    index:        //索引数据
            //key= data中的key
              value = 条目的position

    data:        //真实数据

            
    
SeqFile转换为Mapfile
    
    person ===> personWritable

    通过personWritable形式将person对象,转化为SequenceFile

    MapFile.fix( fs, p, IntWritable.class, Text.class, false, conf);    //必须是false


SequenceFile三种压缩类型:
    不压缩:    //不压缩
    记录压缩:    //只压缩value
    块压缩:    //





创建SequenceFile或压缩编解码器出现异常:


    1、在windows的cmd中输入hadoop version测试版本,如果出现版本号则下一步    //环境变量
    2、输入winutils,如果出现错误,需要安装vc++运行库            //vc++运行库缺失



maven:
    项目构建、依赖管理和项目信息管理
    配置maven环境变量:
        1、M2_HOME=E:\Program\apache-maven-3.5.0
        2、PATH
        3、在cmd中输入mvn -v

    %M2_HOME%下的conf文件夹里面的settings.xml文件是非常重要的文件

    0、创建pom文件:pom.xml
        <?xml version="1.0"?>
        <project>
            <modelVersion>4.0.0</modelVersion>

            <groupId>com.oldboy</groupId>
            <artifactId>helloworld</artifactId>
            <version>1.0</version>
        </project>

    1、创建一个文件夹,并在文件夹中打开cmd,并输入以下命令创建文件夹
        md src\main\java\com\oldboy\helloworld

    2、使得pom.xml文件和src文件夹保持在相同目录下

    3、在helloworld文件夹编写HelloWorld.java
        package com.oldboy.helloworld;
        public class HelloWorld{
            public static void main(String[] args){
                System.out.println("Hello world");
            }
        }

    4、在pom文件所在目录下输入mvn clean compile

        mvn clean    //删除target文件夹
            compile    //编译
            package    //打包
            archetype:generate    //生成项目骨架


        
        
public class TestSeqCompress {

    public static void main(String[] args) throws Exception {
        System.setProperty("HADOOP_USER_NAME","centos");
        Configuration conf  = new Configuration();

        conf.set("fs.defaultFS","file:///");//这一步需要在FileSystem之前,如果在之后,就是先连接Hadoop在设置成本地,
                                            //导致后面使用的conf还是Hadoop的,set就没有意义了。

        FileSystem fs = FileSystem.get(conf);//连接系统
        CompressionCodec cos = (CompressionCodec)ReflectionUtils.newInstance(LzoCodec.class, conf);

        Path p = new Path("file:///D:/e/2.seq");

        SequenceFile.Writer writer =  SequenceFile.createWriter(fs,conf,p,IntWritable.class,Text.class,
                SequenceFile.CompressionType.NONE);
        //IntWritable key = new IntWritable(1);
        //Text value = new Text("hello"+1);
        for(int i = 1;i<100;i++){
            Random r = new Random();
            int j = r.nextInt(1000);
            IntWritable key = new IntWritable(j);
            Text value = new Text("tom"+i);
            writer.append(key,value);
        }

        writer.close();
        //System.out.println();
    }

}

 

posted on 2018-06-25 16:58  飞机耳朵  阅读(480)  评论(0编辑  收藏  举报

导航