distcp数据迁移方案

数据迁移distcp方案

  • 概况:

根据迁移的实际情况,由于数据量大、重要、迫切性,因此实施方案每一步都需严谨执行,并且当出错时清楚缺少的数据和补救的办法。

  • 具体实施计划:
  1. 大的步骤分为3步,即export、distcp、import。
  2. 在export导出数据时,以时间戳作为参数,如将三个月的数据为一个单位导出,出错时,重复执行。命令案例:

sudo -u hdfs hbase org.apache.hadoop.hbase.mapreduce.Export  ship_historical_trace  /ship_historical_trace0  1  0  1514736000000

注释:

1514736000000 2018-01-01 00:00:00的时间戳

sudo -u hdfs hbase org.apache.hadoop.hbase.mapreduce.Export  ship_historical_trace  /ship_historical_trace1  1   1514736000000  1522425600000

注释:

1514736000000 2018-01-01 00:00:00的时间戳

1522425600000 2018-03-31 00:00:00的时间戳

………

  1. 在执行distcp拷贝文件时,首先确定以下几点:

(1)首先确保两个集群的mapreduce计算框架没问题

(2)开通目标集群所有机器到源集群namenode节点的网络

(3)版本差距不是很大时,用hdfs协议;版本差距较大时,用hftp协议

(4)在ambari在的节点上使用命令,只有该节点可以免密登录其他机器

(5)文件拷贝的路径需要写namenode存在节点,因为只用它开启了rpc端口

(6)在目标集群的ambari节点执行命令

 命令案例:

sudo -u hdfs hadoop distcp -i hdfs://192.168.16.1:8020/ship_historical_trace0   hdfs://172.172.160.101/

 

sudo -u hdfs hadoop distcp -i hdfs://192.168.16.1:8020/ship_historical_trace1   hdfs://172.172.160.101/

……….

  1. import导入数据的性能:
  1. 原数据表已存在key,不会修改
  2. 原数据没有数据,做插入操作

命令案例:

sudo -u hdfs hbase org.apache.hadoop.hbase.mapreduce.Import ship_historical_trace  /ship_historical_trace0

 

sudo -u hdfs hbase org.apache.hadoop.hbase.mapreduce.Import ship_historical_trace  /ship_historical_trace1

………

  • 评估操作是否成功的方法:
  1. 根据yarn或mapreduce的节点端口8088查看job任务的进度。根据job的id得知哪些操作失败,将操作失败命令做再次尝试。
  2. 根据namenode节点端口50070查看具体文件的个数情况,粗略判断是否成功。
  3. 使用命令查看hdfs具体文件夹大小

sudo -u hdfs hadoop fs -du –h  /ship_historical_trace0

  1. 在文件夹拷贝过程中,单个文件丢失时,可单独拷贝该文件:

sudo -u hdfs hadoop distcp -i  hdfs://192.168.16.1:8020/ship_historical_trace0/part-m-00000   hdfs://172.172.160.101/ship_historical_trace/part-m-00000

  1. 操作成功后,使用hbase shell命令随机查看两集群几组数据,进行比较
  • 测试效率统计:

文件大小

export用时

distcp用时

import用时

632.7G

24小时

13小时(跨集群)

(期间磁盘满了,操作失败)

44.53 GB

(没做)

615秒(集群内)

1小时8分(跨集群)

4小时

### 数据迁移的代码示例与实现方法 #### 使用 Shell 脚本进行 SQL Server 到 Hive 的数据迁移 以下是一个基于 Bash 和 Sqoop 工具的数据迁移脚本,它能够将 SQL Server 中的数据迁移到 Hive 表中。此脚本适用于全量覆盖更新场景。 ```bash #!/bin/bash # 定义变量 DB_NAME="source_db" TABLE_NAME="source_table" TARGET_HIVE_DB="target_hive_db" TARGET_HIVE_TABLE="target_hive_table" # 清理目标 Hive 表 (全量覆盖) hive -e "DROP TABLE IF EXISTS ${TARGET_HIVE_DB}.${TARGET_HIVE_TABLE};" # 创建新的 Hive 表结构 hive -e "CREATE TABLE ${TARGET_HIVE_DB}.${TARGET_HIVE_TABLE} ( id INT, name STRING, value DOUBLE );" # 使用 Sqoop 导入数据 sqoop import \ --connect jdbc:sqlserver://<SQL_SERVER_HOST>:<PORT>;database=${DB_NAME} \ --username <USERNAME> \ --password <PASSWORD> \ --table ${TABLE_NAME} \ --target-dir /tmp/${TABLE_NAME}_data \ --delete-target-dir \ --fields-terminated-by '\t' \ -m 1 # 将临时目录中的数据加载到 Hive 表 hive -e "LOAD DATA INPATH '/tmp/${TABLE_NAME}_data' INTO TABLE ${TARGET_HIVE_DB}.${TARGET_HIVE_TABLE};" ``` 上述脚本实现了从 SQL Server 数据库到 Hive 表的数据迁移过程[^2]。需要注意的是,在执行前需替换 `<SQL_SERVER_HOST>`、`<PORT>`、`<USERNAME>` 和 `<PASSWORD>` 等占位符的实际值。 --- #### Hadoop 集群间的数据迁移使用 DistCp DistCp 是一种高效工具,用于在不同 HDFS 文件系统之间复制大量数据。以下是具体实现方式: ```bash #!/bin/bash # 定义参数 SOURCE_CLUSTER_MASTER="hdfs://source-master-node:8020" DESTINATION_CLUSTER_MASTER="hdfs://destination-master-node:8020" SOURCE_DIR="/test/source_data" DESTINATION_DIR="/test/destination_data" PARALLELISM=5 BANDWIDTH_MB=10 # 执行 DistCp 命令 hadoop distcp \ -p \ -m ${PARALLELISM} \ -bandwidth ${BANDWIDTH_MB} \ ${SOURCE_CLUSTER_MASTER}${SOURCE_DIR} \ ${DESTINATION_CLUSTER_MASTER}${DESTINATION_DIR} ``` 这段脚本展示了如何利用 `hadoop distcp` 命令完成跨集群的文件同步操作[^3]。其中 `-m` 参数控制并行任务数,而 `-bandwidth` 设置每秒传输带宽上限(单位 MB/s)。 --- #### Python 脚本实现 MySQL 到 PostgreSQL 的数据迁移 对于关系型数据库之间的迁移需求,Python 提供了一种灵活解决方案。下面是一份简单的例子: ```python import pymysql import psycopg2 # 连接源 MySQL 数据库 mysql_conn = pymysql.connect( host='localhost', user='root', password='password', database='source_db' ) # 连接目标 PostgreSQL 数据库 pg_conn = psycopg2.connect( dbname='target_db', user='postgres', password='password', host='localhost' ) try: with mysql_conn.cursor() as mysql_cursor, pg_conn.cursor() as pg_cursor: # 查询源表数据 mysql_cursor.execute("SELECT * FROM source_table;") rows = mysql_cursor.fetchall() # 插入到目标表 for row in rows: insert_query = f"INSERT INTO target_table VALUES {row};" pg_cursor.execute(insert_query) # 提交事务 pg_conn.commit() finally: mysql_conn.close() pg_conn.close() ``` 以上程序片段演示了通过 Python 同时连接两种不同类型的关系型数据库,并完成了记录级的数据搬运动作[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值