Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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 为什么spark应用程序会崩溃,出现异常java.net.SocketException:Connection重置,即使提供了足够的内存&;分区?_Apache Spark_Pyspark_Google Cloud Dataproc - Fatal编程技术网

Apache spark 为什么spark应用程序会崩溃,出现异常java.net.SocketException:Connection重置,即使提供了足够的内存&;分区?

Apache spark 为什么spark应用程序会崩溃,出现异常java.net.SocketException:Connection重置,即使提供了足够的内存&;分区?,apache-spark,pyspark,google-cloud-dataproc,Apache Spark,Pyspark,Google Cloud Dataproc,我正在尝试将一个表从Sqlserver数据库加载到Bigquery,该表的大小为27gb、2.18亿行和28列 源表没有任何包含唯一值的列,以便Spark对传入数据进行均匀分区。因此,我将row_number()应用于我正在读取的数据,如下所示: spark = SparkSession.builder.appName('Read_from_Source').getOrCreate() dataframe = spark.read.format('jdbc').option('url', URL

我正在尝试将一个表从Sqlserver数据库加载到Bigquery,该表的大小为27gb、2.18亿行和28列

源表没有任何包含唯一值的列,以便Spark对传入数据进行均匀分区。因此,我将row_number()应用于我正在读取的数据,如下所示:

spark = SparkSession.builder.appName('Read_from_Source').getOrCreate()
dataframe = spark.read.format('jdbc').option('url', URL).option('driver', 'con.microsoft.sqlserver.jdbc.SQLServerDriver).
            option('user', user).
            option('password', password).
            option('dbtable', f'select *, row_number() over(ORDER BY (SELECT 1)) as row_num from {tablename}) as temp_load').
            option('partitionColumn',row_num).
            option('numPartitions', 400).
            option('lowerBound', 1).
            option('upperBound', countOfNumOfRows).
            load()
dataframe.write.format('bigquery').option('table','tablename').mode('overwrite').save()
我为作业提供了以下配置:

> spark.submit.deployMode = Cluster 
> spark.executor.instances=4
> spark.execuor.memory=2g spark.executor.cores=4 spark.driver.memory=2g
> spark.network.timeout=240
当我提交作业时,它启动得很好,但一段时间后,if失败,出现异常
连接重置
,如下所示

Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:1981)
下面可以看到执行者和舞台。执行者在这里输入图像描述

我的工作的阶段(只有一个阶段,因为它只是读取和加载):

我认为在读取数据时连接正在断开/中断,因此出现了连接重置异常。所以我尝试将spark.network.timeout增加到100000,并将numPartitions从200增加到400。错误仍然是一样的

我还将执行器实例增加到6个(我有2个工作节点),执行器内存增加到6gb,驱动程序内存增加到4gb。我仍然看到同样的问题

我在这里读取数据时应用分区,以避免数据倾斜。给出的内存也非常高

Edit1:这里没有数据发送到驱动程序,因为给定的行是我正在运行的唯一代码


我设计代码的方式有什么问题吗?有人能给我一个解决这个异常的建议吗?

看起来您正在使用至少200个分区从SQL Server读取数据。SQL Server可能无法处理如此多的这种大小的并发查询并删除/重置连接

如果是这种情况,那么要解决这个问题,您需要减少Spark作业的并行性(分区的数量可以相同,但执行器/集群节点的数量要小一些以减少并发性)或增强(硬件或配置)SQL Server,以便它能处理更高的负载或更并发的大型查询

此外,您可能希望尝试在群集上禁用Conscrypt:


一般来说,您可能应该使用类似的方法从SQL Server导出数据。

是否使用较小的数据集进行了测试?您可以尝试在SQL查询中添加
限制1000
。您有27gb的数据,但spark上下文中的总内存为4*2gb+2gb=10gb。在sql server上为2.18亿条记录指定行号可能会导致问题。您可以在从sql server获取分区后执行此分区工作。在读取时,仍然面临相同的问题,但没有分区。@Dagang it正在使用limit。作业甚至运行时有5400万行大小为20gb。@这可能是因为JDBC驱动程序无法正确估计正在工作的RS fetch大小。您是否尝试将其显式设置为某个较低的值?类似于
选项(“fetchsize”,“1000”)
的功能就可以了。