Linux环境下Hadoop数据迁移的常用方法与步骤
在Linux系统中,Hadoop数据迁移主要依赖其自带工具(如distcp)及外部工具(如Sqoop),以下是具体操作流程与注意事项:
hdfs dfs -du -h /命令查看各目录总数据量,按业务划分统计(如/user/hive/warehouse、/data/logs等),明确迁移规模。ping、telnet测试端口连通性);若有防火墙,开放HDFS相关端口(如RPC端口9000、HTTP端口9870);准备足够的存储空间(目标集群需预留1.2倍源数据量,应对临时文件)。distcp,确保源、目标集群均已安装Hadoop且版本兼容(同版本可直接使用HDFS协议,不同版本需调整协议,如2.x用hftp);若使用Sqoop,需提前安装并配置JDBC驱动(如MySQL的mysql-connector-java)。DistCp是Hadoop自带的分布式拷贝工具,基于MapReduce实现,支持大规模数据并行迁移,是Hadoop数据迁移的首选工具。
若源、目标集群Hadoop版本一致(如同为3.x),可直接使用HDFS协议:
hadoop distcp hdfs://源集群namenode地址:rpc端口/源路径 hdfs://目标集群namenode地址:rpc端口/目标路径
示例:将源集群/user/root/data迁移至目标集群/user/root/new_data:
hadoop distcp hdfs://namenode1:9000/user/root/data hdfs://namenode2:9000/user/root/new_data
若源、目标集群版本差异较大(如1.x→3.x),需使用hftp或webhdfs协议(通过HTTP端口访问):
hadoop distcp hftp://源集群namenode地址:http端口/源路径 hdfs://目标集群namenode地址:rpc端口/目标路径
示例:将2.x集群数据迁移至3.x集群:
hadoop distcp hftp://namenode1:50070/user/root/data hdfs://namenode2:9000/user/root/new_data
-m <num>:设置Map任务数量(默认20),可根据集群资源和带宽调整(如-m 50提升并发)。-bandwidth <MB>:限制单个Map任务的带宽(单位:MB/s),避免占用过多网络资源(如-bandwidth 100限制为100MB/s)。-p <权限>:保留文件属性(r=复制、b=块大小、u=用户、g=组、p=权限、a=ACL、x=扩展属性、t=时间戳),确保迁移后权限一致。-overwrite:覆盖目标集群已存在的文件(默认跳过)。-update:仅更新目标集群中修改过的文件(避免全量覆盖)。-i:忽略失败文件(继续迁移其他文件,适用于部分文件无法访问的场景)。-append:将源文件数据追加到目标文件(适用于增量同步,如日志文件)。Sqoop是Hadoop与关系型数据库(如MySQL、Oracle)之间的数据传输工具,适用于将数据库表数据迁移至HDFS或反之。
sqoop-env.sh(指定Hadoop、Hive路径);mysql-connector-java-8.0.28.jar),放入$SQOOP_HOME/lib目录。将MySQL数据库test_db中的user表迁移至HDFS的/user/sqoop/user_data目录:
sqoop import \
--connect jdbc:mysql://源数据库地址/test_db \
--username 数据库用户名 \
--password 数据库密码 \
--table user \
--target-dir /user/sqoop/user_data \
--verbose
参数说明:
--connect:数据库连接URL;--username/--password:数据库登录凭证;--table:要迁移的表名;--target-dir:HDFS目标路径(需提前创建,如hdfs dfs -mkdir -p /user/sqoop/user_data);--verbose:显示详细执行日志。迁移完成后,必须验证数据完整性,避免遗漏或错误:
对比源、目标集群的文件数量与数据大小:
# 源集群
hdfs dfs -du -h /源路径
hdfs dfs -count /源路径
# 目标集群
hdfs dfs -du -h /目标路径
hdfs dfs -count /目标路径
若两者一致,则数据量无差异。
使用distcp的-skipcrccheck参数跳过CRC校验(提升性能),或通过自定义脚本(如md5sum)逐文件比对哈希值:
# 示例:比对源、目标集群某个文件的MD5
hdfs dfs -cat /源路径/file.txt | md5sum
hdfs dfs -cat /目标路径/file.txt | md5sum
检查目标集群文件权限是否与源集群一致(若迁移时未使用-p参数,需手动修复):
# 获取源集群文件权限
hdfs dfs -ls /源路径
# 修改目标集群文件权限(如将/user/root/new_data的权限设为755)
hdfs dfs -chmod -R 755 /user/root/new_data
hdfs dfs -chown -R root:root /user/root/new_data
hive-site.xml中的hive.metastore.warehouse.dir),指向目标集群地址。hdfs dfsadmin -report查看集群健康状态。hdfs dfs -rm -r /源路径),释放存储空间。-update参数增量同步。-bandwidth参数限制迁移带宽,避免影响线上业务(如设置为总带宽的70%)。-p参数保留文件权限,否则可能导致应用程序无法访问数据。hdfs dfs -rm -r /目标路径),重新执行命令。