我有一个现有的Python程序,它有一系列操作,如下所示:
java -jar X.jar <folder_name>
这将打开文件夹中的每个文件并对它们执行一些操作,并将相同数量的转换文件写入另一个文件夹。java -jar Y.jar <folder_name>
这将创建多个文件,每行一行,然后使用合并功能合并为一个文件。 / LI>
我想使用Hadoop来加速操作Y,因为如果有以下情况需要很长时间才能完成:a)更多文件或b)要操作的大输入文件。
我想知道的是,如果最好首先使用Hadoop来做这种性质的事情,并且在这种情况下线程会更有意义。请记住,X和Y是不能以任何方式替换或更改的内容。
我提出了这个想法:
我想知道这是否有意义,特别是考虑到映射器需要一个(键,值)对,在这种情况下我甚至会有一个k-v对吗?
我知道这听起来像是一个项目,那是因为它是,但我不是在寻找代码,只是关于这是否会起作用的一些指导,如果确实如此,那么正确的做法是什么如果我提出的解决方案不准确(足够)。
谢谢!
答案 0 :(得分:2)
你绝对可以使用hadoop mapreduce框架来完成你的工作,但如果它是一个好主意的答案可能是&#34;它取决于&#34;。这取决于您要继续的文件的数量和大小。
请记住,hdfs在处理小文件方面不是很好,如果你有一个很好的数字(比方说1000万)的小文件(大小小于1k字节),它可能是namenode的灾难。另一方面,如果尺寸太大但只需要几个文件来进行,将步骤#2直接包装在映射器中并不是很酷,因为这项工作不会被广泛均匀地分布(在这种情况我想键值只能是&#34;文件号 - 文件内容&#34;或&#34;文件名 - 文件内容&#34;鉴于你提到X不能以任何方式改变实际上,&#34;行号 - 行&#34;会更加适合)
BTW,有两种方法可以利用hadoop mapreduce框架,一种方法是在java中编写mapper / reducer并在jar中编译它们然后用hadoop jar you_job.jar运行mapreduce job。另一种方式是streaming,你可以用这种方式编写mapper / reducer。