I think I figured out the problem after looking through the Tachyon code and deciphering some of the log messages.
For those Googling this, I eventually realized that the timeouts were due to heartbeat messages from the WorkerClient (WorkerClientHeartbeatExecutor) were not being sent in a timely fashion. Inside the Hadoop job syslogs, you can find messages like this:
worker-heartbeat-apex82.llnl.gov/192.168.123.82:29998 last execution took 32433 ms. Longer than the mFixedExecutionIntervalMs 1000
In the above case, you can see that even though a heartbeat is supposed to be sent every 1000 ms, this particular one took 32433 ms between heartbeats. This is well past the 10000 ms timeout length.
So, what this means is the thread isn't being scheduled. As an attempt to fix this, I increased the thread priority of the WorkerClientHeartbeatExecutor thread. However, that didn't help the situation.
So it was likely the case that some thread was hogging the CPU and not allowing this thread to run. So what's running?
The logs showed something like this:
2015-03-14 08:38:18,591 INFO [main] : create(tachyon://apex75:19998/terasort-teragen/_temporary/1/_temporary/attempt_1426347380120_0001_m_000002_0/part-m-00002, rw-r--r--, true, 1048576, 1, 33554432, null)
So eventually, after digging into Tachyon code more, I looked into AbstractTFS, and noticed in create()
if (!CommonConf.get().ASYNC_ENABLED) {
TachyonURI path = new TachyonURI(Utils.getPathWithoutScheme(cPath));
if (mTFS.exist(path)) {
if (!mTFS.delete(path, false)) {
throw new IOException("Failed to delete existing data " + cPath);
}
}
int fileId = mTFS.createFile(path, blockSize);
TachyonFile file = mTFS.getFile(fileId);
file.setUFSConf(getConf());
return new FSDataOutputStream(file.getOutStream(UserConf.get().DEFAULT_WRITE_TYPE), null);
}
the AYNC_ENABLED config lead to "getBooleanProperty("tachyon.async.enabled", false)", so we're falling into the if statement.
DEFAULT_WRITE_TYPE lead to "getEnumProperty("tachyon.user.file.writetype.default", WriteType.CACHE_THROUGH);"
well CACHE_THROUGH is ...
/**
* Write the file synchronously to the under fs, and also try to cache it,
*/
CACHE_THROUGH(3),
This sounds like something that could definitely make the thread wait due to blocking IO.
So I changed the default to
/**
* Write the file asynchronously to the under fs (either must cache or must through).
*/
ASYNC_THROUGH(5);
as an initial test and everything worked.
Eventually moved to putting "-Dtachyon.async.enabled=true -D tachyon.user.file.writetype.default=ASYNC_THROUGH" in mapred.child.java.opts, mapred.map.child.java.opts, and mapred.reduce.child.java.opts to get teragen & terasort working.
It took quite some time to get from "Failed to rename" exceptions all they way to tachyon.user.file.writetype.default, so hope this is useful to other people Googling for answers out there.
I'll try to update the Configuration documentation with values, b/c the current one wasn't clear on what options were available other than CACHE_THROUGH.
Al