Apache flink 在ApacheFlink中有没有办法将作业调度到特定的处理器?
我是ApacheFlink的新用户,目前的目标是在异构处理系统上测试调度算法。因此,我将每个作业部署到哪个处理器变得非常重要。但是,我找不到如何指定将作业部署到的处理器ID,也找不到让处理器返回可用性的方法。Apache flink 在ApacheFlink中有没有办法将作业调度到特定的处理器?,apache-flink,job-scheduling,Apache Flink,Job Scheduling,我是ApacheFlink的新用户,目前的目标是在异构处理系统上测试调度算法。因此,我将每个作业部署到哪个处理器变得非常重要。但是,我找不到如何指定将作业部署到的处理器ID,也找不到让处理器返回可用性的方法。 我衷心感谢你的帮助,如果你能给我一些提示,我可以做这些。希望你过得愉快:)我通过一个类似的问题来安排和监控机器特定cpu核心的flink子任务。我使用LinuxJNAAffinity解决我的问题()。也许你可以根据我的解决方案。这是我的一个UDF import java.util.BitS
我衷心感谢你的帮助,如果你能给我一些提示,我可以做这些。希望你过得愉快:)我通过一个类似的问题来安排和监控机器特定cpu核心的flink子任务。我使用
LinuxJNAAffinity
解决我的问题()。也许你可以根据我的解决方案。这是我的一个UDF
import java.util.BitSet;
import java.util.List;
import org.apache.flink.api.common.functions.RichMapFunction;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.configuration.Configuration;
import org.sense.flink.pojo.Point;
import org.sense.flink.pojo.ValenciaItem;
import org.sense.flink.util.CRSCoordinateTransformer;
import org.sense.flink.util.CpuGauge;
import org.sense.flink.util.SimpleGeographicalPolygons;
import net.openhft.affinity.impl.LinuxJNAAffinity;
public class ValenciaItemDistrictMap extends RichMapFunction<ValenciaItem, ValenciaItem> {
private static final long serialVersionUID = 624354384779615610L;
private SimpleGeographicalPolygons sgp;
private transient CpuGauge cpuGauge;
private BitSet affinity;
private boolean pinningPolicy;
public ValenciaItemDistrictMap() {
this(false);
}
public ValenciaItemDistrictMap(boolean pinningPolicy) {
this.pinningPolicy = pinningPolicy;
}
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
this.sgp = new SimpleGeographicalPolygons();
this.cpuGauge = new CpuGauge();
getRuntimeContext().getMetricGroup().gauge("cpu", cpuGauge);
if (this.pinningPolicy) {
// listing the cpu cores available
int nbits = Runtime.getRuntime().availableProcessors();
// pinning operator' thread to a specific cpu core
this.affinity = new BitSet(nbits);
affinity.set(((int) Thread.currentThread().getId() % nbits));
LinuxJNAAffinity.INSTANCE.setAffinity(affinity);
}
}
@Override
public ValenciaItem map(ValenciaItem value) throws Exception {
// updates the CPU core current in use
this.cpuGauge.updateValue(LinuxJNAAffinity.INSTANCE.getCpu());
System.err.println(ValenciaItemDistrictMap.class.getSimpleName() + " thread[" + Thread.currentThread().getId()
+ "] core[" + this.cpuGauge.getValue() + "]");
List<Point> coordinates = value.getCoordinates();
boolean flag = true;
int i = 0;
while (flag) {
Tuple3<Long, Long, String> adminLevel = sgp.getAdminLevel(coordinates.get(i));
if (adminLevel.f0 != null && adminLevel.f1 != null) {
value.setId(adminLevel.f0);
value.setAdminLevel(adminLevel.f1);
value.setDistrict(adminLevel.f2);
flag = false;
} else {
i++;
}
}
if (flag) {
// if we did not find a district with the given coordinate we assume the
// district 16
value.clearCoordinates();
value.addCoordinates(
new Point(724328.279007, 4374887.874634, CRSCoordinateTransformer.DEFAULT_CRS_EPSG_25830));
value.setId(16L);
value.setAdminLevel(9L);
value.setDistrict("Benicalap");
}
return value;
}
}
import java.util.BitSet;
导入java.util.List;
导入org.apache.flink.api.common.functions.RichMapFunction;
导入org.apache.flink.api.java.tuple.Tuple3;
导入org.apache.flink.configuration.configuration;
导入org.sense.flink.pojo.Point;
导入org.sense.flink.pojo.ValenciaItem;
导入org.sense.flink.util.crscordinateTransformer;
导入org.sense.flink.util.CpuGauge;
导入org.sense.flink.util.SimpleGraphicalPolygons;
导入net.openhft.affinity.impl.LinuxJNAAffinity;
公共类ValenciaItemDistrictMap扩展了RichMapFunction{
私有静态最终长serialVersionUID=6243543847696105610L;
私人单纯形多边形sgp;
私有瞬态CpuGauge CpuGauge;
私有位集亲和力;
私有布尔钉扎策略;
公共ValenciaItemDistrictMap(){
这个(假);
}
公共ValenciaItemDistrictMap(布尔固定策略){
this.pinningPolicy=pinningPolicy;
}
@凌驾
公共void open(配置参数)引发异常{
super.open(参数);
this.sgp=新的SimpleGraphicalPolygons();
this.cpuGauge=新的cpuGauge();
getRuntimeContext().getMetricGroup().gauge(“cpu”,cpugage);
如果(本固定策略){
//列出可用的cpu内核
int nbits=Runtime.getRuntime().availableProcessors();
//将操作员线程固定到特定cpu内核
this.affinity=新位集(nbits);
affinity.set(((int)Thread.currentThread().getId()%nbits));
LinuxJNAAffinity.INSTANCE.setAffinity(affinity);
}
}
@凌驾
公共ValenciaItem映射(ValenciaItem值)引发异常{
//更新当前使用的CPU内核
this.cpuGauge.updateValue(LinuxJNAAffinity.INSTANCE.getCpu());
System.err.println(ValenciaItemDistrictMap.class.getSimpleName()+“thread[”+thread.currentThread().getId())
+“]core[“+this.cpuGauge.getValue()+”]”;
列表坐标=value.getCoordinates();
布尔标志=真;
int i=0;
while(旗帜){
Tuple3 adminLevel=sgp.getAdminLevel(coordinates.get(i));
if(adminLevel.f0!=null&&adminLevel.f1!=null){
setId(adminLevel.f0);
value.setAdminLevel(adminLevel.f1);
setDistrict值(管理级别f2);
flag=false;
}否则{
i++;
}
}
国际单项体育联合会(旗){
//如果我们没有找到具有给定坐标的区域,则假定
//第16区
value.clearCoordinates();
value.add坐标(
新点(724328.2790704374887.874634,CRCoordinateTransformer.DEFAULT_CRS_EPSG_25830));
setId值(16L);
值。setAdminLevel(9L);
价值。setDistrict(“Benicalap”);
}
返回值;
}
}
看起来很棒!非常感谢菲利佩的帮助:)很好。请考虑把我的答案,甚至Voto投票给你解决方案。