Flint Join优化之Hint(优化器)

Flint Join优化之Hint(优化器)

Flink目前主要有3种join :

  • join :inner join,等值连接

  • outerJoin :外连接,分为left-outer join(左连接)、right-outer join(右连接)、full-outer join(全外连接)

  • cross : 笛卡尔积

Flink提供了优化器“hint”(提示)以告诉join函数优化器选择一些执行策略。

JoinHint

枚举介绍适用场景
OPTIMIZER_CHOOSES将选择权交予Flink优化器 / 默认
BROADCAST_HASH_FIRST广播第一个输入端,同时基于它构建一个哈希表第一个输入端规模较小
BROADCAST_HASH_SECOND广播第二个输入端并基于它构建哈希表第一个输入端规模较小
REPARTITION_HASH_FIRST该策略会导致两个输入端都会被重分区,但会基于第一个输入端构建哈希表第一个输入端数据量小于第二个输入端的数据量,但两个输入段规模都很大,并且没有已存在的分区以及排序顺序可被使用
REPARTITION_HASH_SECOND该策略会导致两个输入端都会被重分区,但会基于第二个输入端构建哈希表第一个输入端数据量大于第二个输入端的数据量,但两个输入段规模都很大,并且没有已存在的分区以及排序顺序可被使用
REPARTITION_SORT_MERGE输入端被以流的形式进行连接并合并成排过序的输入适用于一个或两个输入端都已排过序的情况;

使用方式

ds1.join(ds2, JoinHint.BROADCAST_HASH_FIRST);
ds1.leftOuterJoin(ds2, JoinHint.BROADCAST_HASH_FIRST);
ds1.rightOuterJoin(ds2, JoinHint.BROADCAST_HASH_FIRST);
ds1.fullOuterJoin(ds2, JoinHint.BROADCAST_HASH_FIRST);

另外flink还提供了两个函数来调用 BROADCAST_HASH_FIRSTBROADCAST_HASH_SECOND

joinWithHugejoinWithTiny

public <R> JoinOperatorSets<T, R> joinWithHuge(DataSet<R> other) {
   return new JoinOperatorSets<>(this, other, JoinHint.BROADCAST_HASH_FIRST);
}

public <R> JoinOperatorSets<T, R> joinWithTiny(DataSet<R> other) {
		return new JoinOperatorSets<>(this, other, JoinHint.BROADCAST_HASH_SECOND);
}

由于JoinHint只适用于Json函数,如果使用cross来产生笛卡尔积则需要使用另外的优化器。

CrossHint有3个枚举 :

枚举介绍
OPTIMIZER_CHOOSES将选择权交予Flink优化器
FIRST_IS_SMALL第一个输入端小于第二个输入端;
SECOND_IS_SMALL第二个输入端数据量小于第一个输入端

cross并没有像join一样给用户提供不同的枚举传参来选择不同的优化器,而是把不同的优化器写到不同的方法里面,下面3个方法本质是一样的,都是产生笛卡尔积,只是优化器不一样。

  • cross : OPTIMIZER_CHOOSES

  • crossWithHuge : FIRST_IS_SMALL

  • crossWithTiny : SECOND_IS_SMALL

public <R> CrossOperator.DefaultCross<T, R> cross(DataSet<R> other) {
	return new CrossOperator.DefaultCross<>(this, other, CrossHint.OPTIMIZER_CHOOSES, Utils.getCallLocationName());
}


public <R> CrossOperator.DefaultCross<T, R> crossWithHuge(DataSet<R> other) {
	return new CrossOperator.DefaultCross<>(this, other, CrossHint.FIRST_IS_SMALL, Utils.getCallLocationName());
}


public <R> CrossOperator.DefaultCross<T, R> crossWithTiny(DataSet<R> other) {
	return new CrossOperator.DefaultCross<>(this, other, CrossHint.SECOND_IS_SMALL, Utils.getCallLocationName());
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值