@羲凡——只为了更好的活着
Flink 批处理——多文件写入hdfs(Java)
0.本文解决哪种问题
假如你有5000个门店甚至更多,产品需要你将每个门店的数据都写成一个文件且以门店命名,这意味着你要写5000或更多的文件,如果你直接用flink批处理writeAsText算子
要么报错,要么特别慢,如果报错 Cannot currently handle nodes with more than 64 outputs.
,可以参考 解决方案 。所有 用了hadoop的多文件输出方法,按照key多文件输出到hdfs。客官请看:
1.前提准备
pom.xml文件中要添加依赖(根据自己的flink版本修改哈)
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-hadoop-compatibility_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
2.直接上代码
第一步,新建一个类继承 MultipleTextOutputFormat
package com.yum.cpos.flink.source.hbase;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat;
public class HdfsMultipleTextOutputFormat<K,V> extends MultipleTextOutputFormat<K,V> {
@Override
protected String generateFileNameForKeyValue(K key, V value, String name) {
return String.valueOf(key);
}
@Override
protected K generateActualKey(K key, V value) {
return (K) NullWritable.get();
}
}
第二步,主方法里面实现上面的类,如下
HdfsMultipleTextOutputFormat<String, String> mulFormat = new HdfsMultipleTextOutputFormat<>();
JobConf jobConf = new JobConf();
FileOutputFormat.setOutputPath(jobConf,new Path(hdfsOutputPath));
HadoopOutputFormat<String, String> format = new HadoopOutputFormat<String, String>(mulFormat, jobConf);
dataSet.output(format).name("toHDFS")
====================================================================
@羲凡——只为了更好的活着
若对博客中有任何问题,欢迎留言交流