客户端埋点日志进行解析时需要获取地区编码和名称,程序是通过flink分布式缓存将地区编码和名称数据传到每个task节点进行读取。本地测试时没有问题,但是部署到集群数据写入hdfs后发现中文乱码,部分代码如下:
//设置分布式缓存文件地址
StreamExecutionEnvironment bsEnv = StreamExecutionEnvironment.getExecutionEnvironment();
bsEnv.registerCachedFile("path", "stationInfo");
//读取缓存文件数据
File myFile = getRuntimeContext().getDistributedCache().getFile("stationInfo");
List<String> lines = FileUtils.readLines(myFile);
for (String line : lines) {
this.stationMap.put(line.split("\t")[4], line);
}
//最后将数据输出到hdfs
DateTimeBucketAssigner assigner = new DateTimeBucketAssigner<>("'ptdate='yyyy-MM-dd-HH ");
final StreamingFileSink<String> sink = StreamingFileSink
.forRowFormat(new Path(outputPath), new SimpleStringEncoder<String>("UTF-8"))
.withRollingPolicy(
DefaultRollingPolicy.builder()
.withRolloverInterval(TimeUnit.MINUTES.toMillis(15))
.withInactivityInterval(TimeUnit.MINUTES.toMillis(5))
.withMaxPartSize(1024 * 1024 * 1024)
.build()).withBucketAssigner(assigner)
.build();
因为sink已经指定编码为UDF-8所以确定不是sink输出的问题,可能时数据读取的时候就乱码了,最后发现在分布式缓存文件读取的时候没有指定编码格式,代码中种添加utf-8的参数问题解决
//指定读取编码格式为utf-8
File myFile = getRuntimeContext().getDistributedCache().getFile("stationInfo");
List<String> lines = FileUtils.readLines(myFile,"utf-8");
for (String line : lines) {
this.stationMap.put(line.split("\t")[4], line);
}