Apache spark 针对数据帧的200万次查询

Apache spark 针对数据帧的200万次查询,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我需要对一个大小为100亿行的三列表t(s,p,o)运行200万个查询。每列的数据类型为字符串 只有两种类型的查询: 从t中选择s p o,其中s=param 从t中选择s p o,其中o=param 如果我使用Java ThreadPoolExecutor将表存储在Postgresql数据库中,需要6个小时 你认为Spark能更快地处理查询吗? 最好的策略是什么?以下是我的想法: 将表加载到数据框中,并针对该数据框启动查询 将表加载到parquet数据库中,并针对该数据库启动查询 使用S

我需要对一个大小为100亿行的三列表t(s,p,o)运行200万个查询。每列的数据类型为字符串

只有两种类型的查询:

  • 从t中选择s p o,其中s=param
  • 从t中选择s p o,其中o=param
如果我使用Java ThreadPoolExecutor将表存储在Postgresql数据库中,需要6个小时

你认为Spark能更快地处理查询吗? 最好的策略是什么?以下是我的想法:

  • 将表加载到
    数据框中
    ,并针对该数据框启动查询
  • 将表加载到
    parquet
    数据库中,并针对该数据库启动查询
  • 使用Spark 2.4对Postgresql数据库启动查询,而不是直接查询
  • 使用Spark 3.0对加载到支持GPU的PostgreSQL扩展模块中的数据库启动查询

谢谢,

在现有MySQL或PostgresSQL服务器上使用Apache Spark(无需将数据导出或流式传输到Spark或Hadoop)可以将查询性能提高十倍以上。使用多个MySQL服务器(复制或Percona XtraDB集群)可以为某些查询提供额外的性能提升。您还可以使用Spark cache函数来缓存整个MySQL查询结果表。 想法很简单:Spark可以通过JDBC读取MySQL或PostgresSQL数据,还可以执行SQL查询,因此我们可以将其直接连接到DB并运行查询。为什么这样更快?对于长时间运行(即,报告或BI)查询,它可以更快,因为Spark是一个大规模并行系统。例如,MySQL每个查询只能使用一个CPU核心,而Spark可以使用所有集群节点上的所有核心


但我建议您不要使用SQL(HBase、Cassandra等)或新的SQL解决方案进行分析,因为它们在数据规模增加时具有更好的性能。

在现有MySQL或PostgresSQL服务器上使用Apache Spark(无需将数据导出或流式传输到Spark或Hadoop)可以将查询性能提高十倍以上。使用多个MySQL服务器(复制或Percona XtraDB集群)可以为某些查询提供额外的性能提升。您还可以使用Spark cache函数来缓存整个MySQL查询结果表。 想法很简单:Spark可以通过JDBC读取MySQL或PostgresSQL数据,还可以执行SQL查询,因此我们可以将其直接连接到DB并运行查询。为什么这样更快?对于长时间运行(即,报告或BI)查询,它可以更快,因为Spark是一个大规模并行系统。例如,MySQL每个查询只能使用一个CPU核心,而Spark可以使用所有集群节点上的所有核心


但我建议您不要使用SQL(HBase、Cassandra等)或新的SQL解决方案进行分析,因为它们在数据规模增加时具有更好的性能。

静态数据?火花;否则,调整Postgres

如果100亿行是静态的或很少更新,那么最好使用Spark和适当的分区。并行化带来了神奇的效果,所以内核越多越好。您希望将目标对准每个分区大小约为半gig的分区

通过运行
选择pg_size_pretty(pg_total_relationship_size('tablename'))来确定数据的大小将结果除以可用于Spark的磁芯数,直到达到1/8到3/4 gig之间

如果您确实有静态数据或希望快速从故障中恢复,请另存为“拼花”

如果源数据经常更新,那么您需要在Postgres中添加索引。它可以像在每列上添加索引一样简单。在Postgres中进行分区也会有所帮助

坚持读博士后。较新的数据库不适合像您这样的结构化数据。有并行化选项。奥罗拉,如果你在AWS


PG Strom不会在这里为你工作。您的数据很简单,只有很少的列。让它们进出GPU会让你的速度太慢。

静态数据?火花;否则,调整Postgres

如果100亿行是静态的或很少更新,那么最好使用Spark和适当的分区。并行化带来了神奇的效果,所以内核越多越好。您希望将目标对准每个分区大小约为半gig的分区

通过运行
选择pg_size_pretty(pg_total_relationship_size('tablename'))来确定数据的大小将结果除以可用于Spark的磁芯数,直到达到1/8到3/4 gig之间

如果您确实有静态数据或希望快速从故障中恢复,请另存为“拼花”

如果源数据经常更新,那么您需要在Postgres中添加索引。它可以像在每列上添加索引一样简单。在Postgres中进行分区也会有所帮助

坚持读博士后。较新的数据库不适合像您这样的结构化数据。有并行化选项。奥罗拉,如果你在AWS

PG Strom不会在这里为你工作。您的数据很简单,只有很少的列。让它们进出GPU会让你的速度太慢