代码之家  ›  专栏  ›  技术社区  ›  Andrey

SparkSQL连接问题

  •  1
  • Andrey  · 技术社区  · 6 年前

    我有一个Spark作业,它将CSV文件中的数据加载到MySQL数据库中。

    一切正常,但最近我注意到Spark在插入阶段打开了许多连接(300+个连接)感觉就像对每个insert语句打开一个新的连接,保持它打开,并在某个时间点执行commit和关闭连接有没有办法在每次插入后或在10K批处理后执行提交并执行一次提交?

    这将不会为每个插入打开连接如果它需要处理1K条记录,这是很好的,但是当你处理数十亿条记录时,它需要大量的资源。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Lakshman Battini    6 年前

    如果对dataframe有任何操作,则默认情况下,spark将创建200个分区导致200个到数据库的连接。

    spark.sql.shuffle.partitions—配置在对连接或聚合的数据进行无序处理时要使用的分区数--默认值:200

    使用以下方法检查数据帧的分区数:

    df.rdd.getNumPartitions

    在常用列上使用重新分区数据帧:
    df.repartition(NUMBER_OF_PARTIOTONS, col("Frequent_used_column"))

    还可以设置“batchsize”参数来控制每次往返要插入的行数这有助于提高JDBC驱动程序的性能默认为1000。

    jdbcDF.write
      .format("jdbc")
      .option("url", "jdbc:postgresql:dbserver")
      .option("dbtable", "schema.tablename")
      .option("user", "username")
      .option("password", "password")
      .option("batchsize", 5000)
      .save()