我有一个关于spark的问题。如果我在spark驱动程序上定义了到远程服务器的长期套接字连接,我还可以使用该套接字与spark worker.How上的远程服务器通信。
例如,我在spark driver上定义了一个redis客户端,我也可以通过spakr worker上的redis客户端来读写数据。
val redisClient = Jedis.RedisClient(host, port)
rdd1.map(x => {
val value = redisClient.get(x)
value
})也许redis并不是一个完全正确的例子。我想知道spark是否可以将我的长期套接字连接从司机转移到工人。
发布于 2019-08-04 01:43:07
简而言之,由于套接字连接是不可序列化的,因此无法通过网络进行传输。
根据您实际尝试做的事情,您可能能够传输足以在worker上建立套接字连接的元数据,这将允许每个worker建立任意多个连接,例如,如果您希望允许worker与Redis通信。
发布于 2019-08-04 16:37:31
RedisClient是不可序列化的,因此您的驱动程序无法将其传递给您的执行器。试试这个:
rdd.mapPartitions(partition => {
val redisClient = Jedis.RedisClient(host, port)
partition.map(redisClient.get)
})这样,您就可以在每个Executor上创建自己的客户端。没有serde
希望能有所帮助
https://stackoverflow.com/questions/57335557
复制相似问题