
# Flink性能问题经验总结
#### 数据倾斜
当数据发生倾斜（某一部分数据量特别大），虽然没有GC（Garbage Collection，垃圾回收），但是task执行时间严重不一致。
- 需要重新设计key，以更小粒度的key使得task大小合理化。
- 修改并行度。
- 调用rebalance操作，使数据分区均匀。
 
#### 缓冲区超时设置
- 由于task在执行过程中存在数据通过网络进行交换，数据在不同服务器之间传递的缓冲区超时时间可以通过setBufferTimeout进行设置。
- 当设置"setBufferTimeout(-1)"，会等待缓冲区满之后才会刷新，使其达到最大吞吐量；当设置"setBufferTimeout(0)"时，可以最小化延迟，数据一旦接收到就会刷新；当设置"setBufferTimeout"大于0时，缓冲区会在该时间之后超时，然后进行缓冲区的刷新。
  示例可以参考如下：
  ```
  env.setBufferTimeout(timeoutMillis);
  env.generateSequence(1,10).map(new MyMapper()).setBufferTimeout(timeoutMillis);
  ```
  
 
#### 资源冗余量
Flink任务运行时，建议整个集群的Yarn资源留有一定的余量。比如当前Yarn总体的资源有100Vcore，200GB，则建议Yarn的任务使用90vcore，180GB，保留10%的资源用于当部分节点故障时，任务可以自动重试恢复。
