每个rdd上的apache spark运行任务

时间:2015-07-14 09:29:00

标签: apache-spark rdd

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

更新(添加代码) 我在火花壳中运行所有这些

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);

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

1 个答案:

答案 0 :(得分:0)

为了设置从工作人员到其他系统的连接,我们应该使用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