HDFS数据在Ubuntu上的迁移指南
HDFS数据迁移是将数据从一个HDFS集群(源集群)复制到另一个HDFS集群(目标集群,可能位于同一Ubuntu服务器或不同服务器),或在Ubuntu本地文件系统与HDFS之间转移数据的过程。以下是具体操作步骤及注意事项:
评估数据量
使用hdfs dfs -du -h /命令查看源HDFS集群各目录的总数据量(如/user/hadoop/data目录的大小),并按业务维度(如订单、日志、用户信息)划分数据范围,统计各业务的数据总量。这一步可帮助合理规划迁移批次,避免一次性迁移过多数据导致带宽拥堵。
制定迁移计划
根据数据量和业务需求,选择低负载时间段(如凌晨2-4点)执行迁移,减少对线上业务的影响。建议按业务→目录→分批的顺序迁移(例如先迁移“订单”业务的/user/hadoop/orders目录,再迁移“日志”业务的/user/hadoop/logs目录),便于后续问题排查。
选择迁移工具
/home/ubuntu/data目录上传到HDFS,可使用hdfs dfs -put命令;若需从HDFS下载到本地,可使用hdfs dfs -get命令。若需将数据从一个HDFS集群迁移到另一个HDFS集群(包括Ubuntu服务器上的集群),可使用以下命令:
hadoop distcp [options] hdfs://source-namenode:port/source_path hdfs://dest-namenode:port/dest_path
常用参数说明:
-m <num>:设置Map任务的最大数量(默认20),可根据集群规模调整(如集群有100个节点,可设置为50-80),提高迁移速度。-bandwidth <value>:限制迁移带宽(单位:MB/s,如-bandwidth 100表示限制为100MB/s),避免占用过多网络资源影响其他业务。-p:保留文件权限、所有者、组等属性(确保迁移后文件权限与源集群一致)。-update:更新目标集群中已存在的文件(仅当源文件修改时间更晚时覆盖,确保数据一致性)。-overwrite:强制覆盖目标集群中的所有文件(慎用,会删除目标集群中的现有数据)。示例命令:
将源集群(hdfs://namenode1:9000)的/user/hadoop/orders目录迁移到目标集群(hdfs://namenode2:9000),限制带宽为50MB/s,保留文件权限:
hadoop distcp -m 40 -bandwidth 50 -p hdfs://namenode1:9000/user/hadoop/orders hdfs://namenode2:9000/user/hadoop/orders
小数据量测试:
迁移前,先选取一个小目录(如/user/hadoop/test,大小约1GB)进行测试,验证命令参数是否正确、数据是否一致(可通过hdfs dfs -ls查看目标目录文件列表,用hdfs dfs -cat查看部分文件内容),确保无遗漏或错误。
从本地上传到HDFS
若需将Ubuntu本地的/home/ubuntu/data目录上传到HDFS的/user/hadoop/upload目录,可使用以下命令:
# 创建HDFS目标目录(若不存在)
hdfs dfs -mkdir -p /user/hadoop/upload
# 上传本地目录到HDFS
hdfs dfs -put /home/ubuntu/data /user/hadoop/upload
-put:将本地文件或目录复制到HDFS。-mkdir -p:递归创建HDFS目录(若父目录不存在则自动创建)。从HDFS下载到本地
若需将HDFS的/user/hadoop/orders目录下载到Ubuntu本地的/home/ubuntu/downloads目录,可使用以下命令:
# 创建本地目标目录(若不存在)
mkdir -p /home/ubuntu/downloads
# 下载HDFS目录到本地
hdfs dfs -get /user/hadoop/orders /home/ubuntu/downloads
-get:将HDFS文件或目录复制到本地。hdfs dfs -getmerge命令:hdfs dfs -getmerge /user/hadoop/orders /home/ubuntu/downloads/merged_orders.txt
数据完整性校验
使用DistCp的-update参数重新迁移,检查目标集群中是否有新增或修改的文件(仅同步变化的文件):
hadoop distcp -update hdfs://source-namenode:port/source_path hdfs://dest-namenode:port/dest_path
或使用hdfs dfs -du -h命令对比源集群与目标集群各目录的大小(如hdfs dfs -du -h /user/hadoop/orders vs hdfs dfs -du -h hdfs://dest-namenode:port/user/hadoop/orders),确保数据量一致。
权限校验
使用hdfs dfs -ls -h命令查看源集群与目标集群文件的权限(如-rw-r--r--)、所有者(如hadoop)、组(如hadoop),确保一致:
hdfs dfs -ls -h /user/hadoop/orders # 源集群
hdfs dfs -ls -h hdfs://dest-namenode:port/user/hadoop/orders # 目标集群
若权限不一致,可使用hdfs dfs -chmod(修改权限)、hdfs dfs -chown(修改所有者/组)命令调整目标集群文件属性。
业务功能验证
将业务应用(如Hive、Spark)指向目标HDFS集群,运行简单的查询(如SELECT COUNT(*) FROM orders_table)或数据处理任务,验证数据是否能正常读取和处理,确保业务不受影响。
带宽管理:迁移过程中,通过-bandwidth参数限制带宽(如-bandwidth 100),避免占用全部网络资源,影响其他业务运行。
异常处理:若迁移过程中出现文件冲突(如目标集群中已存在同名文件且未使用-overwrite或-update参数),DistCp会自动跳过该文件并在日志中记录。需检查日志(位于/var/log/hadoop/hadoop-distcp.log),手动处理冲突文件(如删除目标集群中的旧文件,重新迁移)。
数据安全:迁移前备份重要数据(如将源集群的/user/hadoop/orders目录复制到本地/home/ubuntu/backups),避免迁移失败导致数据丢失。
权限保持:使用-p参数保留文件权限,确保迁移后文件的访问权限与源集群一致,避免业务应用因权限问题无法访问数据。