我正在使用DataflowPipelineRunner创建数据流作业。我尝试了以下方案。
在上述所有情况下,Input是来自GCS的文件,该文件非常小(KB大小),输出是Big Query表。
在所有情况下我都遇到内存不足错误
我的编译代码大小为94mb。我正在尝试仅单词计数示例,并且它没有读取任何输入(在作业开始之前失败)。请帮助我了解为什么我会收到此错误。
注意:我正在使用appengine开始工作。
注意:相同的代码适用于beta versoin 0.4.150414
编辑1
根据答案中的建议,尝试了以下方法:
完成这些配置后,即可解决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。我不知道它是什么罐子。关于这个罐子的任何想法都值得赞赏。
请帮助我解决此问题。
简短的答案是,如果您在受管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] 删除。
我来说两句