Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 亚马逊EMR上的Spark:“;等待来自池的连接超时";_Apache Spark_Amazon Emr - Fatal编程技术网

Apache spark 亚马逊EMR上的Spark:“;等待来自池的连接超时";

Apache spark 亚马逊EMR上的Spark:“;等待来自池的连接超时";,apache-spark,amazon-emr,Apache Spark,Amazon Emr,我正在一个小型的三服务器AmazonEMR5(Spark2.0)集群上运行Spark作业。我的作业运行了一个小时左右,失败了,错误如下。我可以手动重新启动,它可以工作,处理更多数据,最终再次失败 我的Spark代码相当简单,没有直接使用任何Amazon或S3API。我的Spark代码将S3文本字符串路径传递给Spark,Spark在内部使用S3 我的Spark程序只是在循环中执行以下操作:从S3加载数据->处理->将数据写入S3上的不同位置 我的第一个怀疑是,某些内部Amazon或Spark代码

我正在一个小型的三服务器AmazonEMR5(Spark2.0)集群上运行Spark作业。我的作业运行了一个小时左右,失败了,错误如下。我可以手动重新启动,它可以工作,处理更多数据,最终再次失败

我的Spark代码相当简单,没有直接使用任何Amazon或S3API。我的Spark代码将S3文本字符串路径传递给Spark,Spark在内部使用S3

我的Spark程序只是在循环中执行以下操作:从S3加载数据->处理->将数据写入S3上的不同位置

我的第一个怀疑是,某些内部Amazon或Spark代码没有正确处理连接,连接池将耗尽

com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.AmazonClientException: Unable to execute HTTP request: Timeout waiting for connection from pool
            at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:618)
            at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient.doExecute(AmazonHttpClient.java:376)
            at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient.executeWithTimer(AmazonHttpClient.java:338)
            at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:287)
            at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3826)
            at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.AmazonS3Client.getObjectMetadata(AmazonS3Client.java:1015)
            at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.AmazonS3Client.getObjectMetadata(AmazonS3Client.java:991)
            at com.amazon.ws.emr.hadoop.fs.s3n.Jets3tNativeFileSystemStore.retrieveMetadata(Jets3tNativeFileSystemStore.java:212)
            at sun.reflect.GeneratedMethodAccessor45.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:191)
            at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
            at com.sun.proxy.$Proxy44.retrieveMetadata(Unknown Source)
            at com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem.getFileStatus(S3NativeFileSystem.java:780)
            at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1428)
            at com.amazon.ws.emr.hadoop.fs.EmrFileSystem.exists(EmrFileSystem.java:313)
            at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand.run(InsertIntoHadoopFsRelationCommand.scala:85)
            at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:60)
            at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:58)
            at org.apache.spark.sql.execution.command.ExecutedCommandExec.doExecute(commands.scala:74)
            at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:115)
            at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:115)
            at org.apache.spark.sql.execution.SparkPlan$$anonfun$executeQuery$1.apply(SparkPlan.scala:136)
            at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
            at org.apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:133)
            at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:114)
            at org.apache.spark.sql.execution.QueryExecution.toRdd$lzycompute(QueryExecution.scala:86)
            at org.apache.spark.sql.execution.QueryExecution.toRdd(QueryExecution.scala:86)
            at org.apache.spark.sql.execution.datasources.DataSource.write(DataSource.scala:487)
            at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:211)
            at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:194)
            at sun.reflect.GeneratedMethodAccessor85.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:237)
            at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
            at py4j.Gateway.invoke(Gateway.java:280)
            at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:128)
            at py4j.commands.CallCommand.execute(CallCommand.java:79)
            at py4j.GatewayConnection.run(GatewayConnection.java:211)
            at java.lang.Thread.run(Thread.java:745)
    Caused by: com.amazon.ws.emr.hadoop.fs.shaded.org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
            at com.amazon.ws.emr.hadoop.fs.shaded.org.apache.http.impl.conn.PoolingClientConnectionManager.leaseConnection(PoolingClientConnectionManager.java:226)
            at com.amazon.ws.emr.hadoop.fs.shaded.org.apache.http.impl.conn.PoolingClientConnectionManager$1.getConnection(PoolingClientConnectionManager.java:195)
            at sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.conn.ClientConnectionRequestFactory$Handler.invoke(ClientConnectionRequestFactory.java:70)
            at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.conn.$Proxy45.getConnection(Unknown Source)
            at com.amazon.ws.emr.hadoop.fs.shaded.org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:423)
            at com.amazon.ws.emr.hadoop.fs.shaded.org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
            at com.amazon.ws.emr.hadoop.fs.shaded.org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
            at com.amazon.ws.emr.hadoop.fs.shaded.org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
            at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:837)
            at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:607)
            ... 41 more

我在EMR上的一个非常简单的程序中遇到了这个问题(从S3读取数据、过滤、写入S3)

我可以通过使用S3A文件系统实现并将
fs.S3A.connection.maximum
设置为
100
以拥有更大的连接池来解决这个问题。 (默认值为
15
;有关更多配置属性,请参阅)

以下是我设置配置的方式:

// in Scala
val hc = sc.hadoopConfiguration

// in Python (not tested)
hc = sc._jsc.hadoopConfiguration()

// setting the config is the same for both languages
hc.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
hc.setInt("fs.s3a.connection.maximum", 100)

要使其正常工作,传递给Spark的S3URI必须从
s3a://…

开始。在EMRFS站点配置中将fs.S3.maxConnections设置为大于默认值500的值也可以解决此问题

如果使用Java SDK启动EMR集群,您可以使用
withConfigurations
方法进行设置(这比通过修改文件手动完成要容易得多)。另见

您可以使用EMR中的“配置”选项卡检查是否已正确设置,例如:


如需进一步帮助,您需要提供代码示例和/或告诉我们您的代码使用的语言。其他地方也提到了这类问题,他们编写了一段代码来处理仍然存在的S3连接:AWS中的Spark 1.6.1遇到了一个非常类似的问题。从调试日志中,我可以看到每个执行器在任务结束时都无法释放连接。也就是说:执行器可能会开始处理spark task 5,在处理该任务时,它会多次调用S3,然后关闭连接,但当任务结束时(它想启动task 6),一个连接没有关闭。因此,如果连接池大小为n,则当执行器启动其n+1任务时会出现此错误。同样,如果我只使用Dataframewriter和Dataframereader,如何关闭S3连接?这里的问题相同。有人找到解决办法了吗?谢谢,我们面临着同样的问题。有人找到了解决办法吗?我看到了同样的问题。上述情况对我来说似乎没有任何影响。我们肯定在使用s3a URL。文档中说“经典”s3:文件系统用于在Amazon s3存储中存储对象。注意:s3:正在逐步淘汰。请改用s3n:或s3a:。@Markus您指的是什么文档?Amazon在其最新的EMR文档中写道:“不支持
s3a
协议。我们建议您使用
s3
代替
s3a
”()@hiddenbit:查看@Markus:此页面显示了如何从Hadoop连接到s3的一般方法–有
s3a
。但是这个问题是关于从AWS EMR访问S3的,这里应该使用
S3
,因为EMR提供了专有的Amazon EMRFS来访问S3,具有更高的性能。在@hiddenbit的解决方案中,他使用
sc.hadoopConfiguration
,这允许我们在代码中对其进行更改。您知道我们是否可以将这种方法用于
fs.s3.maxConnections
?因为我们想要自动化作业运行,在每个节点上修改此文件非常麻烦。如果您阅读到链接页面的末尾,它会告诉您如何在启动时为整个集群设置它。啊,是的,我略过了,因为它看起来像步骤5的一部分(格式不良)。