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(二進制得數據)

注意通常狀況下夠用,可是特殊狀況須要咱們自定義
    緩存

相關文章
相關標籤/搜索