scala insert to redis使任务不可序列化

时间:2018-04-20 10:00:38

标签: scala cassandra redis spark-streaming scala-collections

我有以下代码: -

case class event(imei: String, date: String, gpsdt: String,
             entrygpsdt: String,lastgpsdt: String) 

val result = rdd.map(row => {
val imei = row.getString(0)
val date = row.getString(1)
val gpsdt = row.getString(2)

event(imei, date, gpsdt, lastgpsdt ,"2018-04-06 10:10:10")
}).collect()

 val collection = sc.parallelize(result)
 collection.saveToCassandra("db", "table", SomeColumns("imei", "date", "gpsdt", "lastgpsdt", "dt")

这很好用。所以,现在我将这个结果值插入到cassandra中,但我想将每个rdd的一部分插入到Redis中。当我试图在内部循环中使用redis insert时,它会给出一个错误,即Task不可序列化

我想要这样的事情: -

case class event(imei: String, date: String, gpsdt: String,
         entrygpsdt: String,lastgpsdt: String) 
val result = rdd.map(row => { 
val imei = row.getString(0)
val date = row.getString(1)
val gpsdt = row.getString(2)
val zscore = Calendar.getInstance().getTimeInMillis
val value = row.getString(0) + ',' + row.getString(2)
val key = row.getString(1)
client.zadd(key , zscore, value)
event(imei, date, gpsdt, lastgpsdt ,"2018-04-06 10:10:10")
}).collect()

val collection = sc.parallelize(result)
collection.saveToCassandra("db", "table", SomeColumns("imei", "date", "gpsdt", "lastgpsdt", "dt")

那么,我怎么能这样做,“客户端”是scala redis库的对象。 谢谢,

2 个答案:

答案 0 :(得分:0)

由于没有人提供任何答案。我为我的案子找到了解决方案。不知道这种方法是否好,但它对我有用。因此,想法是通过迭代RDD来收集数据。您将获得Array [event]的结果。所以,现在再次启动结果循环并在Redis中插入每一行。最后在卡桑德拉“结果”。这个流程正在解决我正在寻找的两个目的。 谢谢,

答案 1 :(得分:0)

serializable异常通常是由于创建连接对象引起的。

但是您的代码不包含,我猜您已在client

之外创建了foreachRDD对象

如果是,则驱动程序中的客户端对象为created,而foreach中的executor执行client,无法找到task not serializable.对象并发生异常client < / p>

您可以在foreach内创建connection对象,但这会为每个record创建rdd.foreachPartition(partition => { //Create a connection here for redis partition.foreach(record => { //send the data here }) }) ,这对性能也不利。

所以你可以做的是

  constructor(props) {
      super(props);
      this.state = { disabled: false }
    }

clicky(e) {
  //should dictate the toggle logic
}

render () {
  <div onClick={this.clicky.bind(this)}>
    <button disabled={this.state.disabled}>Item 1</button>
    <button disabled={this.state.disabled}>Item 2</button>
  </div>
}

希望这有帮助!