最近遇见加载程序写入hdfs速度缓慢问题。经过长时间的分析后解决,这里写下思路和解决方案。
实时数据写入kafka过慢,导致加载到多个存储组件的sparkstreaming延迟过高。其中hbase10ms,tsdb70ms,hdfs20s。
第一次尝试,分离加载程序,独立写入hdfs单独加载。速度仍然缓慢。
通过日志分析得到,程序的瓶颈在于写的过程,即:
InputStream in = new BufferedInputStream(inputStream);
OutputStream out = fs.append(new Path(appendPath));
IOUtils.copyBytes(in, out, 40960, true);
同时观察到其他程序大量写入hdfs会影响当前程序。并通过监控观察hdfs的io确实很高,
再将要放弃优化的时候,突然想到,基于hdfs的hbase写入很快,经过对比分析,发现hbase每次请求后写入大批量数据。
所以这里将同批次数据写入一条,再进行写操作后,速度提升约28倍。该问题解决。
问题
1,hdfs的io是什么,其中写的请求又是什么原理。
2,如何再sparkstreaming中大批量写入数据并进行组装。