Apache flink 如何使ApacheFlink中的所有TaskManager都可以使用变量?

Apache flink 如何使ApacheFlink中的所有TaskManager都可以使用变量?,apache-flink,Apache Flink,我需要在我的程序中设置一个值列表,并在所有任务管理器中访问它们。目前,我在主类中声明了一个公共字段并设置了值。稍后在我的程序(将在远程集群中运行)中,我希望能够在所有任务管理器中访问该变量。 这是我的示例代码。然而,似乎存在一个问题:没有任何编译或运行时错误,这些值对任务管理器不可用 公共类myMainClass{ public static ArrayList mykey=new ArrayList(); 公共静态void main(字符串[]args)引发异常{ //为变量赋值 partit

我需要在我的程序中设置一个值列表,并在所有任务管理器中访问它们。目前,我在主类中声明了一个公共字段并设置了值。稍后在我的程序(将在远程集群中运行)中,我希望能够在所有任务管理器中访问该变量。 这是我的示例代码。然而,似乎存在一个问题:没有任何编译或运行时错误,这些值对任务管理器不可用

公共类myMainClass{
public static ArrayList mykey=new ArrayList();
公共静态void main(字符串[]args)引发异常{
//为变量赋值
partitionedData=partitionedData.partitionCustom(新的MyPartitioner(myKey),2);
}
}
公共静态类MyPartitioner实现了分区器{
公共字符串[]分区键;
公共静态数组列表mykey;
公共MyPartitioner(ArrayList mykey){
this.mykey=mykey;
}
@凌驾
公共整数分区(字符串键、整数分区){
对于(int i=0;i0)
返回i;
}
返回Numparallell-1;
}
}

我将把
mykey
列表作为构造函数参数传递给
MyPartitioner

您的代码如下所示:

公共类myMainClass{
公共静态void main(字符串[]args)引发异常{
ArrayList mykey=新的ArrayList();
//将值赋给vaiable
partitionedData=partitionedData.partitionCustom(新的MyPartitioner(mykey),2);
}
}
公共静态类MyPartitioner实现了分区器{
私有最终数组列表mykey;
公共字符串[]分区键;
公共MyPartitioner(ArrayList mykey){
this.mykey=mykey;
}
@凌驾
公共整数分区(字符串键、整数分区){
对于(int i=0;i0)
返回i;
}
返回Numparallell-1;
}
}

我不确定你想要完成什么。如果您想预计算一个(不变的)值并将其分配给所有任务管理器(我假设您需要在某些操作符中访问这些值),您可以通过构造函数参数将这些值简单地分配给您的UDF或使用Flink的广播变量:

正如您所说,我想使用预计算值来进行自定义分区。我已经使用了一个构造函数来传递链接中提到的值,但它似乎没有产生正确的结果。您能将您的代码示例更新到新版本吗?你是按照@rmetzeger建议的方式做的吗?此外,您能否更详细地描述您的期望和实际行为?当您在远程集群中运行代码时会发生什么?你有什么行为?你期望什么样的行为?具体问题是什么?“这些值对任务管理器不可用”是什么意思?“mykey”是一个空列表(正如您提到的,没有错误,我假设它不是“null”)。我希望根据传递到分区器的变量中的值对数据进行分区。如果我在本地集群中运行该程序,效果很好。如果我使用相同的数据集在远程集群上运行它,它不会进行分区,所有数据只传递到一个节点。顺便问一下:在您的代码示例中,您是指
numPartitions
而不是
numparelll
??你能登录myKeys查看它的内容吗?现在,它似乎是一个空列表——如果这是真的,我假设你在Flink中遇到了一个bug……我已经做了同样的事情,但不幸的是,它没有解决我的问题。如果我在本地群集上运行程序,而不是在远程群集上运行程序,则解决方案可以工作。在原始问题中的代码示例中,我看不到在何处使用数据填充列表。是在execute()调用之前吗?是否在运行时更改列表?列表在调用partitioner之前获取值,这正是//为变量赋值的行。之后,一个打印命令将显示所需的值。您可以在关闭清理器禁用的情况下重试吗
env.getConfig().disableClosureCleaner()
这解决了问题吗(我想知道,因为您已将我的答案标记为正确答案)?我认为问题在于
MyPartitioner
中的
mykey
字段声明为
static
。这将不会被序列化,因此,我希望数据在集群上不可用。顺便说一下,这同样适用于使用主类的静态字段。此数据在群集上也将不可用。您是对的,问题是,谢谢!这是我失败的工作,你能帮我一把吗?