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(二進制得數據)
注意通常狀況下夠用,可是特殊狀況須要咱們自定義
緩存