我看到了一些关于此问题的讨论,但无法理解正确的解决方案:我想将S3中的几百个文件加载到RDD中.我现在就是这样做的:
ObjectListing objectListing = s3.listObjects(new ListObjectsRequest().
withBucketName(...).
withPrefix(...));
List<String> keys = new LinkedList<>();
objectListing.getObjectSummaries().forEach(summery -> keys.add(summery.getKey())); // repeat while objectListing.isTruncated()
JavaRDD<String> events = sc.parallelize(keys).flatMap(new ReadFromS3Function(clusterProps));
Run Code Online (Sandbox Code Playgroud)
在ReadFromS3Function
不使用实际的阅读AmazonS3
客户端:
public Iterator<String> call(String s) throws Exception {
AmazonS3 s3Client = getAmazonS3Client(properties);
S3Object object = s3Client.getObject(new GetObjectRequest(...));
InputStream is = object.getObjectContent();
List<String> lines = new LinkedList<>();
String str;
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
if (is != null) {
while ((str = reader.readLine()) != null) {
lines.add(str);
}
} …
Run Code Online (Sandbox Code Playgroud) 在谷歌上搜索了一段时间,无法找到答案:假设我在一个 Pod 内有两个容器,其中一个必须向另一个容器发送一些秘密。我应该使用 https 还是通过 http 安全?如果我理解正确的话,Pod 内部的流量无论如何都会受到防火墙的保护,因此您无法窃听 Pod 外部的流量。那么...不需要 https 吗?
我正在Dataproc上运行spark作业,该作业从存储桶中读取大量文件,并将它们合并为一个大文件。我正在google-api-services-storage 1.29.0
通过阴影使用。到现在为止,它运行良好,可以合并约20-30K个文件。今天,我尝试使用大约5倍的文件进行尝试,然后突然陷入僵局(在东部,我想是我,因为似乎我的所有执行者都在无限期等待)。
这是线程转储:
org.conscrypt.NativeCrypto.SSL_read(Native Method)
org.conscrypt.NativeSsl.read(NativeSsl.java:416)
org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read(ConscryptFileDescriptorSocket.java:547) => holding Monitor(java.lang.Object@1638155334})
java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
java.io.BufferedInputStream.read(BufferedInputStream.java:345) => holding Monitor(java.io.BufferedInputStream@1513035694})
sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:735)
sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587) => holding Monitor(sun.net.www.protocol.https.DelegateHttpsURLConnection@995846771})
sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492) => holding Monitor(sun.net.www.protocol.https.DelegateHttpsURLConnection@995846771})
java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:347)
com.shaded.google.api.client.http.javanet.NetHttpResponse.<init>(NetHttpResponse.java:37)
com.shaded.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:105)
com.shaded.google.api.client.http.HttpRequest.execute(HttpRequest.java:981)
com.shaded.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
com.shaded.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
com.shaded.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeMedia(AbstractGoogleClientRequest.java:380)
com.shaded.google.api.services.storage.Storage$Objects$Get.executeMedia(Storage.java:6189)
com.shaded.google.cloud.storage.spi.v1.HttpStorageRpc.load(HttpStorageRpc.java:584)
com.shaded.google.cloud.storage.StorageImpl$16.call(StorageImpl.java:464)
com.shaded.google.cloud.storage.StorageImpl$16.call(StorageImpl.java:461)
com.shaded.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:89)
com.shaded.google.cloud.RetryHelper.run(RetryHelper.java:74)
com.shaded.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:51)
com.shaded.google.cloud.storage.StorageImpl.readAllBytes(StorageImpl.java:461)
com.shaded.google.cloud.storage.Blob.getContent(Blob.java:455)
my.package.with.my.StorageAPI.readFetchedLocation(StorageAPI.java:71)
...
Run Code Online (Sandbox Code Playgroud)
最终,我无济于事,不得不辞职。知道是什么原因造成的吗?我尝试在代码中同时使用a ThreadLocal<Storage>
和单个Storage
实例,这似乎没有什么区别。
java google-cloud-storage google-cloud-platform google-cloud-dataproc
我正在构建一个用于从云存储中获取加密机密的库(在 Scala 中,使用 Java 客户端)。我正在使用以下谷歌库:
"com.google.apis" % "google-api-services-cloudkms" % "v1-rev26-1.23.0" exclude("com.google.guava", "guava-jdk5"),
"com.google.cloud" % "google-cloud-storage" % "1.14.0",
Run Code Online (Sandbox Code Playgroud)
在本地一切正常,但是当我尝试在 Dataproc 中运行我的代码时,出现以下错误:
Exception in thread "main" java.lang.NoSuchMethodError: com.google.api.client.googleapis.services.json.AbstractGoogleJsonClient$Builder.setBatchPath(Ljava/lang/String;)Lcom/google/api/client/googleapis/services/AbstractGoogleClient$Builder;
at com.google.api.services.cloudkms.v1.CloudKMS$Builder.setBatchPath(CloudKMS.java:4250)
at com.google.api.services.cloudkms.v1.CloudKMS$Builder.<init>(CloudKMS.java:4229)
at gcp.encryption.EncryptedSecretsUser$class.clients(EncryptedSecretsUser.scala:111)
at gcp.encryption.EncryptedSecretsUser$class.getEncryptedSecrets(EncryptedSecretsUser.scala:62)
Run Code Online (Sandbox Code Playgroud)
我的代码中的违规行是:
val kms: CloudKMS = new CloudKMS.Builder(credential.getTransport,
credential.getJsonFactory,
credential)
.setApplicationName("Encrypted Secrets User")
.build()
Run Code Online (Sandbox Code Playgroud)
我在文档中看到一些 google 库在 Dataproc 上可用(我使用的是映像版本为 1.2.15 的 Spark 集群)。但据我所知,google-api-client 的传递依赖与我在本地使用的依赖 (1.23.0) 相同。那么怎么找不到方法呢?
我是否应该为在 Dataproc 上运行设置不同的依赖项?
最后设法在另一个项目中解决了这个问题。事实证明,除了对所有 google 依赖项(包括 gcs-connector !!)进行着色之外,您还必须向 JVM 注册着色类以处理 gs:// 文件系统。下面是适用于我的 maven 配置,使用 sbt 可以实现类似的功能:
父 POM: …
java scala google-cloud-storage google-cloud-dataproc google-cloud-kms
java ×3
amazon-s3 ×1
apache-spark ×1
containers ×1
https ×1
kubernetes ×1
networking ×1
scala ×1