星环hive on spark执行速度慢
因为task的启动数量是根据hdfs底层的block数量来定,在 block 数据量偏少的情况下,单个任务运行的时间就少,那么任务开启的开销很可能占据总开销的大量比例。现在因为block文件数量庞大,导致task启动数量巨大,过多的线程将导致排队延时的增加,严重影响sql的执行效率,所以对 block 有效的合并处理有助于促进语句执行的高效性 于是开启automerge开关: set ngmr.partition.automerge=true; 它两种配置合并后Task任务量方法
“ngmr.partition.mergesize = n”,表示将 n 个 block 安排给单个线程处理。 “ngmr.partition.mergesize.mb = m”,表示一个 task 负责处理大小为 m 的数据量(单位 为 MBytes)可以根据需要仅设置这两个参数其中之一,默认使用方法 2 来控制,如果需要使用方法 1,需要将 mergesize.mb 设为-1。
如果已知数据源中小文件过多,最好在向新表导入数据之前就打开automerge 开关,使一个 Task 处理多个 block。因为同属一个 Task 的结果将被返回在同一 个文件中,因此导入数据时做任务的合并处理可达到小文件合并效果。然后关闭automerge 开关,今后都不用再对该表开启。 除了检查 block 的大小,还可以通过在 4040 端口查看任务第一阶段 Tasks 的数量和每Task 的运行时间判断是否需要 automerge。第一阶段的 Task 负责 Map 端任务,默认每个Task 对应一个 block,所以如果第一阶段 Task 过多而且单个执行时间短,表示小体积 block 多,Task 运行效率低,需要启用 automerge