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(二进制得数据)
注意一般情况下够用,但是特殊情况需要我们自定义