在 Ubuntu 上进行 HDFS 数据迁移的常用方法
前置准备
- 在 Ubuntu 上安装 Hadoop 客户端,并配置好环境变量(如 HADOOP_HOME、PATH),确保能执行 hdfs dfs 命令。
- 准备好访问源/目标 NameNode 的网络与权限(Kerberos 票据或简单认证),并确认 HDFS 服务已启动。
- 迁移前先检查源路径、目标路径及可用磁盘空间,避免中途失败。
方法一 本地拷贝与合并
- 适用场景:从 HDFS 迁移到 Ubuntu 本地磁盘,或本地到 HDFS。
- 常用命令:
- 从 HDFS 下载到本地目录:hdfs dfs -get /hdfs/path /local/path
- 将本地文件上传到 HDFS:hdfs dfs -put /local/file /hdfs/path
- 将 HDFS 目录内所有文件合并为一个本地文件:hdfs dfs -getmerge /hdfs/dir /local/merged.txt
- 示例:
- hdfs dfs -get /user/hadoop/data /home/ubuntu/hdfs_data
- hdfs dfs -put /home/ubuntu/local.txt /user/hadoop/input
- hdfs dfs -getmerge /user/hadoop/logs /home/ubuntu/merged.log
- 说明:适合中小规模数据;大目录建议分批或使用分布式拷贝工具。
方法二 FUSE 挂载为本地文件系统
- 适用场景:需要像操作本地磁盘一样对 HDFS 进行复制、移动、备份等。
- 安装与挂载(Ubuntu):
- 安装 FUSE:sudo apt-get install hadoop-hdfs-fuse
- 非 HA:mkdir -p /mnt/hdfs;hadoop-fuse-dfs dfs://<namenode_host>:<rpc_port> /mnt/hdfs
- HA:hadoop-fuse-dfs dfs://<nameservice_id> /mnt/hdfs
- 开机自动挂载(/etc/fstab):hadoop-fuse-dfs#dfs://<namenode_host>:<rpc_port> /mnt/hdfs fuse allow_other,usetrash,rw 2 0
- 使用方式:mount /mnt/hdfs 后,可用 cp、rsync、tar 等常规工具在本地与 HDFS 之间迁移数据。
- 提示:确保 JAVA_HOME 等 Hadoop 环境变量在系统服务环境下可用;权限与网络需与集群策略一致。
方法三 跨集群迁移与导出到关系型数据库
- 跨集群拷贝(DistCp):
- 基本用法:hadoop distcp hdfs://src-nn:8020/src hdfs://dst-nn:8020/dst
- 常用选项:-m 100(并发任务数)、-overwrite(覆盖)、-update(增量)、-bandwidth 100(MB/s 限速)
- 示例:hadoop distcp -m 50 -overwrite hdfs://nn1:8020/data hdfs://nn2:8020/backup/data
- 导出到 MySQL(Sqoop):
- 前提:HDFS 数据为文本/列式格式(如 Text、Parquet 经 Hive 导出为文本)
- 命令:sqoop export --connect jdbc:mysql://host:3306/db --username user --password pwd --table tgt_tbl --export-dir /hdfs/export/dir -m 1
- 说明:DistCp 适合大规模、跨机房/跨版本迁移;Sqoop 适合落地到 MySQL/Oracle/PostgreSQL 等关系库。
方法四 Hive 表级迁移与 HBase 场景
- Hive 表导出到 HDFS(再迁移/加载):
- 导出到 HDFS 目录:EXPORT TABLE db.tbl TO ‘hdfs://nn:8020/export/tbl’
- 在目标集群 IMPORT:IMPORT TABLE db.tbl FROM ‘hdfs://nn:8020/export/tbl’
- 或直接用 Hive 查询结果导出到本地/其他路径:INSERT OVERWRITE LOCAL DIRECTORY ‘/local/dir’ SELECT * FROM db.tbl
- HBase 表数据迁移(HDFS 层面搬运 + 修复元数据):
- 从源 HDFS 导出表目录:hdfs dfs -get hdfs://src:9000/hbase/data/default/table /home/hbase/table
- 将目录拷入目标 HDFS:hdfs dfs -put /home/hbase/table hbase/data/default/table
- 修复:hbase hbck -fixMeta;hbase hbck -fixAssignments
- 说明:Hive EXPORT/IMPORT 保留表结构与数据;HBase 迁移需按表目录级别搬运并修复 meta 与 region 分配。