Hadoop源码学习系列—— HAR归档Job设计要点
hadoop版本:CDH3u2
?
? hadoop 中生成har文件是通过mapred job实现的,这个主要的class是“HadoopArchives.java”,它是tools包里面的一个类。这个类有800多行code,包含map reduce 自定义的inputformat和其它辅助方法,细读起来还需要花点时间。
?
红色为文件夹):?
/user/heipark/fc/
? ? - 0000
? ? - 1111
? ? - 2222
? ? - 3333
? ? - 4444
? ? + sub1
? ? ? ? - 5555
? ? ? ? + dir1
? ? - 7777
? ? ? ? ? ? - 8888
? ? + sub2
? ? ? ? - 6666
?
?
运行命令过程中生成如下文件:"/user/hdfs/.staging/har_93ftj7/_har_src_files"
?
har_93ftj7:har为固定前缀,后面为随机字符串
_har_src_files:固定文件名,它是输入文件的meta文件,算法采用广度优先,内容如下(为了便于阅读,版式上略做调整):
?
new FileSplit(src, startPos, size, (String[]) null)? ? src:"_har_src_files"文件
? ??startPos:一个split开始行的的bytes,这个偏移是_har_src_files文件的bytes偏移
? ? size:一个split,在_har_src_files文件bytes偏移大小,可以这样理解:startPos + size = endPos
?
4. 关于Input Path?
? 因为map task不直接读取input file,而是通过"_har_src_files"读取自己处理的FileSplit中文件,所以map task真正的输入路径是"_har_src_files"所在目录。
?
FileInputFormat.addInputPath(conf, jobDirectory);? ? jobDirectory:conf中的“har.job.dir”,就是"_har_src_files"所在文件夹。
?
?
5. 关于Map Task? Map Task的输入是"_har_src_files"文件中属于当前map处理的行。
? map输出的key是当前文件或者文件夹名称的hash值,value是文件或者文件夹的meta信息。
?
? 如果当前行是"dir",处理逻辑如下:
?
?
# "_har_src_files"中一个dir行?"/": 目前处理的路径
? "dir none 0 0":表示文件类型是dir
? "0000?1111 2222 3333 4444 sub1 sub2":表示"/"路径下包含的文件和路径
?
?
? 如果当前行为"file",处理逻辑如下:
?
?
? ? "/0000":当前处理文件
? ? "file":当前处理的是一个文件
? ? "part-1":文件"0000"输出文件名
? ? "0":文件"0000"在"part-1"中起始偏移bytes
? ? "1066026506":问"0000"文件大小
?
6. 关于reduce? ? reduce的工作就是生成"_masterindex"、"_index"两个索引文件。
? ? 先说"_index"文件,它直接汇总并输出map端output的value值,如下:
?
?"_index"文件:/ dir none 0 0 0000 1111 2222 3333 4444 sub1 sub2? ? 再说“_masterindex” ,它是"_index"文件的索引文件。每一行索引一批文件(每批1000个,不足1000个算也算一批)它的第一行为“1”,这个值是version信息,这也许HarFileSystem开发人员打算支持对har文件的更新留下的功能。
? ? reduce的输入value是经过排序的,又因为key为value中path部分的hash,所以reduce的key值是追加变大的。
?
? ? ? 本例"_masterindex":
#文件version?? ? ?startIndex:第一个文件startIndex(即文件path的hash)。默认值为0,处理玩一批文件后,会把endIndex赋值给startIndex。
? ? ?endIndex?:最后一个文件的endIndex?(即文件path的hash值)
? ? ?startPos?:本批文件在"_index"文件中bytes偏移值
? ? ?indexStream.getPos():本批文件在"_index"中结束bytes值
?
?
-- heipark
?
?
?
?