我希望在Flink中的每个节点之间共享HashMap
,并允许节点更新该HashMap。到目前为止我有这个代码:
object ParallelStreams {
val env = StreamExecutionEnvironment.getExecutionEnvironment
//Is there a way to attach a HashMap to this config variable?
val config = new Configuration()
config.setClass("HashMap", Class[CustomGlobal])
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
class CustomGlobal extends ExecutionConfig.GlobalJobParameters {
override def toMap: util.Map[String, String] = {
new HashMap[String, String]()
}
}
class MyCoMap extends RichCoMapFunction[String, String, String] {
var users: HashMap[String, String] = null
//How do I get access the HashMap I attach to the global config here?
override def open(parameters: Configuration): Unit = {
super.open(parameters)
val globalParams = getRuntimeContext.getExecutionConfig.getGlobalJobParameters
val globalConf = globalParams[Configuration]
val hashMap = globalConf.getClass
}
//Other functions to override here
}
}
我想知道您是否可以将自定义对象附加到此处config
创建的val config = new Configuration()
变量中? (请参阅上面代码中的注释)。
我注意到你只能附加原始值。我创建了一个扩展ExecutionConfig.GlobalJobParameters
的自定义类,并通过执行config.setClass("HashMap", Class[CustomGlobal])
附加了该类,但我不确定这是不是你应该怎么做?
答案 0 :(得分:1)
将参数分配给运算符的常用方法是将它们作为函数类中的常规成员变量。在计划构建期间创建和分配的功能对象将被序列化并发送给所有工作人员。因此,您不必通过配置传递参数。
这将如下所示
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavilayout_widthor="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/activity_main"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/et_ONE"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1" />
<Button
android:id="@+id/button_ONE"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:text="Button"
android:layout_weight="1"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="3"/>
</LinearLayout>
</RelativeLayout>
class MyMapper(map: HashMap) extends MapFunction[String, String] {
// class definition
}
val inStream: DataStream[String] = ???
val myHashMap: HashMap = ???
val myMapper: MyMapper = new MyMapper(myHashMap)
val mappedStream: DataStream[String] = inStream.map(myMapper)
对象被序列化(使用Java序列化)并运送执行。因此myMapper
的类型必须实现Java map
接口。
编辑:我错过了您希望地图可以从所有并行任务更新的部分。 Flink无法做到这一点。您必须完全复制地图并全部更新(通过广播)或使用外部系统(键值存储)。