如何使变量可用于Apache Flink中的所有TaskManagers?

时间:2016-01-04 16:56:04

标签: 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 ;              
  }
}

2 个答案:

答案 0 :(得分:2)

我会将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 ;
    }
}

答案 1 :(得分:1)

我不确定你想要完成什么。如果要预先计算(不变)值并将其分发给所有任务管理器(我假设您需要在某些运算符中访问这些值),您可以通过构造函数参数将这些值简单地提供给UDF或使用Flink的广播变量:https://ci.apache.org/projects/flink/flink-docs-release-0.8/programming_guide.html#broadcast-variables