从Google App Engine应用程序运行Google Dataflow管道?

巴拉提·拉贾(Bharathi Raja)

我正在使用DataflowPipelineRunner创建数据流作业。我尝试了以下方案。

  1. 不指定任何machineType
  2. 用g1小机器
  3. 与n1-highmem-2

在上述所有情况下,Input是来自GCS的文件,该文件非常小(KB大小),输出是Big Query表。

在所有情况下我都遇到内存不足错误

我的编译代码大小为94mb。我正在尝试仅单词计数示例,并且它没有读取任何输入(在作业开始之前失败)。请帮助我了解为什么我会收到此错误。

注意:我正在使用appengine开始工作。

注意:相同的代码适用于beta versoin 0.4.150414

编辑1

根据答案中的建议,尝试了以下方法:

  1. 自动缩放转换基本缩放
  2. 二手机器类型B2,可提供256MB内存

完成这些配置后,即可解决Java堆内存问题。但是它试图将一个jar上载到超过10Mb的挂标签位置,因此失败了。

它记录以下异常

com.google.api.client.http.HttpRequest execute: exception thrown while executing request
com.google.appengine.api.urlfetch.RequestPayloadTooLargeException: The request to https://www.googleapis.com/upload/storage/v1/b/pwccloudedw-stagging-bucket/o?name=appengine-api-L4wtoWwoElWmstI1Ia93cg.jar&uploadType=resumable&upload_id=AEnB2Uo6HCfw6Usa3aXlcOzg0g3RawrvuAxWuOUtQxwQdxoyA0cf22LKqno0Gu-hjKGLqXIo8MF2FHR63zTxrSmQ9Yk9HdCdZQ exceeded the 10 MiB limit.
at com.google.appengine.api.urlfetch.URLFetchServiceImpl.convertApplicationException(URLFetchServiceImpl.java:157)
at com.google.appengine.api.urlfetch.URLFetchServiceImpl.fetch(URLFetchServiceImpl.java:45)
at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.fetchResponse(URLFetchServiceStreamHandler.java:543)
at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getInputStream(URLFetchServiceStreamHandler.java:422)
at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getResponseCode(URLFetchServiceStreamHandler.java:275)
at com.google.api.client.http.javanet.NetHttpResponse.<init>(NetHttpResponse.java:36)
at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:94)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:965)
at com.google.api.client.googleapis.media.MediaHttpUploader.executeCurrentRequestWithoutGZip(MediaHttpUploader.java:545)
at com.google.api.client.googleapis.media.MediaHttpUploader.executeCurrentRequest(MediaHttpUploader.java:562)
at com.google.api.client.googleapis.media.MediaHttpUploader.resumableUpload(MediaHttpUploader.java:419)
at com.google.api.client.googleapis.media.MediaHttpUploader.upload(MediaHttpUploader.java:336)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:427)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
at com.google.cloud.hadoop.util.AbstractGoogleAsyncWriteChannel$UploadOperation.call(AbstractGoogleAsyncWriteChannel.java:357)
at java.util.concurrent.FutureTask.run(FutureTask.java:260)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1168)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:605)
at com.google.apphosting.runtime.ApiProxyImpl$CurrentRequestThreadFactory$1$1.run(ApiProxyImpl.java:1152)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.apphosting.runtime.ApiProxyImpl$CurrentRequestThreadFactory$1.run(ApiProxyImpl.java:1146)
at java.lang.Thread.run(Thread.java:745)
at com.google.apphosting.runtime.ApiProxyImpl$CurrentRequestThreadFactory$2$1.run(ApiProxyImpl.java:1195)

我尝试直接上传jar文件-appengine-api-1.0-sdk-1.9.20.jar,但仍然尝试上传此jar appengine-api-L4wtoWwoElWmstI1Ia93cg.jar我不知道它是什么罐子。关于这个罐子的任何想法都值得赞赏。

请帮助我解决此问题。

卢卡斯·克维克(Lukasz Cwik)

简短的答案是,如果您在受管VM上使用AppEngine,则不会遇到AppEngine沙箱限制(使用F1或B1实例类时出现OOM ,执行时间限制问题,列入白名单的JRE类)。如果您确实想在App Engine沙箱中运行,那么您对Dataflow SDK的使用最符合AppEngine沙箱的限制。下面,我将解释常见问题以及人们为遵守AppEngine沙箱限制所做的工作。

Dataflow SDK需要一个AppEngine实例类,该实例类具有足够的内存来执行用户应用程序以构造管道,暂存任何资源并将作业描述发送到Dataflow服务。通常,我们已经看到用户要求使用具有超过128mb内存实例类才能看不到OOM错误。

如果已经准备好应用程序所需的资源,通常构造一个管道并将其提交给Dataflow服务通常只需不到几秒钟的时间。将您的JAR和任何其他资源上传到GCS可能需要60秒以上的时间。可以通过以下方式手动解决此问题:预先将JAR暂存到GCS(如果Dataflow SDK检测到它们已经存在,Dataflow SDK将跳过暂存)​​,或者使用任务队列获得10分钟的限制(请注意,对于大型应用程序,为10分钟)分钟可能不足以转移您的所有资源)。

最后,在AppEngine沙箱环境中,您和您的所有依赖项都仅限于在JRE中仅使用白名单类,否则您将得到类似以下的异常:

java.lang.SecurityException:
  java.lang.IllegalAccessException: YYY is not allowed on ZZZ
  ...

编辑1

我们对类路径上的jar的内容进行哈希处理,然后使用修改后的文件名将其上传到GCS。AppEngine使用自己的JAR运行沙盒环境,appengine-api-L4wtoWwoElWmstI1Ia93cg.jar引用了appengine-api.jar,这是沙盒环境添加的jar。您可以从PackageUtil#getUniqueContentName(...)中看到,我们只是.jar之前附加-$ HASH

我们正在努力解决为什么您会看到RequestPayloadToLarge异常的原因,并且目前建议您设置filesToStage选项并过滤掉执行数据流所需的jar,以解决您遇到的问题。您可以看到我们如何构建文件以与DataflowPipelineRunner#detectClassPathResourcesToStage(...)一起暂存

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

记录Google App Engine应用程序

Google Cloud Dataflow的备用管道运行器

部署Java Google App Engine灵活应用程序时出错-等待应用程序基础结构正常运行超时

Google App Engine PHP突然停止在本地运行应用程序

在多个客户域上运行Google App Engine应用程序

Google App Engine启动器未运行应用程序

在Google App Engine上运行的NextJs应用程序的正确配置是什么?

运行 php laravel 应用程序时出现问题 - Google App Engine

将Google App Engine应用程序升级到灵活环境时,如何运行Google的aefix工具?

使用 Google App Engine 或 Google Cloud Compute VM 来测试运行我的应用程序?

在Django应用程序的Google App Engine上启用CORS

在Google App Engine中部署Quart Python应用程序

在 Google App Engine 上部署应用程序时出错

Google App Engine Python应用程序需要登录

Google App Engine Java上的RESTful应用程序?

KeystoneJS 应用程序无法在 Google App Engine 上部署

将应用程序移植到Google App Engine

Google App Engine登录与应用程序登录

在Google App Engine(localhost)的Jetty上调试应用程序

上载Google App Engine应用程序时出错

使用Google App Engine创建Web应用程序?

Google Cloud中的不同App Engine应用程序

将Django应用程序部署到Google App Engine

将节点应用程序部署到Google App Engine

Web应用程序在本地系统上完美运行,并且在google-app-engine上以不可预测的方式运行

如何通过App Engine运行Google Cloud Dataflow作业?

Google App Engine 应用程序和 Google Cloud Engine 实例之间的通信

NameError:尝试在Google App Engine启动器上运行应用程序时未定义全局名称“ execfile”

适用于自己的Python应用程序的Google App-Engine运行setup.py安装