我无法将二进制文件(在hadoop中存储为序列文件)复制到本地计算机。问题是,我从hdfs下载的二进制文件不是我运行map reduce任务时生成的原始二进制文件。我在google上搜索了类似的问题,我想问题是当我把序列文件复制到本地机器上时,我得到了序列文件的头加上原始文件。
我的问题是:有没有办法避免下载头文件,但仍然保留我原来的二进制文件?
我可以考虑两种方法:
我可以将二进制文件转换成其他格式,比如文本,这样就可以避免使用sequencefile。在我复制本地文件之后,我把它转换回二进制文件。
我仍然使用序列文件。但是当我生成二进制文件时,我也会生成一些关于相应序列文件的元信息(例如头的长度和文件的原始长度)。在我完成copytolocal之后,我使用下载的二进制文件(包含头文件等)以及元信息来恢复我原来的二进制文件。
我不知道哪一个可行。有人能给我一个解决办法吗?你能给我看一下你给出的解决方案的一些示例代码吗?
我非常感谢你的帮助。
2条答案
按热度按时间blmhpbnm1#
我找到了解决这个问题的方法。因为下载序列文件会给你在二进制文件中的头和其他魔术字,我避免这个问题的方法是将我的原始二进制文件转换成base64字符串,并将其作为文本存储在hdfs中,当下载编码的二进制文件时,我将其解码回我的原始二进制文件。
我知道这将需要额外的时间,但目前我没有找到任何其他解决这个问题的办法。直接删除序列文件中的头和其他魔术字的困难之处在于hadoop可能会在我的二进制文件之间插入一些单词“sync”。
如果有人对这个问题有更好的解决办法,我很高兴听到这个消息
hyrbngr72#
使用mapreduce代码读取sequencefile,并使用sequencefileinputformat作为inputfileformat读取hdfs中的序列文件。这会将文件拆分为键值对,并且该值只包含可用于创建二进制文件的二进制文件内容。
下面是一个代码片段,用于拆分由多个图像组成的序列文件,并将其拆分为单独的二进制文件,然后将其写入本地文件系统。