Hadoop序列化

Posted Queenie攀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop序列化相关的知识,希望对你有一定的参考价值。

hadoop序列化:
序列化:将对象序列化成字节序列 (方便磁盘存储和网络传输)
反序列化:将字节序列转换成对象

hadoop的序列化的优点:(只对数据进行序列化)
紧凑  快速 可扩展  可以跨语言交互

序列化
步骤1:
使用Writer接口
    implements Writable
步骤2
      /**
     * 注意点:
     * 1.序列化数据的时候,序列化的数据类型要对应
     * write这个是hadoop提供的序列化方法
     * @param dataOutput
     * @throws IOException
     */
    public void write(DataOutput dataOutput) throws IOException {
        
    }

    /**
     * 注意点:
     * 一定要注意反序列化变量赋值的顺序,要和序列化顺序保持一致
     * readFields :hadoop 提供的反序列化方法
     * @param dataInput
     * @throws IOException
     */
    public void readFields(DataInput dataInput) throws IOException {
       
    }
    

job的提交流程:
waitForCompletion提交任务的入口方法
    this.submit(); 提交job任务
        this.ensureState(Job.JobState.DEFINE);再次确认我们job的状态(DEFINE)
        this.connect();判断任务是在本地运行还是远程集群中运行(连接yarn)
        submitter.submitJobInternal() 任务提交者提交任务
            this.checkSpecs(job); 检查文件的输出路径是否存在
                checkOutputSpecs()检查文件的输出路径是否存在,没有设置报异常,已经存在也报异常
            addMRFrameworkToDistributedCache(conf); 将配置信息加载到分布式缓存中
            this.submitClient.getNewJobID(); 获取一个任务的id
            this.writeSplits(job, submitJobDir);获取切片数量,并将切片文件信息写入到submitJobFile文件夹下
            this.writeConf(conf, submitJobFile);将配置信息写入到submitJobFile文件夹下
            
            this.submitClient.submitJob 真正提交job任务
            
        this.state = Job.JobState.RUNNING;任务提交完毕,将状态改为RUNNING
        
    this.isSuccessful();任务执行成功还是失败:返回true表示任务执行成功,返回flase任务执行失败
    
FileInputFormat
    getSplits:1.如何进行切片 2.可不可以切片this.isSplitable(job, path)
        for(bytesRemaining = length; (double)bytesRemaining / (double)splitSize > 1.1D; bytesRemaining -= splitSize) {
                                blkIndex = this.getBlockIndex(blkLocations, length - bytesRemaining);
                                splits.add(this.makeSplit(path, length - bytesRemaining, splitSize, blkLocations[blkIndex].getHosts(), blkLocations[blkIndex].getCachedHosts()));
                            }

        if (bytesRemaining != 0L) {
            blkIndex = this.getBlockIndex(blkLocations, length - bytesRemaining);
            splits.add(this.makeSplit(path, length - bytesRemaining, bytesRemaining, blkLocations[blkIndex].getHosts(), blkLocations[blkIndex].getCachedHosts()));
        }
        
        如何自定义设置切片的大小参考课件3.1.3 默认情况下切片的切块大小是块大小128M
        
        
        
hadoop自带得inputformat
TextInputFormat   使用得是FileInput..得切片方法     LineRecordReader(将文件以kv值得形式返回)
NLineInputFormat  自定义了切片方法(按行切片)      LineRecordReader
CombineTextInputFormat 自定义了切片方法(按照设置得大小切片) CombineFileRecordReader
FixedLengthInputFormat 使用得是FileInput..得切片方法     FixedLengthRecordReader(返回得都是固定长度得value)

KeyValueTextInputFormat 使用得是FileInput..得切片方法  KeyValueLineRecordReader(key是一行中得第一个单词,value是一行中除了第一个单词之后得字符串)
SequenceFileInputFormat  使用得是FileInput..得切片方法    SequenceFileRecordReader(二进制得数据)

注意一般情况下够用,但是特殊情况需要我们自定义
   

以上是关于Hadoop序列化的主要内容,如果未能解决你的问题,请参考以下文章

大数据之Hadoop(MapReduce):Hadoop序列化

Hadoop序列化

深入对比Java与Hadoop大数据序列化机制Avro

Hadoop 序列化操作

Hadoop序列化与Writable接口

Hadoop-序列化