【问题标题】:apache spark running task on each rddapache spark 在每个 rdd 上运行任务
【发布时间】:2015-07-14 09:29:00
【问题描述】:

我有一个 rdd,它分布在 spark 环境中的多台机器上。我想在这个 rdd 上的每台工作机器上执行一个函数。 我不想收集 rdd 然后在驱动程序上执行一个函数。该函数应该在每个执行器上为自己的 rdd 单独执行。 我该怎么做呢

更新(添加代码) 我在 spark shell 中运行所有这些

import org.apache.spark.sql.cassandra.CassandraSQLContext
import java.util.Properties

 val cc = new CassandraSQLContext(sc)
 val rdd  = cc.sql("select * from sams.events where appname = 'test'");
 val df = rdd.select("appname", "assetname");

这里我有一个 400 行的 df。我需要将此 df 保存到 sql server 表中。当我尝试使用 df.write 方法时,它给了我错误,我在单独的线程中发布了这些错误 spark dataframe not appending to the table

我可以打开 driverManager 连接并插入行,但这将在 spark 的驱动程序模块中完成

import java.sql._
import com.microsoft.sqlserver.jdbc.SQLServerDriver
// create a Statement from the connection
Statement statement = conn.createStatement();

// insert the data
statement.executeUpdate("INSERT INTO Customers " + "VALUES (1001, 'Simpson', 'Mr.', 'Springfield', 2001)");
String connectionUrl = "jdbc:sqlserver://localhost:1433;" +
   "databaseName=AdventureWorks;user=MyUserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);

我需要在 executor 机器上写这个。我怎样才能做到这一点?

【问题讨论】:

  • 这是一个正常的 Spark 操作。你会发布你正在处理的代码吗?您可能只需要一些好的方向指导。
  • 我有包含 sql 行集合的数据框。现在我从 cassandracql 得到这个数据框。我处理这个数据帧,需要把这个数据帧写入 sql server。我无法使用dataframewriter的jdbc方法,所以我使用insert into语句。
  • 看了spark的相关资料后,我了解到代码一般运行在驱动程序中,一些需要执行的操作在执行程序上执行。
  • 您能否将代码添加到问题中以使其清楚?

标签: apache-spark rdd


【解决方案1】:

为了建立从worker到其他系统的连接,我们应该使用rdd.foreachPartitions(iter => ...)

foreachPartitions 允许您对每个分区执行操作,让您可以作为本地迭代器访问分区的数据。 每个分区有足够的数据,设置资源(如数据库连接)的时间通过在整个分区上使用这些资源来分摊。

抽象例如。

rdd.foreachPartition(iter => 
   //setup db connection
   val dbconn = Driver.connect(ip, port)
   iter.foreach{element => 
       val query = makeQuery(element)
       dbconn.execute(query)
   }
   dbconn.close
}

还可以创建单例资源管理器,为集群的每个 JVM 管理这些资源。有关此类本地资源管理器的完整示例,另请参阅此答案:spark-streaming and connection pool implementation

【讨论】:

  • 非常感谢 maasg。我有来自 Cassandra 连接器的数据,这些数据填充在数据框中。我处理它,现在我需要把它写成一个 sqlserver。为此,我创建了一个单独的数据框。您知道如何将一个数据帧复制到另一个数据帧,然后将其写入 sqlserver 吗?
猜你喜欢
  • 2018-04-08
  • 2017-02-10
  • 2014-05-13
  • 2015-06-15
  • 2020-11-19
  • 1970-01-01
  • 2017-03-11
  • 2015-05-23
  • 1970-01-01
相关资源
最近更新 更多