我们有一个约 800 万个文件的数据集,每个文件大约 0.5 到 2 兆。在构建 har 文件后,我们无法对它们进行分析。
这些文件已经在预先存在的目录结构中:
user-|
|-hadoop-|
|-all_the_files--|-PARENT_DIR_1-|-CHILD_DIR_1-|-FILES
| |-CHILD_DIR_2-|-FILES
|
|-PARENT_DIR_2-|-CHILD_DIR_1-|-FILES
将这些移动到 hdfs 并建立一个 har 档案是微不足道的;我使用以下命令制作存档
bin/hadoop archive -archiveName test.har -p /user/hadoop/ all_the_files/*/*/ /user/hadoop/
列出 har 的内容(bin/hadoop fs -lsr har:///user/hadoop/epc_test.har),一切看起来都符合我的预期。
当我们使用此命令运行 hadoop 作业时,尝试使用通配符归档:
bin/hadoop jar My.jar har:///user/hadoop/test.har/all_the_files/*/*/ output
它失败了,但有以下异常
Exception in thread "main" java.lang.IllegalArgumentException: Can not create a Path from an empty string
使用非归档文件运行作业很好,即:
bin/hadoop jar My.jar all_the_files/*/*/ output
然而,这只适用于我们适度的测试文件集。任何大量文件都会很快使名称节点耗尽内存。
您可以将文件 glob 与 har 档案一起使用吗?是否有不同的方法来构建存档以仅包含我错过的文件?