【发布时间】:2020-08-15 16:10:55
【问题描述】:
我需要将 MySQL 中一组表的增量记录以 Parquet 格式加载到 Amazon S3。这些表在 AWS MySQL 托管实例中的多个数据库/模式中很常见。代码应该从每个模式(具有一组公共表)中并行复制数据。
我正在使用读取 API PySpark SQL 连接到 MySQL 实例并读取模式的每个表的数据,并使用写入 API 作为 Parquet 文件将结果数据帧写入 S3。我正在为数据库中的每个表循环运行它,如下面的代码所示:
def load_data_to_s3(databases_df):
db_query_properties = config['mysql-query']
auto_id_values = config['mysql-auto-id-values']
for row in databases_df.collect():
for table in db_query_properties.keys():
last_recorded_id_value = auto_id_values[table]
select_sql = "select * from {}.{} where id>{}".format(row.database_name, table, last_recorded_id_value)
df = spark.read.format("jdbc") \
.option("driver", mysql_db_properties['driver']) \
.option("url", row.database_connection_url) \
.option("dbtable", select_sql) \
.option("user", username) \
.option("password", password) \
.load()
s3_path = 's3a://{}/{}/{}'.format(s3_bucket, database_dir, table)
df.write.parquet(s3_path, mode="append")
我想知道如何将此代码扩展到在 EMR 集群中并行运行的多个数据库。请建议我一个合适的方法。如果需要更多详细信息,请告诉我。
【问题讨论】:
-
为什么不一次向 EMR 提交多个作业(每个 db 一个作业)?
-
每个数据库服务器有 50 多个数据库,并且有 30 多个这样的服务器。因此,我认为如果我们为每个数据库单独启动它们,检查所有单个作业将是一项繁重的任务。随时就此提供建议。谢谢
-
嗯..为什么不直接将日志写入 S3如果 发生任何故障?如果您想增加并行度,最简单的方法是拆分作业并为每个作业分配自己的内存和处理器。
-
我相信您正在寻找的替代方法是使用线程来启动作业的多个实例。但这需要您更改代码。请查看我的答案以获取示例实现。
标签: apache-spark pyspark apache-spark-sql python-multiprocessing amazon-emr