python

agxfikkp  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(309)

我有一个现有的python程序,它有一系列类似这样的操作:
连接到mysql数据库并将文件检索到本地fs。
运行对这些文件进行操作的程序x。比如: java -jar X.jar <folder_name> 这将打开文件夹中的每个文件并对它们执行一些操作,并将等量的转换文件写入另一个文件夹。
然后,运行对这些文件进行操作的程序y,如下所示: java -jar Y.jar <folder_name> 这将创建多个文件,每行一个,然后使用合并函数合并成一个文件。
然后,这个合并的文件是一些对这个问题并不重要的进一步操作和分析的输入。
我想使用hadoop来加速操作y,因为如果有:a)更多的文件或b)需要操作的大型输入文件,则需要很长时间才能完成。
我想知道的是,首先使用hadoop做这样的事情是否是个好主意,线程在这种情况下是否更有意义。记住,x和y是不能以任何方式被替换或改变的东西。
我想到了这个主意:
在上面的步骤2之后,在Map器中,将文件复制到hdfs中,然后再次退出,运行jar文件,此时结果将被写回hdfs。我将结果复制回文件系统并将其发送以供进一步处理。
我想知道这是否有意义,特别是考虑到Map程序需要一个(键,值)对,在这种情况下我会有一个k-v对吗?
我知道这听起来像是一个项目,这是因为它是,但我不是在寻找代码,只是一些指导,这是否会工作,如果它做了,什么是正确的方式去做这件事,如果我提出的解决方案是不准确的(足够)。
谢谢您!

emeijp43

emeijp431#

您完全可以使用hadoopmapreduce框架来完成您的工作,但如果这是一个好主意,答案可能是“这取决于”。这取决于要继续处理的文件的数量和大小。
请记住,hdfs并不擅长处理小文件,如果您有大量(比如1000万)的小文件(大小小于1k字节),那么对namenode来说可能是一场灾难。另一方面,如果大小太大,但只需要几个文件就可以继续,直接在Map器中 Package 步骤2并不酷,因为作业不会广泛而均匀地分布(在这种情况下,我猜键值只能是“文件号-文件内容”或“文件名-文件内容”,因为您提到x不能以任何方式更改。实际上,“行号-行号”更合适)
顺便说一句,hadoop mapreduce框架有两种使用方法,一种是用java编写mapper/reducer并在jar中编译,然后用hadoop jar you\u job.jar运行mapreduce作业。另一种方式是流式处理,您可以使用python编写mapper/reducer就是这种方式。

相关问题