[英]Parallel reading from DB and processing in spark python
我使用的 spark python 最多可以访问 3 个内核,并且我对项目有以下要求。
在 Cassandra 中,我不能为非键/分区列设置 where 子句。 因此,我不能直接在“ID”上使用 where 子句。 我必须"select * from table where date = 'date'"
,然后过滤我需要的 ID。
我试过的代码如下:
date_list = ['list of dates']
ID_list = ['list of IDs']
df_x = []
for date in date_list:
sql = f"select date,id,lat,long from *tablename* where " \
f"date='{str(date)} 18:30:00' "
df_tmp = sqlContext.sql(sql)
df_tmp = df_tmp.filter(df_tmp['lat'] > 0)
df2 = df_tmp.toPandas()
df2 = df2[df2['id'].isin(ID_list)]
print(f"date: {date} shape: {df2.shape[0]}")
if not df2.empty:
df_x.append(df2)
df_final = pd.concat(df_x, axis=0)
*continue processing further on this data frame
我在转换为 DF 后过滤 ID 的原因是因为有大约 3000000 个 ID。 我试过了
df_tmp = df_tmp.where(fn.col("device_id").isin(device_id))
但工作就卡住了。因此,我选择了另一种方式。
现在,我的问题是,我将日期从 2019 年到现在。根据我的观察,每个日期需要 45 秒到(查询,纬度> 0,toPandas,过滤器 ID,附加)。 这意味着按照这个速度,2.5 年大约需要 10 小时。
有没有办法并行化这个?
注意:我用 1 个执行程序尝试了 55 个日期,花了 32 分钟,然后用 3 个执行程序执行相同的 55 个日期,花了同样的 32 分钟。 由于这是我第一次使用 spark 并且非常缺乏经验,我不确定为什么会这样。 请帮助我理解这一点。
接下来,我尝试使用python multiprocessing,Thinking,如果我可以并行执行2或3个查询,那么时间会减少。 我发送了一个日期列表、ID 和 sqlContext 并尝试使用 Pool.map(),但是,我无法这样做,我收到错误“sqlContext 需要在驱动程序范围内而不是在工作范围内”。 我假设这行的原因: df_tmp = sqlContext.sql(sql)
我的火花配置是这样的:
conf = SparkConf()
conf.set("spark.cassandra.connection.host", cassandra_host)
conf.set("spark.cassandra.connection.port", cassandra_port)
conf.set("spark.cassandra.auth.username", username)
conf.set("spark.cassandra.auth.password", password)
conf.set("spark.dynamicAllocation.enabled", "false")
conf.set("spark.cores.max", "1")
conf.set("spark.dynamicAllocation.maxExecutors", "1")
conf.setAppName(AppName)
conf.setMaster(spark_master)
sc = SparkContext(conf=conf)
sqlContext = SQLContext(sc)
table_df = sqlContext.read \
.format("org.apache.spark.sql.cassandra") \
.load(table=table_name, keyspace=keyspace_name)
table_df.createOrReplaceTempView("*tablename*")
这是我尝试使用 1 个执行程序的时候。 但正如我上面提到的,3 个 executors 也花了同样的 32 分钟,就像,3 个 executors 正在运行,但一个接一个地使用,导致总时间相同。
有人可以建议我如何并行化这个吗? 如何加快查询部分?
注意:每个日期的数据大小太大,大约 1000000 行,我不能在内存中存储 2.5 年的数据,因此,我必须分别查询每个日期,过滤所需的 ID,然后存储为 Df
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.