HDFS是Hadoop的分布式文件系统,但Hadoop除了HDFS,还支持其他文件系统,如基于Amazon S3存储的文件系统。

使用hadoop fs操作S3

我们可以直接使用hadoop的命令操作一个S3的Bucket,步聚如下:

(使用hadoop-2.7.2,进入hadoop-2.7.2目录中。)

1.首先在common/lib中添加hadoop-aws-2.7.2.jar和aws-java-sdk-1.7.4.jar这两个文件:

cp share/hadoop/tools/lib/hadoop-aws-2.7.2.jar share/hadoop/common/lib/
cp share/hadoop/tools/lib/aws-java-sdk-1.7.4.jar share/hadoop/common/lib/
cp share/hadoop/tools/lib/jackson-*.jar share/hadoop/common/lib/

2.使用类似下面的命令可操作S3:

bin/hadoop fs -ls s3a://{awsAccessKeyId}:{awsSecretAccessKey}@{bucketName}/
bin/hadoop fs -cat s3a://{awsAccessKeyId}:{awsSecretAccessKey}@{bucketName}/test.log

URI scheme可以是s3n也可以是s3a,s3n有文件最大5G的限制,s3a是s3n的替代方案,做了优化,也没有5G的文件大小限制。

在Hadoop的配置文件core-site.xml中,可以将AWS的信息配置进去,以简化命令:

core-site.xml

<configuration>
  <property>
    <name>fs.s3a.access.key</name>
    <value>{awsAccessKeyId}</value>
  </property>
  <property>
    <name>fs.s3a.secret.key</name>
    <value>{awsSecretAccessKey}</value>
  </property>
  <property>
    <name>fs.defaultFS</name>
    <value>s3a://{bucketName}</value>
  </property>
</configuration>

然后可直接使用类似下面的命令操作S3:

bin/hadoop fs -cat /
bin/hadoop fs -cat /test.log

也可使用下面的命令从HDFS复制文件到S3:

bin/hadoop distcp hdfs://localhost:9000/test/test.log s3a://{bucketName}/

在执行上述命令前,将配置文件core-site.xml中fs.defaultFS改为hdfs://localhost:9000后启动hdfs服务,并在hdfs中存入一个test/test.log文件。


#S3只是一个资料存储,并不是文件系统,无法代替HDFS!#