Fortunately, this did turn out to be just a failure on my part to reserve lots of RAM on these smaller nodes for indexing. I set indices.memory.index_buffer_size=2G on each node and restarted them; the next time they were able to complete the indexing of all 4.6 million documents without any pauses or timeouts.