关于Hadoop以及S3的几个坑

首先是关于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以后就不能更改了。


还有就是访问文件系统的问题,这个问题花费了我好几个小时。本地用:

FileSystem.get(conf)

似乎没什么问题,但是一旦上了S3就要专门指定Schema了:

FileSystem.get(new URI("s3://finalapp"),conf)


最后就是本地访问文件系统的时候出现checksum错误,一般是第一轮可以跑,然后后面再跑就是这个问题……这个问题困扰了一天!最后,无意中发现Hadoop在数据文件旁边造了几个隐藏的CRC文件!这些CRC文件就是罪魁祸首,删除掉一切恢复正常……


以上就是我遇到的几个坑,虽然解决方案很简单,但是如果事先不知道的话,会陷在里面很久很久…… TAT


你可能感兴趣的:(机器学习)