• 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(二进制得数据)

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

  • 相关阅读:
    P1308 统计单词数
    P1055 ISBN号码
    InterlockedCompareExchange 原子操作
    InterlockedCompareExchange 原子操作
    VS2015 定位内存泄露
    VS2015 定位内存泄露
    const volatile mutable修饰变量的区别
    const volatile mutable修饰变量的区别
    HWND、HANDLE、HMODULE、HINSTANCE的区别
    CodeIgniter框架中关于URL重写(index.php)的二三事
  • 原文地址:https://www.cnblogs.com/qu125-tf/p/12098635.html
Copyright © 2020-2023  润新知