HDFS 使用原生连接器连接 S3 对象存储

使用Hadoop原生连接器

  • S3A(AWS S3)

    bash 复制代码
    hdfs dfs -ls s3a://my-bucket/
  • WASB/WASBS(Azure Blob)

    bash 复制代码
    hdfs dfs -ls wasbs://[email protected]/

HDFS和S3的连接器通常指S3A连接器,以下是其使用步骤:

安装与配置

  1. 安装Hadoop:确保安装了Hadoop 2.8.0或更高版本。
  2. 添加S3A依赖:如果使用Maven构建项目,在项目的pom.xml文件中添加S3A连接器的依赖:
xml 复制代码
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-aws</artifactId>
    <version>${hadoop.version}</version>
</dependency>

${hadoop.version} 替换为实际使用的Hadoop版本号。如果不使用Maven,也可以直接下载相应的JAR包并添加到项目的类路径中。

  1. 配置Hadoop :在Hadoop的配置文件 core-site.xml 中,添加以下配置项:
xml 复制代码
<property>
    <name>fs.s3a.access.key</name>
    <value>YOUR_ACCESS_KEY</value>
</property>
<property>
    <name>fs.s3a.secret.key</name>
    <value>YOUR_SECRET_KEY</value>
</property>
<property>
    <name>fs.s3a.endpoint</name>
    <value>YOUR_S3_ENDPOINT</value>
</property>
<property>
    <name>fs.s3a.impl</name>
    <value>org.apache.hadoop.fs.s3a.S3AFileSystem</value>
</property>

YOUR_ACCESS_KEYYOUR_SECRET_KEY 替换为自己的AWS访问密钥和秘密密钥,YOUR_S3_ENDPOINT 替换为S3的端点,如 s3.us-west-2.amazonaws.com

测试连接

可以在Hadoop命令行中使用以下命令来测试连接,例如列出S3桶中的内容:

bash 复制代码
hdfs dfs -ls s3a://your-bucket-name/

如果能够正确列出桶中的内容,说明连接配置成功。

数据传输

  • 使用DistCp工具 :使用 hadoop distcp 命令可以在HDFS和S3之间传输数据。例如,将HDFS中的文件传输到S3上:
bash 复制代码
hadoop distcp hdfs://namenode/path/to/hdfsfile s3a://bucketname/path/to/s3file

namenode 替换为实际的HDFS Namenode地址,path/to/hdfsfile 替换为HDFS中要传输的文件路径,bucketname 替换为S3桶的名称,path/to/s3file 替换为S3中目标文件的路径。

  • 使用Hadoop API:在Java程序中,可以使用Hadoop API将数据从HDFS复制到S3。示例代码如下:
java 复制代码
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class HdfsToS3 {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        conf.set("fs.s3a.access.key", "YOUR_ACCESS_KEY");
        conf.set("fs.s3a.secret.key", "YOUR_SECRET_KEY");
        FileSystem fs = FileSystem.get(conf);
        Path hdfsPath = new Path("hdfs://namenode/path/to/hdfsfile");
        Path s3Path = new Path("s3a://bucketname/path/to/s3file");
        fs.copyFromLocalFile(false, hdfsPath, s3Path);
        fs.close();
    }
}

高级配置

  • 启用多部分上传 :可以在 core-site.xml 中添加以下配置来启用多部分上传,以提高大文件的上传速度:
xml 复制代码
<property>
    <name>fs.s3a.multipart.size</name>
    <value>5242880</value>
</property>

这将把文件分成5MB的块进行上传。

  • 设置S3A客户端连接数:可以通过以下配置来设置S3A客户端的连接数:
xml 复制代码
<property>
    <name>fs.s3a.connection.maximum</name>
    <value>100</value>
</property>

根据实际情况调整连接数,以优化性能。