DistCp迁移Hive数据过程中源集群增加删除文件等场景测试

1 概述

  由于在数据迁移过程中,上层任务仍在运行,会出现源集群新增文件及删除文件的情况,因此进行测试

2 需要同步的数据文件说明

  源集群:192.168.40.100:8020,目标集群:192.168.40.200:8020
  数据目录及其大小如下

1.8 G    5.5 G    /user/hive/warehouse/iot.db/dwd_pollution_distcp

  这个文件对应的表为dwd_pollution_distcp,共有20140801-20140930这些分区

3 元数据迁移

  源集群与目标集群元数据存储都是采用pg,pg库迁移如下:
  ①新主机PostgreSQL需要事先建立和原主机名称相同的用户和数据库
  ②备份原主机数据库,格式:pg_dump -U -p >
  在源集群的pg库中导出数据

./pg_dump -U hive-p 5432 hive > ./hive_meta.sql

  ③导入数据到新主机
  再目标集群的pg库执行导入命令

./psql -U hive -p 5432 hive < hive_meta.sql

4 源集群新增文件测试

4.1 执行distcp命令

hadoop distcp -p hdfs://192.168.40.100:8020/user/hive/warehouse/iot.db/dwd_pollution_distcp hdfs://192.168.40.200:8020/user/hive/warehouse/iot.db/ 

  distcp执行期间执行如下SQL,插入数据到新分区

insert overwrite table iot.dwd_pollution_distcp partition(stat_date) 
select ozone,particullate_matter,carbon_monoxide,sulfure_dioxide,nitrogen_dioxide,longitude,latitude,date_time,"20201021" as stat_date from iot.dwd_pollution

  任务完成,并且没有报错

...
20/10/21 11:16:21 INFO mapreduce.Job: Job job_1602207790062_0240 completed successfully
20/10/21 11:16:21 INFO mapreduce.Job: Counters: 38File System CountersFILE: Number of bytes read=0FILE: Number of bytes written=4923884FILE: Number of read operations=0FILE: Number of large read operations=0FILE: Number of write operations=0HDFS: Number of bytes read=5921518162HDFS: Number of bytes written=5921449140HDFS: Number of read operations=1962HDFS: Number of large read operations=0HDFS: Number of write operations=1249HDFS: Number of bytes read erasure-coded=0Job Counters Launched map tasks=22Other local map tasks=22Total time spent by all maps in occupied slots (ms)=3720826Total time spent by all reduces in occupied slots (ms)=0Total time spent by all map tasks (ms)=3720826Total vcore-milliseconds taken by all map tasks=3720826Total megabyte-milliseconds taken by all map tasks=3810125824Map-Reduce FrameworkMap input records=245Map output records=0Input split bytes=2530Spilled Records=0Failed Shuffles=0Merged Map outputs=0GC time elapsed (ms)=4309CPU time spent (ms)=167940Physical memory (bytes) snapshot=8456990720Virtual memory (bytes) snapshot=59629797376Total committed heap usage (bytes)=13333692416Peak Map Physical memory (bytes)=418676736Peak Map Virtual memory (bytes)=2735362048File Input Format Counters Bytes Read=66492File Output Format Counters Bytes Written=0DistCp CountersBandwidth in Btyes=69105400Bytes Copied=5921449140Bytes Expected=5921449140Files Copied=182DIR_COPY=63

4.2 数据文件核对

  源集群文件大小

[hdfs@hadoop-local-02 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/iot.db/dwd_pollution_distcp
5.7 G  17.1 G  /user/hive/warehouse/iot.db/dwd_pollution_distcp[hdfs@hadoop-local-02 ~]$ hdfs dfs -ls /user/hive/warehouse/iot.db/dwd_pollution_distcp/
Found 63 items

  目标集群文件大小

[hdfs@hadoop-cdh-03 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/iot.db/dwd_pollution_distcp
5.5 G  16.5 G  /user/hive/warehouse/iot.db/dwd_pollution_distcp
[hdfs@hadoop-cdh-03 ~]$ hdfs dfs -ls /user/hive/warehouse/iot.db/dwd_pollution_distcp/
Found 62 items

  发现再执行DistCp过程中插入的数据不影响DistCp的使用,但是插入的数据不能及时发现

4.3 源集群新增文件处理方法

  可以重新执行命令使用DistCp的update参数更新增量数据

hadoop distcp -update -p hdfs://192.168.40.100:8020/user/hive/warehouse/iot.db/dwd_pollution_distcp hdfs://192.168.40.200:8020/user/hive/warehouse/iot.db/dwd_pollution_distcp

4.4 核对更新后文件是否一致

  (1)文件核对
  源集群文件大小

[hdfs@hadoop-local-02 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/iot.db/dwd_pollution_distcp
5.7 G  17.1 G  /user/hive/warehouse/iot.db/dwd_pollution_distcp[hdfs@hadoop-local-02 ~]$ hdfs dfs -ls /user/hive/warehouse/iot.db/dwd_pollution_distcp/
Found 63 items

  目标集群文件大小

[hdfs@hadoop-cdh-03 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/iot.db/dwd_pollution_distcp
5.7 G  17.1 G  /user/hive/warehouse/iot.db/dwd_pollution_distcp
[hdfs@hadoop-cdh-03 ~]$ hdfs dfs -ls /user/hive/warehouse/iot.db/dwd_pollution_distcp/
Found 63 items

  (2)SQL核对
  首先在目标集群修复分区,因为新插入的那个分区元数据在目标集群的hive元数据中没有

hive> MSCK REPAIR TABLE dwd_pollution_distcp;

  源集群hive查询条数

hive> select count(*) from iot.dwd_pollution_distcp;
OK
138250266

  目标集群hive查询条数

hive> select count(*) from iot.dwd_pollution_distcp;
OK
138250266

5 源集群删除文件测试

  这里所说的删除文件是指SQL在执行的时候执行了overwrite操作,会先删除原有数据在新增。测试前清空目标集群中迁移过去的数据,源集群恢复最原始状态

5.1 执行distcp命令

hadoop distcp -p hdfs://192.168.40.100:8020/user/hive/warehouse/iot.db/dwd_pollution_distcp hdfs://192.168.40.200:8020/user/hive/warehouse/iot.db/ 

  distcp执行期间执行如下SQL,会将这个表的20140801-20140930分区先删除再新增数据

insert overwrite table iot.dwd_pollution_distcp partition(stat_date) 
select ozone,particullate_matter,carbon_monoxide,sulfure_dioxide,nitrogen_dioxide,longitude,latitude,date_time,stat_date as stat_date from iot.dwd_pollution

  错误信息如下

Caused by: java.io.IOException: Couldn't run retriable-command: Copying hdfs://192.168.40.100:8020/user/hive/warehouse/iot.db/dwd_pollution_distcp/stat_date=20140810/000008_0 to hdfs://192.168.40.200:8020/user/hive/warehouse/iot.db/dwd_pollution_distcp/stat_date=20140810/000008_0at org.apache.hadoop.tools.util.RetriableCommand.execute(RetriableCommand.java:101)at org.apache.hadoop.tools.mapred.CopyMapper.copyFileWithRetry(CopyMapper.java:256)... 10 more
Caused by: java.io.FileNotFoundException: File does not exist: /user/hive/warehouse/iot.db/dwd_pollution_distcp/stat_date=20140810/000008_0at org.apache.hadoop.hdfs.server.namenode.INodeFile.valueOf(INodeFile.java:85)at org.apache.hadoop.hdfs.server.namenode.INodeFile.valueOf(INodeFile.java:75)at org.apache.hadoop.hdfs.server.namenode.FSDirStatAndListingOp.getBlockLocations(FSDirStatAndListingOp.java:152)at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocations(FSNamesystem.java:1909)at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getBlockLocations(NameNodeRpcServer.java:735)at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getBlockLocations(ClientNamenodeProtocolServerSideTranslatorPB.java:415)at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:523)at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:991)at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:870)at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:816)at java.security.AccessController.doPrivileged(Native Method)at javax.security.auth.Subject.doAs(Subject.java:422)at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1875)at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2680)at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:423)at org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteException.java:121)at org.apache.hadoop.ipc.RemoteException.unwrapRemoteException(RemoteException.java:88)at org.apache.hadoop.hdfs.DFSClient.callGetBlockLocations(DFSClient.java:855)at org.apache.hadoop.hdfs.DFSClient.getBlockLocations(DFSClient.java:1768)at org.apache.hadoop.hdfs.DFSClient.getFileChecksumInternal(DFSClient.java:1714)at org.apache.hadoop.hdfs.DFSClient.getFileChecksumWithCombineMode(DFSClient.java:1744)at org.apache.hadoop.hdfs.DistributedFileSystem$33.doCall(DistributedFileSystem.java:1610)at org.apache.hadoop.hdfs.DistributedFileSystem$33.doCall(DistributedFileSystem.java:1607)at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)at org.apache.hadoop.hdfs.DistributedFileSystem.getFileChecksum(DistributedFileSystem.java:1619)at org.apache.hadoop.tools.mapred.RetriableFileCopyCommand.doCopy(RetriableFileCopyCommand.java:119)at org.apache.hadoop.tools.mapred.RetriableFileCopyCommand.doExecute(RetriableFileCopyCommand.java:99)at org.apache.hadoop.tools.util.RetriableCommand.execute(RetriableCommand.java:87)... 11 more

5.2 核对数据

  查看源集群文件,部分文件如下

[hdfs@hadoop-local-02 ~]$ hdfs dfs -du -h /user/hive/warehouse/iot.db/dwd_pollution_distcp
969.3 K  2.8 M    /user/hive/warehouse/iot.db/dwd_pollution_distcp/stat_date=20140801
1.7 M    5.0 M    /user/hive/warehouse/iot.db/dwd_pollution_distcp/stat_date=20140802
2.2 M    6.7 M    /user/hive/warehouse/iot.db/dwd_pollution_distcp/stat_date=20140803
2.5 M    7.4 M    /user/hive/warehouse/iot.db/dwd_pollution_distcp/stat_date=20140804
2.7 M    8.0 M    /user/hive/warehouse/iot.db/dwd_pollution_distcp/stat_date=20140805

  查看目标集群文件,部分文件如下

[hdfs@hadoop-cdh-03 ~]$ hdfs dfs -du -h /user/hive/warehouse/iot.db/dwd_pollution_distcp
969.3 K  2.8 M    /user/hive/warehouse/iot.db/dwd_pollution_distcp/stat_date=20140801
16.8 M   50.4 M   /user/hive/warehouse/iot.db/dwd_pollution_distcp/stat_date=20140802
2.2 M    6.7 M    /user/hive/warehouse/iot.db/dwd_pollution_distcp/stat_date=20140803
2.5 M    7.4 M    /user/hive/warehouse/iot.db/dwd_pollution_distcp/stat_date=20140804
26.6 M   79.8 M   /user/hive/warehouse/iot.db/dwd_pollution_distcp/stat_date=20140805

  发现数据完全核对不上

5.3 使用update与delete参数修复

  重新执行命令,并且加上update与delete参数

hadoop distcp -p -update -delete  hdfs://192.168.40.100:8020/user/hive/warehouse/iot.db/dwd_pollution_distcp hdfs://192.168.40.200:8020/user/hive/warehouse/iot.db/ 

  查看源集群文件大小与数据记录数

[hdfs@hadoop-local-02 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/iot.db/dwd_pollution_distcp/
376.5 M  1.1 G  /user/hive/warehouse/iot.db/dwd_pollution_distcphive> select count(*) from dwd_pollution_distcp;
OK
8919106
Time taken: 7.39 seconds, Fetched: 1 row(s)

  查看目标集群文件大小与数据记录数

[hdfs@hadoop-cdh-03 ~]$  hdfs dfs -du -s -h /user/hive/warehouse/iot.db/dwd_pollution_distcp/
376.5 M  1.1 G  /user/hive/warehouse/iot.db/dwd_pollution_distcphive> select count(*) from dwd_pollution_distcp;
OK
8919106
Time taken: 7.39 seconds, Fetched: 1 row(s)

  注意:hive要先执行MSCK REPAIR TABLE dwd_pollution_distcp进行分区修复,因为前面的测试导致分区元数据信息没更新

5.4 执行overwrite时的另一种情况

  前面测试的是overwrite时数据还没copy完,还有一种情况就是overwrite是数据已经copy完。测试前清空目标集群中迁移过去的数据
  (1)执行distcp

hadoop distcp -p hdfs://192.168.40.100:8020/user/hive/warehouse/iot.db/dwd_pollution_distcp hdfs://192.168.40.200:8020/user/hive/warehouse/iot.db/

  (2)在程序快执行完时执行SQL

insert overwrite table iot.dwd_pollution_distcp partition(stat_date) select ozone,particullate_matter,carbon_monoxide,sulfure_dioxide,nitrogen_dioxide,longitude,latitude,date_time,'20141001' as stat_date from iot.dwd_pollution;

  程序正常执行成功
  (3)查询未执行SQl前后20141001这个分区的数据量

  源集群执行前

345.3 K  1.0 M    /user/hive/warehouse/iot.db/dwd_pollution_distcp/stat_date=20141001

  源集群执行后

188.2 M  564.7 M  /user/hive/warehouse/iot.db/dwd_pollution_distcp/stat_date=20141001

  查看目标集群

345.3 K  1.0 M    /user/hive/warehouse/iot.db/dwd_pollution_distcp/stat_date=20141001

  (4)修复
  重新执行distcp命令加上update和delete参数

6 总结

  (1)disctp在拷贝过程中对源集群拷贝的文件夹下增加文件不影  响拷贝,但是这个增加的文件不会再拷贝列表中。后续可以通过update参数对这个增加的文件再进行迁移。

  (2)迁移的过程中老集群目录因sql执行了ovewrite删除了文件怎么办?
  分两种情况:①执行ovewrite的时候对应分区数据已经copy完,执行distcp程序不报错,只能在通过sql查看条数来判断

  ②执行ovewrite的时候对应分区数据没有copy完,执行distcp程序报错,可以通过-i参数忽略失败,那么其他没有影响的分区会正常copy处理:使用-update对文件进行更新(如果目的文件的名称和大小与源文件不同,则覆盖;若目的文件大小和名称与源文件相同则跳过),需要加-detele(如果目的目录存在源目录中不存在的文件,则删除;走hdfs垃圾回收站),如果该分区ovewrite之后数据减少,导致存在了老集群不存在的文件,需要将其删除

  (3)迁移了一半,任务失败了怎么办?

  ①-update配合-detele进行重新执行命令

  ②删除掉新集群中的脏数据,重新执行迁移命令。不加-overwrite参数,来跳过已存在的文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS6.0 yum php mcrypt 扩展安装问题

基本原理是&#xff1a;首先使mcrypt软件能够运行&#xff0c;然后安装php扩展模块&#xff0c;并在php.ini配置。 这里注意的是mcrypt软件依赖libmcrypt和mhash两个库&#xff0c;所以安装配置顺序从右至左 I 下载安装mcrypt 1.先去http://www.sourceforge.net 下载Libmcrypt,…

我不想用for循环

为什么要挑战自己在代码里不写for loop&#xff1f;因为这样可以迫使你去使用比较高级、地道的语法或库。文中以python为例子&#xff0c;讲了不少大家其实在别人的代码里都见过、但自己很少用的语法。 这是一个挑战。我要你避免在任何情况下写for循环。同样的&#xff0c;我也…

LeetCode 1654. 到家的最少跳跃次数(BFS)

文章目录1. 题目2. 解题1. 题目 有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发&#xff0c;到达它的家。 跳蚤跳跃的规则如下&#xff1a; 它可以 往前 跳恰好 a 个位置&#xff08;即往右跳&#xff09;。它可以 往后 跳恰好 b 个位置&#xff08;即往左跳&…

一台服务器上部署多个Terracotta的方法

在window server 2003 下&#xff0c;利用apache2.2.11tomcat6terracotta 群集不能复制session&#xff08;http://forums.terracotta.org/forums/posts/list/2342.page&#xff09; 其中提到更新服务器配置的方法&#xff1a; bin/tim-get.sh upgrade tc-config.xml 实际upgra…

Maven详解及实例

1 什么是Maven Maven对项目进行模型抽象&#xff0c;充分运用的面向对象的思想&#xff0c;Maven可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的软件项目管理工具。Maven 除了以程序构建能力为特色之外&#xff0c;还提供高级项目管理工具。简单的来说Maven是…

Python多线程详解

1、多线程的理解 多进程和多线程都可以执行多个任务&#xff0c;线程是进程的一部分。线程的特点是线程之间可以共享内存和变量&#xff0c;资源消耗少&#xff08;不过在Unix环境中&#xff0c;多进程和多线程资源调度消耗差距不明显&#xff0c;Unix调度较快&#xff09;&…

LeetCode 1655. 分配重复整数(回溯)

文章目录1. 题目2. 解题2.1 回溯1. 题目 给你一个长度为 n 的整数数组 nums &#xff0c;这个数组中至多有 50 个不同的值。 同时你有 m 个顾客的订单 quantity &#xff0c;其中&#xff0c;整数 quantity[i] 是第 i 位顾客订单的数目。请你判断是否能将 nums 中的整数分配给…

Flink的异步I/O及Future和CompletableFuture

1 概述 Flink在做流数据计算时&#xff0c;经常要外部系统进行交互&#xff0c;如Redis、Hive、HBase等等存储系统。系统间通信延迟是否会拖慢整个Flink作业&#xff0c;影响整体吞吐量和实时性。 如需要查询外部数据库以关联上用户的额外信息&#xff0c;通常的实现方式是向数…

MYSQL账户管理及主要操作

账户管理 在生产环境下操作数据库时&#xff0c;绝对不可以使用root账户连接&#xff0c;而是创建特定的账户&#xff0c;授予这个账户特定的操作权限&#xff0c;然后连接进行操作&#xff0c;主要的操作就是数据的crudMySQL账户体系&#xff1a;根据账户所具有的权限的不同&a…

LeetCode 1656. 设计有序流(数组)

文章目录1. 题目2. 解题1. 题目 有 n 个 (id, value) 对&#xff0c;其中 id 是 1 到 n 之间的一个整数&#xff0c;value 是一个字符串。不存在 id 相同的两个 (id, value) 对。 设计一个流&#xff0c;以 任意 顺序获取 n 个 (id, value) 对&#xff0c;并在多次调用时 按 …

#define typedef 区别

1) #define是预处理指令&#xff0c;在编译预处理时进行简单的替换&#xff0c;不作正确性检查&#xff0c;不关含义是否正确照样带入&#xff0c;只有在编译已被展开的源程序时才会发现可能的错误并报错。例如&#xff1a; #define PI 3.1415926 程序中的&#xff1a;areaPI*r…

flask框架+mysql数据库并与前台数据交互

在Flask使用数据库 我们将使用Flask-SQLAlchemy 的扩展来管理数据库。由SQLAlchemy项目提供的&#xff0c;已封装了关系对象映射&#xff08;ORM&#xff09;的一个插件。 ORMs允许数据库程序用对象的方式替代表和SQL语句。面向对象的操作被ORM转化为数据库命令。这样就意味着&…

Canal原理及其使用

1 什么是canal canal是用java开发的基于数据库增量日志解析&#xff0c;提供增量数据订阅&消费的中间件。目前&#xff0c;canal主要支持了MySQL的binlog解析&#xff0c;解析完成后才利用canal client 用来处理获得的相关数据。&#xff08;数据库同步需要阿里的otter中间…

LeetCode 1657. 确定两个字符串是否接近

文章目录1. 题目2. 解题1. 题目 如果可以使用以下操作从一个字符串得到另一个字符串&#xff0c;则认为两个字符串 接近 &#xff1a; 操作 1&#xff1a;交换任意两个 现有 字符。 例如&#xff0c;abcde -> aecdb操作 2&#xff1a;将一个 现有 字符的每次出现转换为另一…

Google C++编程风格指南(一):背景

Google 的项目大多使用 C开发。每一个 C程序员也都知道&#xff0c;C具有很多强大的语言特性&#xff0c;但这种强大不可避免的导致它的复杂&#xff0c;而复杂性会使得代码更容易出现 bug、难于阅读和维护。 本指南的目的是通过详细阐述如何进行 C编码来规避其复杂性&#xf…

机器学习简介及学习思维导图

什么是机器学习机器学习是人工智能的一个分支。人工智能的研究是从以“推理”为重点到以“知识”为重点&#xff0c;再到以“学习”为重点&#xff0c;一条自然、清晰的脉络。机器学习是实现人工智能的一个途径&#xff0c;即以机器学习为手段解决人工智能中的问题。机器学习算…

LeetCode 1658. 将 x 减到 0 的最小操作数(哈希)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums 和一个整数 x 。每一次操作时&#xff0c;你应当移除数组 nums 最左边或最右边的元素&#xff0c;然后从 x 中减去该元素的值。请注意&#xff0c;需要 修改 数组以供接下来的操作使用。 如果可以将 x 恰好 减到 0 &…

1057: [ZJOI2007]棋盘制作 - BZOJ

Description国际象棋是世界上最古老的博弈游戏之一&#xff0c;和中国的围棋、象棋以及日本的将棋同享盛名。据说国际象棋起源于易经的思想&#xff0c;棋盘是一个8*8大小的黑白相间的方阵&#xff0c;对应八八六十四卦&#xff0c;黑白对应阴阳。而我们的主人公小Q&#xff0c…

机器学习:Scikit-learn与特征工程

“数据决定了机器学习的上限&#xff0c;而算法只是尽可能逼近这个上限”&#xff0c;这句话很好的阐述了数据在机器学习中的重要性。大部分直接拿过来的数据都是特征不明显的、没有经过处理的或者说是存在很多无用的数据&#xff0c;那么需要进行一些特征处理&#xff0c;特征…

Mvc系统学习9——Areas学习

在Mvc2.0中&#xff0c;新增加了一个特性就是Areas。在没有有使用Areas的情况下&#xff0c;我们的Mvc项目组织是下面这样的。当项目庞大的时候&#xff0c;Controllers,Model,View文件下下面势必会有很多文件。项目将难以管理。 通过使用Areas使我们可以很好的组织项目&#x…