Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何提高向Redis写入Spark数据帧的速度?_Python_Apache Spark_Pyspark_Redis_Data Science - Fatal编程技术网

Python 如何提高向Redis写入Spark数据帧的速度?

Python 如何提高向Redis写入Spark数据帧的速度?,python,apache-spark,pyspark,redis,data-science,Python,Apache Spark,Pyspark,Redis,Data Science,我正在开发一个基于Flask的图书推荐API,发现要管理多个请求,我需要预先计算相似性矩阵,并将其存储在某个地方以备将来查询。该矩阵是使用PySpark基于约150万个数据库条目创建的,其中包含图书id、名称和元数据,其结果可以用该模式描述(i和j用于图书索引,dot用于元数据的相似性): 最初,我打算使用spark Redis连接器将其存储在Redis上。但是,以下命令的运行速度似乎非常慢(即使初始图书数据库查询大小限制为非常适度的40k批): Spark将初始任务分为9个阶段,其中3个阶段需

我正在开发一个基于Flask的图书推荐API,发现要管理多个请求,我需要预先计算相似性矩阵,并将其存储在某个地方以备将来查询。该矩阵是使用PySpark基于约150万个数据库条目创建的,其中包含图书id、名称和元数据,其结果可以用该模式描述(
i
j
用于图书索引,
dot
用于元数据的相似性):

最初,我打算使用spark Redis连接器将其存储在Redis上。但是,以下命令的运行速度似乎非常慢(即使初始图书数据库查询大小限制为非常适度的40k批):

Spark将初始任务分为9个阶段,其中3个阶段需要6个小时才能完成。奇怪的是,Spark执行器的存储内存使用率非常低,约为20kb。Spark应用程序UI描述了一个典型的阶段活动阶段:

org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:271)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
py4j.Gateway.invoke(Gateway.java:282)
py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
py4j.commands.CallCommand.execute(CallCommand.java:79)
py4j.GatewayConnection.run(GatewayConnection.java:238)
java.lang.Thread.run(Thread.java:748)
有没有可能以某种方式加快这一进程?我的Spark会话是这样设置的:

SUBMIT_ARGS = "  --driver-memory 2G --executor-memory 2G --executor-cores 4 --packages mysql:mysql-connector-java:5.1.39 pyspark-shell"
os.environ["PYSPARK_SUBMIT_ARGS"] = SUBMIT_ARGS
conf = SparkConf().set("spark.jars", "spark-redis/target/spark-redis_2.11-2.4.3-SNAPSHOT-jar-with-dependencies.jar").set("spark.executor.memory", "4g")
sc = SparkContext('local','example', conf=conf) 
sql_sc = SQLContext(sc)

您可以尝试使用
Append
保存模式,以避免检查表中是否已存在数据:

similarities.write.format("org.apache.spark.sql.redis").option("table", "similarities").mode('append').option("key.column", "i").save()
此外,您可能需要更改

sc = SparkContext('local','example', conf=conf) 

使用机器上的所有内核


顺便问一下,在Redis中使用
i
作为键是否正确?它不应该是由
i
j
组成的吗?

谢谢你,这当然有帮助,如果不是很大的话。然而,将我的全部相似性表写到Redis仍然需要很长时间。关于这个问题,有什么我根本不了解的地方吗?元数据是通过一个管道生成的,该管道使用标记器->计数向量器->IDF来获取描述一本书的所有关键字的频率度量,这些度量对于书籍
i
j
的成对相似性作为
dot
进入相似性表。
similarities.write.format("org.apache.spark.sql.redis").option("table", "similarities").mode('append').option("key.column", "i").save()
sc = SparkContext('local','example', conf=conf) 
sc = SparkContext('local[*]','example', conf=conf)