HAR アーカイブを作成し、このアーカイブからデータを読み取る必要がある MR ジョブを実行する Oozie ワークフローを作成しました。1. アーカイブが作成されます。 2. ジョブが実行されると、マッパーは分散キャッシュ内のアーカイブを認識します。3.??? このアーカイブを読むにはどうすればよいですか? このアーカイブから行ごとにデータを読み取るための API は何ですか (私の har は複数の改行で区切られたテキスト ファイルのバッチです)。注意: DistirubtedCache に保存されている通常のファイル (HAR アーカイブではない) を操作すると、完全に機能します。HAR からデータを読み取ろうとしているときに問題が発生しました。
コード スニペットを次に示します。
InputStream inputStream;
String cachedDatafileName = System.getProperty(DIST_CACHE_FILE_NAME);
LOG.info(String.format("Looking for[%s]=[%s] in DistributedCache",DIST_CACHE_FILE_NAME, cachedDatafileName));
URI[] uris = DistributedCache.getCacheArchives(getContext().getConfiguration());
URI uriToCachedDatafile = null;
for(URI uri : uris){
if(uri.toString().endsWith(cachedDatafileName)){
uriToCachedDatafile = uri;
break;
}
}
if(uriToCachedDatafile == null){
throw new RuntimeConfigurationException(String.format("Looking for[%s]=[%s] in DistributedCache failed. There is no such file",
DIST_CACHE_FILE_NAME, cachedDatafileName));
}
Path pathToFile = new Path(uriToCachedDatafile);
LOG.info(String.format("[%s] has been found. Uri is: [%s]. The path is:[%s]",cachedDatafileName, uriToCachedDatafile, pathToFile));
FileSystem fileSystem = pathToFile.getFileSystem(getContext().getConfiguration());
HarFileSystem harFileSystem = new HarFileSystem(fileSystem);
inputStream = harFileSystem.open(pathToFile); //NULL POINTER EXCEPTION IS HERE!
return inputStream;