最新动态
Distcp 跨集群同步
2024-12-31 16:19

date: 2020-10-09 17:45:00
updated: 2020-10-10 17:45:00


org.apache.hadoop.tools.DistCp 类中会解析 srcPath tarPath ,将之前的临时文件先删除,然后一个含有随机数的临时文件夹路径


得到临时文件的路径,SequenceFile文件,即Key/Value结构的序列化文件,这个文件里将存放所有需要拷贝的源目录/文件信息列表。其中Key是源文件的Text格式的相对路径,即relPath;而Value则记录源文件的FileStatus格式的org.apache.hadoop.fs.FileStatus信息,这里FileStatus是hadoop已经封装好了的描述HDFS文件信息的类。


在createJob()里主要有两个地方需要注意


setInputFormatClass() 保证了mapper的数据读取格式是从getStrategy(getConf(), inputOptions)得到的,底层是由 UniformSizeInputFormat.class 类定义的,这个类继承自InputFormat.class,MR中所有的输入格式类都继承自InputFormat,这是一个抽象类。
InputFormat抽象类仅有两个抽象方法

  • ListgetSplits(),获取由输入文件计算出输入分片(InputSplit),解决数据或文件分割成片问题
  • RecordReader<K,V>createRecordReader(),创建RecordReader,从InputSplit中读取数据,解决读取分片中数据问题

CopyMapper.class中则定义了每个map的工作逻辑,也就是拷贝的核心逻辑。这个类里最核心的两个方法是 setup()和map()。setup()中完成map方法的一些初始化工作,在DISTCP中,这个方法里会设定对端的目标路径,并做一些参数设置和判断工作

而 map(Text relPath, CopyListingFileStatus sourceFileStatus, Context context) 中通过参数可以发现就是对UniformSizeInputFormat类里分片后的数据里的每一行进行处理,每行里存放的就是 fileList.seq文件每行的内容。

CommonCliOptions 解析命令行参数

2.1 文件数量过多,导致map过多,超过datanode上限,导致数据文件拷贝不全

2.2 提示信息非常少,如果是 调度器 -> 作业 -> distcp -> mrJob, 此时输出的信息应该是 mrJob的,也就是distcp的信息,而不是作业的信息,可能会导致调度器无法拿到作业执行信息从而导致作业调度失败

2.3 长尾问题 ?

不管是普通的表还是分区表,都需要刷新元数据,

分区表还需要手动添加分区,

    以上就是本篇文章【Distcp 跨集群同步】的全部内容了,欢迎阅览 ! 文章地址:https://sicmodule.kub2b.com/quote/17146.html 
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 企库往资讯移动站https://sicmodule.kub2b.com/mobile/,查看更多   
发表评论
0评