Hadoop ApacheOzone+AWSS3.NETAPI:PutObject正在创建一个bucket而不是一个键

Hadoop ApacheOzone+AWSS3.NETAPI:PutObject正在创建一个bucket而不是一个键,hadoop,amazon-s3,aws-sdk,ozone,Hadoop,Amazon S3,Aws Sdk,Ozone,我正在尝试使用AWSS3API for.NET在ApacheOzone中创建密钥 我试图创建的密钥必须位于我使用AWS S3 CLI创建的名为test的bucket中 我的代码: static async Task WriteFile() { AmazonS3Config config = new AmazonS3Config(); config.ServiceURL = "http://myApacheOzoneEndpoint:8744"; /

我正在尝试使用AWSS3API for.NET在ApacheOzone中创建密钥

我试图创建的密钥必须位于我使用AWS S3 CLI创建的名为test的bucket中

我的代码:

    static async Task WriteFile()
    {
        AmazonS3Config config = new AmazonS3Config();
        config.ServiceURL = "http://myApacheOzoneEndpoint:8744"; // This port is mapped from a docker container to (not the original endpoint port for Ozone)

        AWSCredentials credentials = new BasicAWSCredentials("testuser/scm@EXAMPLE.COM", "c261b6ecabf7d37d5f9ded654b1c724adac9bd9f13e247a235e567e8296d2999"); // Credentials must be set but can be random since Ozone doesn't use authentication
        AmazonS3Client client = new AmazonS3Client(credentials, config);

        using (FileStream fs = File.OpenRead(@"C:\Users\me\path.to.file\image.jpg"))
        {
            string responseBody = "";
            try
            {
                PutObjectRequest request = new PutObjectRequest
                {

                    BucketName = "test",
                    Key = "deleteme.jpg",
                    InputStream = fs
                };

                PutObjectResponse response = await client.PutObjectAsync(request);
                Console.WriteLine($"Result: {response.HttpStatusCode.ToString()}");
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered ***. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }
    }
这段代码返回了一个200代码错误OK,如果我从API调用GetObjectAsync,我会得到一个带有元数据的HTML,但此时无法读取文件内容

然后我转到Apache Ozone并在Ozone shell中执行以下命令:

bash-4.2$ ozone s3  path test
Volume name for S3Bucket is : s3c89e813c80ffcea9543004d57b2a1239
Ozone FileSystem Uri is : o3fs://test.s3c89e813c80ffcea9543004d57b2a1239
bash-4.2$ ozone sh bucket list /s3c89e813c80ffcea9543004d57b2a1239
[ {
  "volumeName" : "s3c89e813c80ffcea9543004d57b2a1239",
  "bucketName" : "test",
  "createdOn" : "Wed, 01 Apr 2020 08:06:40 GMT",
  "acls" : null,
  "versioning" : "DISABLED",
  "storageType" : "DISK",
  "encryptionKeyName" : "N/A"
}, {
  "volumeName" : "s3c89e813c80ffcea9543004d57b2a1239",
  "bucketName" : "deleteme.jpg",
  "createdOn" : "Tue, 31 Mar 2020 10:57:26 GMT",
  "acls" : null,
  "versioning" : "DISABLED",
  "storageType" : "DISK",
  "encryptionKeyName" : "N/A"
} ]
bash-4.2$ ozone sh key list /s3c89e813c80ffcea9543004d57b2a1239/test => This command returns only keys that have been put from AWS S3 CLI
如您所见,该对象在用于S3的Ozone卷中创建为一个新bucket,而不是在testbucket下面创建为一个新键。如果我尝试从AWS S3 Cli放入密钥,它将按预期工作

发生了什么事

仅供参考,我用Java API制作了相同的示例,同样的问题也发生了


感谢您,Ozone s3网关默认使用,而更新的sdk库使用虚拟托管寻址。最快的解决方案是切换到路径样式:

// AmazonS3Config config = new AmazonS3Config();
config.ForcePathStyle = true;
或者,正如文档中提到的,您可以在ozone中启用虚拟托管模式


请注意,aws s3中的路径样式

默认情况下,Ozone s3网关使用,而更新的sdk库使用虚拟托管寻址。最快的解决方案是切换到路径样式:

// AmazonS3Config config = new AmazonS3Config();
config.ForcePathStyle = true;
或者,正如文档中提到的,您可以在ozone中启用虚拟托管模式


请注意,aws s3中的路径样式

是否可以从群集外部运行ozone CLI?与aws cli类似,您可以使用aws cli从本地计算机对存储桶执行操作。如果可以在群集外部运行Ozone CLI而不连接到OM主机,例如,是否有一个站点可以让我了解如何构建CLI?是否可以从群集外部运行ozone CLI?与aws cli类似,您可以使用aws cli从本地计算机对存储桶执行操作。如果可以在群集外部运行Ozone CLI而不连接到OM主机,例如,是否有一个站点可以让我了解如何构建CLI?谢谢