开发MR程序通常是在本地跑local MapReduce进行测试,等测试完毕后则将mapred-site.xml放入src下打包成jar放在集群上进行测试。MR若需要读取文件作为数据源,则
单纯的读取本地文件内容实现起来十分简单,但读取本地文件内容的代码放在集群上是无法使用的。是否有方法能自动适配本地和集群两种模式下的文件读取?通过查找Hadoop API发现可通过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
/** * 从 hdfs/本地文件 系统上读取文件内容,按行加入set中 * @param conf 集群配置 * @param path hdfs/本地 路径 * @return Set<String> * @throws IOException */ public static Set<String> getResult(Configuration conf, String path) throws IOException { Set<String> set = new HashSet<>(); Path p = new Path(path); FileSystem fs = FileSystem.get(conf); FSDataInputStream fsdis = null; try { if(fs.isFile(p)){ //若路径为文件,则直接读取内容 fsdis = fs.open(p); String str; BufferedReader d = new BufferedReader(new InputStreamReader(fsdis)); while(null != (str = d.readLine())) { //按行读取 set.add(str); } }else { //若路径为文件夹,则读取该文件夹内的所有文件 FileStatus[] list = fs.listStatus(p); for (FileStatus f : list) { if(f.isDir()){ //不再进一步读取文件夹中的数据 continue; } fsdis = fs.open(f.getPath()); String str; BufferedReader d = new BufferedReader(new InputStreamReader(fsdis)); while(null != (str = d.readLine())) { //按行读取 set.add(str); } } } } finally { fsdis.close(); fs.close();//跑MR程序时不要关闭,否则会报错 } return set; } |
如是本地测试,项目中不包含mapred-site.xml文件(或将其中集群的配置信息注掉),则根据传入的conf则读取本地的文件;反之,添加mapred-site.xml文件,则读取Hdfs上的文件。本地测试时,
(转载本站文章请注明作者和出处 程序员的自我修养 – SelfUp.cn ,请勿用于任何商业用途)
分类:Apache Hadoop, Java语言
读取中文乱码:BufferedReader d = new BufferedReader(new InputStreamReader(fsdis));
即使这样,中文仍然乱码:BufferedReader buffData = new BufferedReader(new InputStreamReader(inData, CharsetNames.UTF_8));
请问有解决中文乱码的办法吗?