[英]How to make a variable available to all of the TaskManagers in Apache Flink?
我需要在程序中設置一個值列表,並在所有任務管理器中訪問它們。 目前,我在主類中聲明了一個公共字段並設置了值。 稍后在我的程序中,它將在遠程集群中運行,我希望能夠在所有任務管理器中訪問這些變量。 這是我的示例代碼。 但是,似乎存在一個問題:沒有任何編譯或運行時錯誤,任務管理器無法使用這些值。
public class myMainClass {
public static ArrayList<String> mykey = new ArrayList<String>();
public static void main(String[] args) throws Exception {
// assign value to the variable
partitionedData = partitionedData.partitionCustom(new MyPartitioner(myKey), 2);
}
}
public static class MyPartitioner implements Partitioner<String> {
public String [] partitionKeys;
public static ArrayList<String> mykey;
public MyPartitioner(ArrayList<String> mykey) {
this.mykey = mykey;
}
@Override
public int partition(String key, int numPartitions) {
for (int i=0 ; i< numParalell-1 ; i++) {
if(mykey.get(i).compareToIgnoreCase(key) > 0)
return i;
}
return numParalell-1 ;
}
}
我會將mykey
列表作為構造函數參數傳遞給MyPartitioner
類。
您的代碼如下所示:
public class myMainClass {
public static void main(String[] args) throws Exception {
ArrayList<String> mykey = new ArrayList<String>();
// assign value to the vaiable
partitionedData = partitionedData.partitionCustom(new MyPartitioner(mykey), 2);
}
}
public static class MyPartitioner implements Partitioner<String> {
private final ArrayList<String> mykey;
public String [] partitionKeys;
public MyPartitioner(ArrayList<String> mykey) {
this.mykey = mykey;
}
@Override
public int partition(String key, int numPartitions) {
for (int i=0 ; i< numParalell-1 ; i++) {
if(mykey.get(i).compareToIgnoreCase(key) > 0)
return i;
}
return numParalell-1 ;
}
}
我不確定你想要完成什么。 如果要預先計算(不變)值並將其分發給所有任務管理器(我假設您需要在某些運算符中訪問這些值),您可以通過構造函數參數將這些值簡單地提供給UDF或使用Flink的廣播變量: https : //ci.apache.org/projects/flink/flink-docs-release-0.8/programming_guide.html#broadcast-variables
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.