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

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

Distcp 跨集群同步

1. 使用方法及原理

hadoop distcp srcPath tarPath
会把srcPath和tarPath下的所有目录、文件信息放入到 _distcp_src_files 和 _distcp_dst_files 两个临时文件中,具体文件内容的拷贝工作交给多个map任务,会导致一个问题,就是文件过多那么map任务数就会很多,每个datanode有一个上限,极少数情况下可能会超过上限,导致数据文件拷贝不全。

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

private Path createMetaFolderPath() throws Exception {
Configuration configuration = this.getConf();
Path stagingDir = JobSubmissionFiles.getStagingDir(new Cluster(configuration), configuration);
Path metaFolderPath = new Path(stagingDir, "_distcp" + String.valueOf(rand.nextInt()));
return metaFolderPath;
}

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

protected Path getFileListingPath() throws IOException {
String fileListPathStr = this.metaFolder + "/fileList.seq";
Path path = new Path(fileListPathStr);
return new Path(path.toUri().normalize().toString());
}

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

private Job createJob() throws IOException {
job.setInputFormatClass(DistCpUtils.getStrategy(this.getConf(), this.context));
job.setJarByClass(CopyMapper.class);
return job;
}

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. 几个问题

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

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

2.3 长尾问题 ?

3. 分区表的跨集群同步问题

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

分区表还需要手动添加分区,alter table xxx add if not exists partition(key1="value1", key2="value2") partition(key1="value3", key2="value4")

hive shell 通过 msck repair table xxx 可以自动去读取hdfs下文件信息,来添加元数据中不存在的分区信息,但是存在jdbc连接时不识别 msck 指令的情况

Distcp 跨集群同步的更多相关文章

  1. Kafka 跨集群同步方案(转)

    来自:http://tangzhaohui.net/524 Kafka 跨集群同步方案——Kafka内置的MirrorMaker工具 该方案解决Kafka跨集群同步.创建Kafka集群镜像等相关问题, ...

  2. Kafka跨集群同步工具——MirrorMaker

    MirrorMaker是为解决Kafka跨集群同步.创建镜像集群而存在的.下图展示了其工作原理.该工具消费源集群消息然后将数据又一次推送到目标集群. watermark/2/text/aHR0cDov ...

  3. MongoDB集群跨网络、跨集群同步方案

    MongoDB集群跨网络.跨集群数据同步有以下几个方案,此处只是简单介绍,不过详细描述. 1.MongoDB自带的复制方案 优点:实施简单,不需要额外的技术栈 缺点:网络双向可连通. 2.CDC同步方 ...

  4. Kafka MirrorMaker 跨集群同步工具

    一.MirrorMaker介绍 MirrorMaker是Kafka附带的一个用于在Kafka集群之间制作镜像数据的工具.该工具从源集群中消费并生产到目标群集.这种镜像的常见用例是在另一个数据中心提供副 ...

  5. Kafka的基本概念与安装指南(单机+集群同步)

    最近在搞spark streaming,很自然的前端对接的就是kafka.不过在kafka的使用中还是遇到一些问题,比如mirrormaker莫名其妙的丢失数据[原因稍后再说],消费数据offset错 ...

  6. Elasticsearch 主从同步之跨集群复制

    文章转载自:https://mp.weixin.qq.com/s/alHHxXont6XFm_m9PfsGfw 1.什么是跨集群复制? 跨集群复制(Cross-cluster replication, ...

  7. Hadoop 跨集群访问

    [原文地址] 跨集群访问 发表于 2015-06-01   |   简单总结下跨集群访问的多种方式. 跨集群访问HDFS 直接给出HDFS URI 我们平常执行hadoop fs -ls /之类的操作 ...

  8. Hadoop跨集群迁移数据(整理版)

    1. 什么是DistCp DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具.它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成.它把文件和目录的列表作为map任务的 ...

  9. Hive跨集群迁移

    Hive跨集群迁移数据工作是会出现的事情, 其中涉及到数据迁移, metastore迁移, hive版本升级等. 1. 迁移hdfs数据至新集群hadoop distcp -skipcrccheck ...

随机推荐

  1. golang map学习

    当对map只声明时,由于map为引用类型,所以默认值为nil,但对nil map 而言,支持read ,但不支持write 当执行write操作时, 会抛出panic异常; 代码如下: func Te ...

  2. Windows批处理(cmd/bat)常用命令学习

    前言 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务.用户只需双击批处理文件便可执行任务,而无需重复输入相同指令.编写批处理文件非常简单,但难点在于确保一切按顺序 ...

  3. 刷题[GXYCTF2019]禁止套娃

    梳理思路 打开网站,发现很简单,只有flag在哪里的字样. 查看源码,常用后台目录,robots.txt,都未发现有任何东西. 扫描 直接拉进扫描器一扫,发现 思考可能是git源码泄露,可能可以恢复源 ...

  4. Mac更换鼠标指针样式_mousecape教程

    mousecape项目介绍 这是github上的一个项目,作者是alexzielenski. 项目是用于修改Mac系统鼠标样式的,支持动态鼠标样式. 该项目停止更新于2014年,目前仍可以被较新的系统 ...

  5. Urule开源版系列5——RuleSetParser解析过程

    接上期Urule开源版系列4--Core包核心接口之规则解析过程 之前源码到了Parser,这期详细解析下RuleSetParser的解析过程 1.主流程 特殊处理一个属性 循环处理元素 当元素名称是 ...

  6. 这么设计,Redis 10亿数据量只需要100MB内存

    本文主要和大家分享一下redis的高级特性:bit位操作. 本文redis试验代码基于如下环境: 操作系统:Mac OS 64位 版本:Redis 5.0.7 64 bit 运行模式:standalo ...

  7. 本地保存cookie

    原文https://blog.csdn.net/qq_29663071/article/details/73826642 https://www.cnblogs.com/webcome/p/54709 ...

  8. Go-常量-const

    常量:只能读,不能修改,编译前就是确定的值 关键字: const 常量相关类型:int8,16,32,64 float32,64 bool string 可计算结果数学表达式 常量方法 iota pa ...

  9. 使用SSM框架实现Sql数据导出成Excel表

    SSM框架实现SQL数据导出Excel 思路 首先在前端页面中添加一个导出功能的button,然后与后端controller进行交互. 接着在相应的controller中编写导出功能方法. 方法体: ...

  10. 实验 5:OpenFlow 协议分析和 OpenDaylight 安装

    一.实验目的 回顾 JDK 安装配置,了解 OpenDaylight 控制的安装,以及 Mininet 如何连接;通过抓包获取 OpenFlow 协议,验证 OpenFlow 协议和版本,了解协议内容 ...