Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flink ApacheFlink-为输入分配唯一id_Apache Flink - Fatal编程技术网

Apache flink ApacheFlink-为输入分配唯一id

Apache flink ApacheFlink-为输入分配唯一id,apache-flink,Apache Flink,我正在加载一个CSV文件,并使用自定义映射函数将每一行转换为POJO。对于我的程序逻辑,我需要为每个POJO提供一个从0到n(其中n是总行号)的唯一id。我的问题是,我是否可以使用转换函数为每个POJO分配唯一的id(例如初始行号)?理想的方法是在UDF中获得一个Iterable,并在迭代输入元组时增加一个变量,最后输出相应的POJO。我的代码当前如下所示: DataSet<MyType> input = env.readCsvFile("/path/file.csv") .in

我正在加载一个CSV文件,并使用自定义映射函数将每一行转换为POJO。对于我的程序逻辑,我需要为每个POJO提供一个从0到n(其中n是总行号)的唯一id。我的问题是,我是否可以使用转换函数为每个POJO分配唯一的id(例如初始行号)?理想的方法是在UDF中获得一个Iterable,并在迭代输入元组时增加一个变量,最后输出相应的POJO。我的代码当前如下所示:

DataSet<MyType> input = env.readCsvFile("/path/file.csv")
  .includeFields("1111")
  .types(String.class, Double.class, Double.class,Double.class)
  .map(new ParseData());
数据集输入=env.readCsvFile(“/path/file.csv”) .includefelds(“1111”) .types(String.class、Double.class、Double.class、Double.class) .map(新的ParseData()); 其中,ParseData将元组转换为MyType POJO


有没有实现此任务的最佳实践?

棘手的部分是,您在分布式系统中运行代码,因此,
ParseData
函数的并行实例彼此独立运行

您仍然可以使用
ParseData
中的本地ID计数器分配唯一ID。避免重复的诀窍是正确的初始化和计数器递增。假设并行度为4,则会得到4个
ParseData
实例(我们称它们为
PD1…PD4
)。您将执行以下ID分配:

PD1: 0, 4, 8, 12, ...
PD2: 1, 5, 9, 13, ...
PD3, 2, 6, 10, 14, ...
PD4: 3, 7, 11, 15, ...
您可以通过使用不同的值初始化并行实例(详细信息如下)并通过并行性(即,
ID+=parallelism
)增加每个实例中的计数来实现这一点

在Flink中,并行函数的所有实例都会自动分配一个唯一的编号(所谓的任务索引)。您可以使用此号码初始化您的ID计数器。您可以通过
RuntimeContext.getIndexOfthissSubTask()
获取任务索引。您还可以通过
RuntimeContext.getNumberOfParallelSubtasks()接收运算符/函数并行性

要获取
RuntimeContext
请使用
richmappfunction
实现
ParseData
并在
open()
中调用
getRuntimeContext()

类似这样的内容(仅显示相关方法):

类ParseDate扩展了RichMapFunction{
私有长并行;
私人长途电话柜台;
公共无效打开(配置参数){
RuntimeContext ctx=getRuntimeContext();
parallelism=ctx.getNumberOfParallelSubtasks();
idCounter=ctx.getIndexOfThisSubtask();
}
公共OutputDataType映射(InputDataType值){
OutputDataType输出=新的OutputDataType();
output.setID(idCounter);
idCounter+=并行性;
//深加工
返回输出;
}
}

谢谢,这对我很有帮助。我必须添加
公共void open(配置参数)
,它才能工作。但是,通过这种方式,最后一个ID不是连续的(在每次运行期间,它们的分配都不同),但我想这与分配给每个实例的元素数量有关。修复了我回答中的open方法——感谢您指出。是的,如果数据分布不均匀,您可能无法获得连续的ID,这将非常困难,因为您需要一个共享的全局状态(这可能会严重影响您的性能)。我在你的问题中忽略了这个细节。如果工作崩溃了会发生什么?计数器不会被重新初始化吗?