本文檔介紹文件存儲 HDFS 版和對象存儲OSS之間的數據遷移操作過程。您可以將文件存儲 HDFS 版數據遷移到對象存儲OSS,也可以將對象存儲OSS的數據遷移到文件存儲 HDFS 版。
前提條件
已開通文件存儲 HDFS 版服務并創建文件系統實例和掛載點。具體操作,請參見文件存儲HDFS版快速入門。
已搭建Hadoop集群并且所有集群節點已安裝JDK,JDK版本不低于1.8。建議您使用的Hadoop版本不低于2.7.2,本文檔中使用的Hadoop版本為Apache Hadoop 2.8.5。
背景信息
阿里云文件存儲 HDFS 版是面向阿里云ECS實例及容器服務等計算資源的文件存儲服務。文件存儲 HDFS 版允許您就像在Hadoop的分布式文件系統中一樣管理和訪問數據,并對熱數據提供高性能的數據訪問能力。對象存儲OSS是海量、安全、低成本、高可靠的云存儲服務,提供標準型、歸檔型等多種存儲類型。您可以在文件存儲 HDFS 版和對象存儲OSS之間雙向數據遷移,從而實現熱、溫、冷數據合理分層,在實現對熱數據的高性能訪問的同時,有效控制存儲成本。
步驟一:Hadoop集群掛載文件存儲 HDFS 版實例
在Hadoop集群中配置文件存儲 HDFS 版實例。具體操作,請參見掛載文件存儲 HDFS 版文件系統。
步驟二:Hadoop集群部署JindoSDK
下載最新的JindoSDK安裝包。
本文以jindosdk-4.5.0為例。
執行以下命令,解壓安裝包。
tar -zxvf ./jindosdk-4.5.0.tar.gz
執行以下命令,將安裝包內的jindo-core-4.5.0.jar和jindo-sdk-4.5.0.jar文件復制到Hadoop的CLASSPATH路徑下。
cp -v ./jindosdk-4.5.0/lib/jindo-*-4.5.0.jar ${HADOOP_HOME}/share/hadoop/hdfs/lib/
配置JindoSDK OSS實現類及Access Key。
執行以下命令,打開core-site.xml配置文件。
vim ${HADOOP_HOME}/etc/hadoop/core-site.xml
將JindoSDK OSS實現類配置到core-site.xml文件中。
說明以下配置添加至<configuration>標簽內。
<property> <name>fs.AbstractFileSystem.oss.impl</name> <value>com.aliyun.jindodata.oss.OSS</value> </property> <property> <name>fs.oss.impl</name> <value>com.aliyun.jindodata.oss.JindoOssFileSystem</value> </property>
將OSS Bucket對應的Access Key ID、Access Key Secret、Endpoint配置到core-site.xml文件中。
說明以下配置添加至<configuration>標簽內。
<property> <name>fs.oss.accessKeyId</name> <!-- 請填寫您用于訪問OSS Bucket的Access Key ID --> <value>xxx</value> </property> <property> <name>fs.oss.accessKeySecret</name> <!-- 請填寫Access Key ID對應的Access Key Secret --> <value>xxx</value> </property> <property> <name>fs.oss.endpoint</name> <!-- ECS環境推薦使用內網OSS Endpoint,格式為oss-cn-xxxx-internal.aliyuncs.com --> <value>oss-cn-xxxx.aliyuncs.com</value> </property>
使用Hadoop Shell訪問OSS。
${HADOOP_HOME}/bin/hadoop fs -ls oss://<bucket>/<path>
其中,
<bucket>
為OSS的存儲空間名稱,<path>
為該存儲空間下的文件路徑。請根據實際情況進行替換。
步驟三:數據遷移
為Hadoop集群掛載好文件存儲 HDFS 版實例和安裝OSS客戶端Jindo SDK后,使用Hadoop MapReduce任務(DistCp)即可實現數據遷移。遷移數據的操作如下所示。
實踐一:將文件存儲 HDFS 版上的數據遷移至對象存儲OSS
執行以下命令,在文件存儲 HDFS 版實例上生成100 GB測試數據。
${HADOOP_HOME}/bin/hadoop jar \ ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar \ randomtextwriter \ -D mapreduce.randomtextwriter.totalbytes=107374182400 \ -D mapreduce.randomtextwriter.bytespermap=10737418240 \ dfs://f-xxxxxxx.cn-beijing.dfs.aliyuncs.com:10290/dfs2oss/data/data_100g/
重要參數說明如下所示,請根據實際情況進行替換。
f-xxxxxxx.cn-beijing.dfs.aliyuncs.com
:文件存儲 HDFS 版掛載點域名。/dfs2oss/data/data_100g
:本文保存測試數據的目錄。hadoop-mapreduce-examples-2.8.5.jar:hadoop版本。
查看生成的測試數據。
執行命令
${HADOOP_HOME}/bin/hadoop fs -du -s dfs://f-xxxxxxx.cn-beijing.dfs.aliyuncs.com:10290/dfs2oss/data/data_100g
返回示例
110223430221 dfs://f-xxxxxxx.cn-beijing.dfs.aliyuncs.com:10290/dfs2oss/data/data_100g
啟動Hadoop MapReduce任務(DistCp)將測試數據遷移至對象存儲OSS。關于DistCp工具的使用說明,請參見Hadoop Distcp工具官方說明。
${HADOOP_HOME}/bin/hadoop distcp \ dfs://f-xxxxxxx.cn-beijing.dfs.aliyuncs.com:10290/dfs2oss oss://<bucket>/<path>
任務執行完成后,如果回顯包含如下類似信息,說明遷移成功。
22/08/10 16:20:54 INFO mapreduce.Job: Job job_1660115355800_0003 completed successfully 22/08/10 16:20:54 INFO mapreduce.Job: Counters: 38 File System Counters DFS: Number of bytes read=110223438504 DFS: Number of bytes written=0 DFS: Number of read operations=114 DFS: Number of large read operations=0 DFS: Number of write operations=26 FILE: Number of bytes read=0 FILE: Number of bytes written=2119991 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 OSS: Number of bytes read=0 OSS: Number of bytes written=0 OSS: Number of read operations=0 OSS: Number of large read operations=0 OSS: Number of write operations=0 Job Counters Launched map tasks=13 Other local map tasks=13 Total time spent by all maps in occupied slots (ms)=10264552 Total time spent by all reduces in occupied slots (ms)=0 Total time spent by all map tasks (ms)=10264552 Total vcore-milliseconds taken by all map tasks=10264552 Total megabyte-milliseconds taken by all map tasks=10510901248 Map-Reduce Framework Map input records=14 Map output records=0 Input split bytes=1755 Spilled Records=0 Failed Shuffles=0 Merged Map outputs=0 GC time elapsed (ms)=18918 CPU time spent (ms)=798190 Physical memory (bytes) snapshot=4427018240 Virtual memory (bytes) snapshot=50057256960 Total committed heap usage (bytes)=2214068224 File Input Format Counters Bytes Read=6528 File Output Format Counters Bytes Written=0 DistCp Counters Bytes Copied=110223430221 Bytes Expected=110223430221 Files Copied=14
查看遷移到對象存儲OSS上的數據大小是否與原文件一致。
執行命令
${HADOOP_HOME}/bin/hadoop fs -du -s oss://<bucket>/<path>
返回示例
實踐二:將對象存儲OSS上的數據遷移至文件存儲 HDFS 版
在對象存儲OSS上生成100 GB測試數據。
${HADOOP_HOME}/bin/hadoop jar \ ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar \ randomtextwriter \ -D mapreduce.randomtextwriter.totalbytes=107374182400 \ -D mapreduce.randomtextwriter.bytespermap=10737418240 \ oss://<bucket>/<path>
重要參數說明如下所示,請根據實際情況進行替換。
<bucket>/<path>
:測試數據OSS Bucket目錄。hadoop-mapreduce-examples-2.8.5.jar:hadoop版本。
查看生成的測試數據。
執行命令
${HADOOP_HOME}/bin/hadoop fs -du -s oss://<bucket>/<path>
返回示例
啟動Hadoop MapReduce任務(DistCp)將測試數據遷移至文件存儲 HDFS 版。
${HADOOP_HOME}/bin/hadoop distcp \ oss://<bucket>/<path> \ dfs://f-xxxxxxx.cn-beijing.dfs.aliyuncs.com:10290/oss2dfs
任務執行完成后,如果回顯包含如下類似信息,說明遷移成功。
22/08/10 17:08:17 INFO mapreduce.Job: Job job_1660115355800_0005 completed successfully 22/08/10 17:08:17 INFO mapreduce.Job: Counters: 38 File System Counters DFS: Number of bytes read=6495 DFS: Number of bytes written=110223424482 DFS: Number of read operations=139 DFS: Number of large read operations=0 DFS: Number of write operations=47 FILE: Number of bytes read=0 FILE: Number of bytes written=1957682 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 OSS: Number of bytes read=0 OSS: Number of bytes written=0 OSS: Number of read operations=0 OSS: Number of large read operations=0 OSS: Number of write operations=0 Job Counters Launched map tasks=12 Other local map tasks=12 Total time spent by all maps in occupied slots (ms)=10088860 Total time spent by all reduces in occupied slots (ms)=0 Total time spent by all map tasks (ms)=10088860 Total vcore-milliseconds taken by all map tasks=10088860 Total megabyte-milliseconds taken by all map tasks=10330992640 Map-Reduce Framework Map input records=12 Map output records=0 Input split bytes=1620 Spilled Records=0 Failed Shuffles=0 Merged Map outputs=0 GC time elapsed (ms)=21141 CPU time spent (ms)=780270 Physical memory (bytes) snapshot=4037222400 Virtual memory (bytes) snapshot=45695025152 Total committed heap usage (bytes)=2259156992 File Input Format Counters Bytes Read=4875 File Output Format Counters Bytes Written=0 DistCp Counters Bytes Copied=110223424482 Bytes Expected=110223424482 Files Copied=12
檢查遷移到文件存儲 HDFS 版的測試數據是否與原OSS待遷移數據一致。
執行命令
${HADOOP_HOME}/bin/hadoop fs -du -s dfs://f-xxxxx.cn-zhangjiakou.dfs.aliyuncs.com:10290/oss2dfs
返回示例
110223424482 dfs://f-xxxxx.cn-beijing.dfs.aliyuncs.com:10290/oss2dfs
常見問題
對于正在寫入的文件,進行遷移時會遺漏最新寫入的數據嗎?
Hadoop兼容文件系統提供單寫者多讀者并發語義,針對同一個文件,同一時刻可以有一個寫者寫入和多個讀者讀出。以文件存儲 HDFS 版到對象存儲OSS的數據遷移為例,數據遷移任務打開文件存儲 HDFS 版的文件F,根據當前系統狀態決定文件F的長度L,將L字節遷移到對象存儲OSS。如果在數據遷移過程中,有并發的寫者寫入,文件F的長度將超過L,但是數據遷移任務無法感知到最新寫入的數據。因此,建議當您在做數據遷移時,請避免往遷移的文件中寫入數據。