Flink官方提供了 StreamingFileSink 用来写行或者列式数据到 hdfs,官方提供了 Row-encoded 和 Bulk-encoded 的例子,并分别以 String 类型和 parquet 类型提供了示例。
https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/connectors/streamfile_sink.html
但是如何只以 Gzip 格式将字符串写入 hdfs 呢?
下面的链接提供了对 Object 进行 Gzip 压缩写入hdfs的实现:
https://stackoverflow.com/questions/56474706/how-to-do-failure-tolerance-for-flink-to-sink-data-to-hdfs-as-gzip-compression
但是写入的文件用 zcat 读取时,会有部分乱码,这是因为ObjectOutputStream.writeObject()方法会先写入类信息,所以读取文件时也需要通过ObjectOutputStream类来读,才不会出现乱码,zcat应该是直接使用的 GZIPOutputStream 吧。
如何才能使用 zcat 读又不会出现乱码呢?我对上面的代码进行了一些修改:
使用 GZIPOutputStream.write 直接写入 String
public class GzipStringBulkWriter<T> implements BulkWriter<T> {
private final GZIPOutputStream gzipOutputStream;
//private final ObjectOutputStream objectOutputStream;
public GzipStringBulkWriter(GZIPOutputStream gzipOutputStream) {
//this.objectOutputStream = objectOutputStream;
this.gzipOutputStream = gzipOutputStream;
}
@Override
public void addElement(T t) throws IOException {
//objectOutputStream.writeUTF(String.valueOf(t));
// write String only
gzipOutputStrea