jdbc用partitionColumn读取 - 仍然只看到1个执行器正在做任何工作

时间:2017-12-26 15:58:28

标签: pyspark spark-dataframe spark-jdbc

我一直致力于基于pyspark的内容提取/同步工具(类似于sqoop,但将某些转换应用为管道)。我通过以下方式创建了一个jdbc连接:

datatype_boundry_mappings = {
    # https://docs.microsoft.com/en-us/sql/t-sql/data-types/int-bigint-smallint-and-tinyint-transact-sql
    # We are not not using negative numbers below 10 anywhere so our lower limit does not match the sqlserver range
    'sqlserver': {
        'tinyint': {
            'lower': 0,
            'upper': 255
        },
        'smallint': {
            'lower': -10,
            'upper': 32767
        },
        'int': {
            'lower': -10,
            'upper': 2147483647
        },
        'bigint': {
            'lower': -10,
            'upper': 9223372036854775807
        }
    }
}

(...)

    jdbc_df = spark.read \
        .format("jdbc") \
        .option("url", jdbc_url) \
        .option("dbtable", table_name) \
        .option("user", db_username) \
        .option("password", db_password) \
        .option("numPartitions", partitions) \
        .option("partitionColumn", primary_key_column) \
        .option("lowerBound", datatype_boundry_mappings['sqlserver'][primary_key_type]['lower']) \
        .option("upperBound", datatype_boundry_mappings['sqlserver'][primary_key_type]['upper']) \
        .option("selectMethod", 'direct') \
        .load()

在pyspark repl中,我可以确认我有4个分区但是我不知道如何判断每个分区的上/下共享是什么。

In [43]: delta_df.rdd.getNumPartitions()
Out[43]: 4

当我运行保存时,我最终将完成3个执行器/任务,并且最后执行器完成所有工作。当我扩展到一个非常大的(10亿行+)表 - 200个任务,其中199个完成< 100毫秒,最后一个所有工作。

我有几个问题:

  1. 如何调试每个分区/任务集
  2. 如何查看每个任务的查询内容(类似于#1)
  3. 我已经尝试将查询转换为spark.sql并进行创建临时视图等。优化器也做同样的事情。 (理解它共享相同的数据帧/连接设置)

    上游是mssql jdbc驱动程序mssql-jdbc-6.2.2.jre8,jdk 1.8.112(oracle)。 pyspark 2.2.0.2.6.3.0-235(hdp 2.6.3)

0 个答案:

没有答案