1. 程式人生 > 實用技巧 >Java API 讀取HDFS指定目錄下的所有檔案失敗問題分析

Java API 讀取HDFS指定目錄下的所有檔案失敗問題分析

背景:要讀取hdfs上指定路徑分割槽下的所有檔案內容(5個檔案),並對資料內容進行處理整合成單個檔案

正確遍歷讀取hdfs中指定路徑下的資料檔案樣例程式碼如下:

private List<RIRInfo> getIanaDataFromHdfs(String ianaDataHdfsPath) {
List<RIRInfo> mergeList = new ArrayList<>();
List<RIRInfo> sortList = new ArrayList<>();
if (StringUtils.isNotEmpty(ianaDataHdfsPath)) {
Configuration configuration = new Configuration();
try (FileSystem fileSystem = FileSystem.get(URI.create(ianaDataHdfsPath)
, configuration)) {
FileStatus[] status = fileSystem.listStatus(new Path(ianaDataHdfsPath));
for (FileStatus file : status) {
try (FSDataInputStream fsDataInputStream = fileSystem.open(file.getPath());
BufferedReader br = new BufferedReader(new InputStreamReader(fsDataInputStream))) {
br.lines().forEach(line -> {
if (line.contains(ConfigConstants.VERTICALLINE)) {
String[] value = line.split("\\|");
if (value.length >= ianaConstants.MINI_FIELD_LENGTH
&& ConfigConstants.IPV4TAG.equals(value[ianaConstants.IPV4TAG_INDEX])
&& !"".equals(value[ianaConstants.COUNTRYCODE_INDEX])) {
long startIp = IpUtil.ip2Long(value[ianaConstants.STARTIP_INDEX]);
long endIp = startIp + Long.parseLong(value[ianaConstants.IPRANGE_INDEX]) - 1;
mergeList.add(new RIRInfo(startIp, endIp, value[ianaConstants.COUNTRYCODE_INDEX]));
}
}
});
} catch (IOException e) {
log.error("rirFile read exception.");
}
}
sortList = mergeList.stream().sorted(Comparator.comparing(RIRInfo::getStartIp)).collect(Collectors.toList());
} catch (IOException e) {
log.error("ianaDataHdfsPath load exception.");
}
}
return sortList;
}

沒加紅色部分程式碼,報錯資訊為載入了錯誤的檔案系統 file:///

分析原始碼:
FileSystem.get(configuration)) 和FileSystem.get(URI.create(ianaDataHdfsPath), configuration)) 的區別
前者是沒有指定URI,故讀取了預設的檔案系統;

後者指定URI,讀取了指定的檔案系統

參考內容:

1、Java API 讀取HDFS目錄下的所有檔案

https://blog.csdn.net/yeweiouyang/article/details/38666063

2、Java API 讀取HDFS上單個檔案內容

https://blog.csdn.net/alex_81d/article/details/103633658