必须设置 Ignite 实例名称 thread local 或应在 org.apache.ignite.thread.IgniteThread 下访问此方法

Ignite instance name thread local must be set or this method should be accessed under org.apache.ignite.thread.IgniteThread

我正在尝试从 spark map 操作访问 ignite 缓存值

我有完全相同的问题,并尝试了提出相同问题的人建议的一些方法

val cache = ignite.getOrCreateCache[String,String]("newCache")
val cache_value = cache.get("key")
val myTransformedRdd = myRdd.map { x =>println(cache_value)}.take(2)

这是我的示例代码,我了解到,当我们启动ignite(Ignition.start())时,它可能只在spark driver中启动,但spark在executors中执行。所以在一些执行者中,点燃可能不会被启动。

所以我也尝试了这个,

val myTransformedRdd = myRdd.map { x =>
   if(Ignition.state.toString=="STOPPED")
    {
     Ignition.start("/etc/ignite/examples/config/example-ignite1.xml")
     }
println(cache_value)
}

由此我得到了同样的错误。

您的示例中的 ignite 似乎是从映射器函数外部某处的外部范围获取的。请确保您没有尝试通过网络发送此对象。

在您的示例中,您使用从驱动程序上下文中获取的 cache_value。您的映射器函数应该类似于

val myTransformedRdd = rdd.map { _ =>
  val igniteCfg = Ignition.loadSpringBean("/etc/ignite/examples/config/example-ignite1.xml", "ignite.cfg")
  val ignite = Ignition.getOrStart(igniteCfg)
  val cache = ignite.getOrCreateCache[String,String]("newCache")
  val cacheValue = cache.get("key")
  println(cacheValue)
}

注意,example-ignite1.xml 文件应该有一个 ignite.cfg 类型 IgniteConfiguration bean 的定义。