首先是关于AWS上用distributive cache files的问题,由于AWS用的是S3文件系统,而文件cache以后是HDFS文件系统,那么当我们直接去取URI的时候就会发生一件诡异的事情:原来的s3://被转换成了s3:/,而且这种转换是不可避免的,不论你手工加slash什么的都没用…… 这个问题卡了我一晚上,搜了好多资料,最后才发现最完美的解决方案:
在cache的时候用别名来标记文件,比如
job.addCacheFile(new URI(path[1] + "/data.txt"+"#data.txt"));
这个#就是别名,然后在读取的时候可以用别名读取:
new File("./data.txt")
然后就是关于cache file重用的问题,比如在不同的MR迭代之间传递数据……据我研究又一个晚上的结果,这是不可能的!因为每次去cache同一个file的时候,上一个file也在cache中(而且没法删除掉),这样就会有两个不同的时间戳,系统就会报错。我试着hack时间戳,但是依然没用……所以估计Hadoop的设计就是cache以后就不能更改了。