我的应用程序读取一个大型镶木地板文件,并执行一些数据提取,以获得一个较小的spark数据帧对象。该数据帧的所有内容必须出现在每个执行器节点上,以便进行下一阶段的计算。我知道我可以通过收集广播来做到这一点,就像在这个pyspark片段中一样
sc = pyspark.SparkContext()
sqlc = HiveContext(sc)
# --- register hive tables and generate spark dataframe
spark_df = sqlc.sql('sql statement')
# collect spark dataframe contents into a Pandas dataframe at the driver
global_df = spark_df.toPandas()
# broadcast Pandas dataframe to all the executor nodes
sc.broadcast(global_df)
我只是想知道:有没有更有效的方法可以做到这一点?这种模式似乎会使驱动程序节点成为一个瓶颈。
这取决于您需要对小数据帧做什么。如果您需要将其与大数据帧连接,那么Spark可以自动优化这种连接,广播小数据帧。可以广播的数据帧的最大大小由spark.sql.autoBroadcastJoinThreshold选项配置,如文档中所述http://spark.apache.org/docs/latest/sql-programming-guide.html#other-配置选项