记一次数据迁移(hdfs、hbase、elasticsearch)

项目中需要进行国产化适配,需要把线上生产环境迁移到新国产化服务器集群上,记录一下数据迁移的实际操作情况

一、hdfs数据进行迁移

使用hadoop的命令distcp进行hdfs数据迁移:

  1. 单层目录结构
    命令格式如下:
hadoop distcp -update [源hdfs目录] [目的hdfs目录]  >> digtcp.log 2>&1

  实例如下:

hadoop distcp -update hdfs://32.20.33.148:9000/filepath hdfs://32.20.33.145:9000/filepath  >> digtcp_filepath.log 2>&1
  1. 多层目录结构
    命令格式如下:
hadoop distcp -f -update [源hdfs目录] [目的hdfs目录]  >> digtcp.log 2>&1

  实例如下:

hadoop distcp -f -update hdfs://32.20.33.148:9000/user hdfs://32.20.33.145:9000/user >> digtcp_user.log 2>&1

distcp的相关参数整理如下:

标识描述备注
-p[rbugpaxt]Preserve:
r: replication number
b: block size
u: user
g: group
p: permission
c: checksum-type
a: ACL
x: XAttr
t: timestamp
当指定-update时,状态更新将不会同步,除非文件大小也不同(即文件被重新创建)。如果指定了-pa, DistCp也会保留权限,因为acl是权限的超集。选项-pr只有在源目录和目标目录都没有被擦除编码时才有效。
-i忽略失败就像在附录中提到的,这个选项会比默认情况提供关于拷贝的更精确的统计, 同时它还将保留失败拷贝操作的日志,这些日志信息可以用于调试。最后,如果一个map失败了,但并没完成所有分块任务的尝试,这不会导致整个作业的失败
-log 写入日志的目录DistCp为每个文件的每次尝试拷贝的操作都记录日志,并把日志作为map的输出。 如果一个map失败了,当重新执行这个map时,这个日志不会被保留。
-v在 SKIP/COPY 日志中记录附加信息(路径、大小)此选项只能与 -log 选项一起使用。
-m <num_maps>同时拷贝的最大数量指定了拷贝数据时map的数目。请注意,并不是map数越多吞吐量越大。
-overwrite覆盖目标如果map失败且未指定-i,则拆分中的所有文件(不仅是失败的文件)都将被重新拷贝。正如使用文档中所说到的那样,它还更改了生成目标路径的语义,因此用户应谨慎使用它。
-update如果源和目标的大小、块大小或校验和不同,则覆盖如前所述,这不是“sync”操作。检查的标准是源和目标文件大小、块大小和校验和;如果它们不同,源文件将替换目标文件。正如使用文档中所讨论的那样,它还更改了生成目标路径的语义,因此用户应谨慎使用它。
-append具有相同名称但不同长度的文件的增量副本如果源文件的长度大于目标文件的长度,则比较公共长度部分的校验和。如果校验和匹配,则使用读取和附加功能仅复制差异部分。-append选项仅适用于-update,不适用于-skipcrccheck
-f <urilist_uri>使用 <urilist_uri> 中的列表作为 src 列表这相当于在命令行中列出每个源目录。urilist_uri列表应该是一个完全合法的URI。
-filters一个包含正则表达式列表的文件的路径,该文件中每行一个正则表达式。与正则表达式匹配的路径将从拷贝任务中排除。支持 java.util.regex.Pattern 指定的正则表达式。
-filelimit 限制文件总数小于等于n已弃用!在新的 DistCp 中被忽略。
-sizelimit 限制总大小为小于等于n字节已弃用!在新的 DistCp 中被忽略。
-delete删除目标集群路径中存在但源集群路径中不存在的文件删除是由 FS Shell 完成的。因此,如果它被使用,trash也将被使用。删除仅适用于-update或-overwrite选项。
-strategy{dynamic|uniformsize}选择要在 DistCp 中使用的复制策略。默认情况下,使用uniformsize。Map根据每个map复制的文件的总大小进行平衡,类似于遗留。如果指定了“dynamic”,则使用DynamicInputFormat。
-bandwidth指定每个map的带宽,单位是MB/秒每个map将被限制仅使用指定的带宽。这并不一定是精确的。在复制期间,map会减少其带宽消耗,使所使用的网络带宽趋向于指定的值。
-atomic {-tmp <tmp_dir>}指定原子提交,带有可选的tmp目录。-atomic命令DistCp将源数据复制到一个临时目录,然后将临时目录原子移动到最终目录。数据要么以完整一致的形式在最终目录处可用,要么完全不可用。可选项,-tmp可以用来指定临时目录位置。如果未指定,则选择默认值。注意:临时目录必须在最终目录的集群上。
-async异步运行 DistCp。Hadoop 作业启动后立即退出。Hadoop Job-id被记录下来,以便跟踪。
-diff <oldSnapshot> <newSnapshot>使用给定两个快照之间的快照差异报告来识别源和目标之间的差异,并将差异应用于目标,使其与源同步。此选项仅与-update选项一起时有效,并且应满足以下条件。
1. 源文件系统和目标文件系统都必须是DistributedFileSystem。
2. 在源FS上已经创建了两个快照<oldSnapshot>和<newSnapshot>,且<oldSnapshot>比<newSnapshot>早。
3. 目标具有相同的快照<oldSnapshot>。自从创建<oldSnapshot>以来,没有对目标做任何更改,因此<oldSnapshot>的内容与目标的当前状态相同。目标中的所有文件/目录与源的<oldSnapshot>相同。
-rdiff <newSnapshot> <oldSnapshot>使用给定两个快照之间的快照差异报告,以确定自从在目标上创建快照以来,目标上发生了哪些更改,并将差异反向应用到目标,并从源的复制修改后的文件,使目标与相同。此选项仅与-update选项一起时有效,且应满足以下条件。
1. 源文件系统和目标文件系统都必须是DistributedFileSystem。源和目标可以是两个不同的集群/路径,也可以是完全相同的集群/路径。在后一种情况下,修改后的文件将从目标的复制到目标的当前状态)。
2. 在目标FS上已经创建了两个快照和,且比早。自从在目标上创建以来,没有在目标上做任何更改。
3. 源有相同的快照,它的内容与目标上的相同。目标的中的所有文件或目录与源的相同。
-numListstatusThreads用于构建文件列表的线程数最多 40 个线程。
-skipcrccheck是否跳过源路径和目标路径之间的 CRC 检查。
-blocksperchunk <blocksperchunk>每个块的块数。指定后,将文件分割成块以并行复制。如果设置为正值,大于这个值的块将被分割成<blocksperchunk>块的块,以便并行传输,并在目标上重新组装。默认情况下,<blocksperchunk>是0,文件将被完整地传输,而不会被分割。此开关仅适用于源文件系统实现了getBlockLocations方法,目标文件系统实现了concat方法的情况。
-copybuffersize <copybuffersize>要使用的复制缓冲区的大小。默认情况下,<copybuffersize>设置为8192B
-xtrack <path>将缺少源文件的信息保存到指定路径。此选项仅对-update选项有效。这是一个实验属性,不能与-atomic选项一起使用。
-direct直接写入目标路径当目标是对象存储时,可用于避免可能非常昂贵的临时文件重命名操作。

二、hbase数据迁移

本次过程中尝试了三种方式

  1. 第一种:CopyTable
    命令格式如下(在源集群上执行):
hbase org.apache.hadoop.hbase.mapreduce.CopyTable  -Dhbase.client.scanner.caching=500 -Dmapreuce.local.map.tas.maximum=30 -Dmapred.map.tasks.speculatice.execution=fasle -Dbandwidth=200 --peer.adr=[目的集群的zkIP]:[目的集群的zkPort]:[目的集群的hdfs上hbase数据的存储路径] --new.name='[目的hbase集群上的表名]' [源hbase集群上的表名]

  实例如下:

hbase org.apache.hadoop.hbase.mapreduce.CopyTable  -Dhbase.client.scanner.caching=500 -Dmapreuce.local.map.tas.maximum=30 -Dmapred.map.tasks.speculatice.execution=fasle -Dbandwidth=200 --peer.adr=32.20.33.145:2181:/hbase --new.name='files' files

实际操作过程中一张大表遇到任务卡住不执行状态

  1. 第二种:Export/Import
    命令格式如下:
     1)、先导出源表数据(在源集群上执行):
hbase org.apache.hadoop.hbase.mapreduce.Export [导出表名] [导出集群目录]

   2)、然后再进行数据的导入(在目的集群上执行):

hbase org.apache.hadoop.hbase.mapreduce.Import [导入表名] [导入集群目录]

  实例如下:
   1)、在源集群32.20.33.148上执行

hbase org.apache.hadoop.hbase.mapreduce.Export files hdfs://32.20.33.145:9000/hbase_export/files

   2)、在目的集群32.20.33.145上执行

hbase org.apache.hadoop.hbase.mapreduce.Import files hdfs://32.20.33.145:9000/hbase_export/files

实际操作过程中,一张大表在目的集群进行导入时,遇到regionserver压力过大问题

  1. 第三种:Snapshot
     命令格式如下:
       1)、在源集群上进入hbase shell命令行,执行
snapshot '表名','快照名'

   2)、在源/目的集群执行

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot [快照名] -copy-from [源集群hbase目录] -copy-to [目的集群hbase目录]

   3)、在目的集群进入hbase shell命令行
     ① 如果目的集群已经创建了表,需要进行disable ,如果没有创建该表,可直接执行②

disable '表名'

     ②恢复快照

restore_snapshot '快照名'

 实例如下:
   1)、在源集群上进入hbase shell命令行,执行

snapshot 'files','files_snapshot'

   2)、在源/目的集群执行

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot files_snapshot -copy-from hdfs://32.20.33.148:9000/hbase -copy-to hdfs://32.20.33.145:9000/hbase

   3)、在目的集群进入hbase shell命令行
     ① 如果目的集群已经创建了表,需要进行disable ,如果没有创建该表,可直接执行②

disable 'files'

     ②恢复快照

restore_snapshot 'files_snapshot'

在实际操作过程中,快照方式的数据迁移完整并成功执行完成

三、ElasticSearch数据迁移

借助elasticdump工具进行数据迁移
下载地址:https://github.com/elasticsearch-dump/elasticsearch-dump
elasticdump工具的具体安装步骤这里不做说明
elasticdump相关命令如下:
  elasticdump迁移settings配置:

elasticdump --input=[源es地址/索引名] --output=[目的es地址/索引名] --type=settings

  elasticdump迁移mapping:

elasticdump --input=[源es地址/索引名] --output=[目的es地址/索引名] --type=mapping

  elasticdump迁移数据:

elasticdump --input=[源es地址/索引名] --output=[目的es地址/索引名] --type=data

实例如下:
  elasticdump迁移settings配置:

elasticdump --input=http://32.20.33.148:9200/doc_202211 --output=http://32.20.33.145:9200/doc_202211 --type=settings

  elasticdump迁移mapping:

elasticdump --input=http://32.20.33.148:9200/doc_202211 --output=http://32.20.33.145:9200/doc_202211 --type=mapping

  elasticdump迁移数据:

elasticdump --input=http://32.20.33.148:9200/doc_202211 --output=http://32.20.33.145:9200/doc_202211 --type=data

在进行数据迁移时,默认是100条同时同步。可以使用–limit进行数据条数的指定,如下:

elasticdump --limit 10000 --input=http://32.20.33.148:9200/doc_202211 --output=http://32.20.33.145:9200/doc_202211 --type=data

在进行迁移时,可以指定es的用户名和密码

elasticdump --limit 10000 --input=http://esuser:espassword@32.20.33.148:9200/doc_202211 --output=http://esuser:espassword@32.20.33.145:9200/doc_202211 --type=data

同时也可以导出到本地

elasticdump --limit 10000 --input=http://esuser:espassword@32.20.33.148:9200/doc_202211 --output=/data/es/doc_export_data.json --type=data
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

稚于এ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值