最近遇见加载程序写入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中大批量写入数据并进行组装。