Presplit as well as BulkLoad uses HalyardBulkLoad.RioFileInputFormat (slightly modified CombineFileInputFormat) here from line 214:
https://github.com/Merck/Halyard/blob/master/tools/src/main/java/com/msd/gin/halyard/tools/HalyardBulkLoad.javaOriginally the splits calculation is driven by mapreduce.input.fileinputformat.split.maxsize property, which is set to 200.000.000 in Halyard defaults.
FYI: RioFileInputFormat creates additional "cloned" splits for for files > 10xmapreduce.input.fileinputformat.split.maxsize
Such "cloned" splits for very big files are processed in parallel, however parser decimates (de-duplicates) the parsed statements. This approach spread load across cluster for very large files and speeds their bulk load for the price of the cluster resources.
So if you plan to decrease the value of mapreduce.input.fileinputformat.split.maxsize, be aware of the files 10x bigger to cost you extra mappers.
BTW: If I can add one more hint - disable CPU isolation (cgroups) in YARN in your cluster (if enabled). By disabling that single "ani-feature" you will see huge increase of performance in all MapReduce shuffles, in Halyard Bulk Update and Export tools (which are heavily multi-threaded), in Halyard RIOFileInputFormat parsing (which uses extra thread-pump), and in many other tasks based on YARN.