Tag: amazon s3

解压缩HTTPInputStream时GZIPInputStream过早关闭

题 请参阅下面编辑部分中的更新问题 我正在尝试使用GZIPInputStream动态解压缩来自Amazon S3的大型(~300M)GZIPed文件,但它只输出文件的一部分; 但是,如果我在解压缩之前下载到文件系统,那么GZIPInputStream将解压缩整个文件。 如何让GZIPInputStream解压缩整个HTTPInputStream而不只是解压缩它的第一部分? 我试过的 请参阅下面编辑部分中的更新 我怀疑HTTP问题,除了没有抛出任何exception,GZIPInputStream每次返回一个相当一致的文件块,据我所知,它总是在WET记录边界上打破,尽管它选择的边界是不同的URL(这很奇怪,因为所有内容都被视为二进制流,文件中的WET记录根本没有解析。) 我能找到的最接近的问题是当从s3读取时GZIPInputStream过早关闭该问题的答案是一些GZIP文件实际上是多个附加的GZIP文件而GZIPInputStream不能很好地处理。 但是,如果是这种情况,为什么GZIPInputStream可以在文件的本地副本上正常工作? 演示代码和输出 下面是一段示例代码,演示了我所看到的问题。 我在两个不同的网络上的两台不同的Linux计算机上用Java 1.8.0_72和1.8.0_112测试了它,结果相似。 我希望解压缩的HTTPInputStream中的字节数与文件的解压缩本地副本的字节数相同,但解压缩的HTTPInputStream要小得多。 产量 Testing URL https://commoncrawl.s3.amazonaws.com/crawl-data/CC-MAIN-2016-50/segments/1480698540409.8/wet/CC-MAIN-20161202170900-00009-ip-10-31-129-80.ec2.internal.warc.wet.gz Testing HTTP Input Stream direct to GZIPInputStream Testing saving to file before decompression Read 87894 bytes from HTTP->GZIP Read 448974935 bytes from HTTP->file->GZIP Output from HTTP->GZIP saved to file testfile0.wet —— Testing URL https://commoncrawl.s3.amazonaws.com/crawl-data/CC-MAIN-2016-50/segments/1480698540409.8/wet/CC-MAIN-20161202170900-00040-ip-10-31-129-80.ec2.internal.warc.wet.gz Testing […]

如何使用REST API和数据库扩展Java应用程序?

我有一个典型的无状态Java应用程序,它提供REST API并在Postgresql数据库中执行更新(CRUD)。 然而,客户的数量正在增长,我觉得有必要 增加冗余,以便在发生另一个失败时发生 为此,我可能需要一个负载均衡器? 通过不淹没网络和一台服务器的CPU来提高响应速度(但负载均衡器将如何不被淹没?) 也许我需要分发数据库? 我希望能够无缝更新我的应用程序(我已经看到了一个名为kubernetes的东西):逐个杀死每个冗余节点并立即用更新版本替换它 我的应用程序还存储了一些图像文件,这些文件在磁盘大小上快速增长,我需要能够分发它们 所有这一切都必须是可备份的 这是我现在拥有的图表(Java app和DB都在同一台服务器上): 缩放这个的最佳/正确方法是什么? 谢谢!

使用AWS Java SDK为现有S3对象设置Expires标头

我正在更新Amazon S3存储桶中的现有对象以设置一些元数据。 我想为每个对象设置HTTP Expires标头以更好地处理HTTP / 1.0客户端。 我们正在使用AWS Java SDK ,它允许对对象进行元数据更改,而无需重新上传对象内容。 我们使用CopyObjectRequest将对象复制到自身。 ObjectMetadata类允许我们设置Cache-Control , Content-Type和其他几个标头。 但不是Expires标题。 我知道S3使用REST API存储并为对象PUT提供Expires头。 有没有办法从Java SDK中执行此操作? 更新以指示我们正在使用 CopyObjectRequest

Spring Boot亚马逊AWS S3存储桶文件下载 – 访问被拒绝

我有一个自动配置的AWS,Spring Boot应用程序,我正在尝试设置一个端点,只需从Amazon S3中的给定存储桶下载特定文件。 我使用AWS控制台从我的计算机上将一个JPEG文件上传到存储桶中 – 现在我正在尝试使用我的Spring Boot API下载该文件。 我收到以下错误: com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; 我在AWS控制台上创建了一个用户和一个组(用户在组中); 用户/组具有S3的完全访问权限以及管理员访问权限。 我下载了访问密钥/密钥对,出于测试目的,将密钥直接粘贴到我的application.properties文件中,如下所示(此处未显示密钥,显然:))。 我很困惑为什么我仍然被拒绝访问。 我一直在寻找和研究这个问题; 我似乎无法找到特定于Spring Boot的此问题的解决方案。 任何帮助将不胜感激。 application.properties: cloud.aws.credentials.accessKey=myaccesskey cloud.aws.credentials.secretKey=mysecretkey cloud.aws.credentials.instanceProfile=false cloud.aws.stack.auto=false cloud.aws.region.auto=true cloud.aws.region.static=myregion SimpleResourceLoadingBean.java: @RestController public class SimpleResourceLoadingBean { private static Logger log = LoggerFactory.getLogger(HealthMonitorApplication.class); @Autowired private ResourceLoader resourceLoader; @RequestMapping(“/getresource”) public String […]

使用Java进行AWS S3文件搜索

我们使用java类从AWS s3存储桶下载文件,其代码如下 inputStream = AWSFileUtil.getInputStream( AWSConnectionUtil.getS3Object(null), “cdn.generalsentiment.com”, filePath); AWSFileUtil是一个检查凭据并使用getInputStream方法从S3bucket获取输入流的类.filePath是cdn.generalsentiment.com存储桶中的文件。 我们想要编写一种方法,只需检查AWS S3存储桶中是否存在特定文件,并返回布尔值或其他值。 请为我建议一个解决方案。 public static boolean isValidFile(AmazonS3 s3, String bucketName, String path) throws AmazonClientException { try { ObjectMetadata objectMetadata = s3.getObjectMetadata(“cdn.generalsentiment.com”, path); } catch (NotFoundException nfe) { nfe.printStackTrace(); } return true; } 如果文件存在则返回true,否则抛出NotFoundException,我想捕获并将“isValidFile”方法结果返回为false。 伙计方法体或返回类型的任何其他替代方案都会很棒。 更新的一个 public static boolean doesFileExist(AmazonS3 s3, String bucketName, String path) throws AmazonClientException, […]

从S3下载文件> 3Gb失败,出现“SocketTimeoutException:Read timed out”

AWS Java SDK 1.9.3 在Java服务器应用程序中从AWS S3下载许多大文件(~3Gb)时,我会不时收到SocketTimeoutException,如下所示: Caused by: com.amazonaws.AmazonClientException: Unable to store object contents to disk: Read timed out at com.amazonaws.services.s3.internal.ServiceUtils.downloadObjectToFile(ServiceUtils.java:270) at com.amazonaws.services.s3.internal.ServiceUtils.retryableDownloadS3ObjectToFile(ServiceUtils.java:344) at com.amazonaws.services.s3.transfer.TransferManager$2.call(TransferManager.java:737) … 4 more Caused by: java.net.SocketTimeoutException: Read timed out at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:152) at java.net.SocketInputStream.read(SocketInputStream.java:122) at sun.security.ssl.InputRecord.readFully(InputRecord.java:442) at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:554) at sun.security.ssl.InputRecord.read(InputRecord.java:509) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927) at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884) at sun.security.ssl.AppInputStream.read(AppInputStream.java:102) at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:198) […]

Maven部署包并上传到AWS-Lambda

我在将maven部署包上传到Amazon s3时遇到了问题。 从Eclipse,我能够成功生成.jar文件,但是我在上传到服务器时遇到了问题。 这是我的Java代码: package main.java.mavantestproj; import java.util.Map; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; import com.amazonaws.services.lambda.runtime.Context; public class LambdaFunctionHandler { public String handleRequest(Map input, Context context) { context.getLogger().log(“Input: ” + input); AmazonDynamoDBClient client = new AmazonDynamoDBClient(new ProfileCredentialsProvider(“mytest”)); client.setRegion(com.amazonaws.regions.Region.getRegion(Regions.US_WEST_2)); client.describeTable(“ProductCatalog”); // TODO: implement your handler return null; } } 在目标文件夹中我有2个jar子。 即lambda-java-example-1.0-SNAPSHOT.jar&original-lambda-java-example-1.0-SNAPSHOT.jar 在这第一个jar子是35MB,第二个jar子是4KB。 我没有得到哪一个上传到S3来运行我的lambda函数。

并行读取S3中的多个文件(Spark,Java)

我看到了一些关于此的讨论,但还不太明白正确的解决方案:我想将S3中的几百个文件加载到RDD中。 我现在就是这样做的: ObjectListing objectListing = s3.listObjects(new ListObjectsRequest(). withBucketName(…). withPrefix(…)); List keys = new LinkedList(); objectListing.getObjectSummaries().forEach(summery -> keys.add(summery.getKey())); // repeat while objectListing.isTruncated() JavaRDD events = sc.parallelize(keys).flatMap(new ReadFromS3Function(clusterProps)); ReadFromS3Function使用AmazonS3客户端执行实际读取: public Iterator call(String s) throws Exception { AmazonS3 s3Client = getAmazonS3Client(properties); S3Object object = s3Client.getObject(new GetObjectRequest(…)); InputStream is = object.getObjectContent(); List lines = new LinkedList(); String str; try […]

S3 Java客户端因“Content-Length delimited message body的过早结束”或“java.net.SocketException Socket closed”而失败了很多

我有一个应用程序在S3上做了很多工作,主要是从它下载文件。 我看到很多这类错误,我想知道这是否是我的代码上的内容,或者这项服务是否真的不可靠。 我用来从S3对象流中读取的代码如下: public static final void write(InputStream stream, OutputStream output) { byte[] buffer = new byte[1024]; int read = -1; try { while ((read = stream.read(buffer)) != -1) { output.write(buffer, 0, read); } stream.close(); output.flush(); output.close(); } catch (IOException e) { throw new RuntimeException(e); } } 此OutputStream是一个新的BufferedOutputStream(新的FileOutputStream(文件)) 。 我使用的是最新版本的Amazon S3 Java客户端,在放弃之前会重试此调用四次 。 因此,在尝试了4次后,它仍然失败。 关于如何改进这一点的任何提示或提示都表示赞赏。

如何在当前日期的1年内设置Amazon S3存储桶预签名URL到期时间

图像上传到Amazon S3存储桶。 我需要从Amazon服务器获取预签名的URL 。 我还想设置该URL的到期时间。 最多只需17天。 但我不能设置最长1年的到期时间。 Calendar cal = Calendar.getInstance(); cal.add(Calendar.YEAR, 1); Date nextYear = cal.getTime(); GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest( “bucketName”, “accessname”); generatePresignedUrlRequest.setMethod(HttpMethod.GET); generatePresignedUrlRequest .setExpiration(nextYear); URL url = s3client .generatePresignedUrl(generatePresignedUrlRequest); bucketURL = url.toString();