这听起来可能是个愚蠢的问题。我可能会编写一个MR代码,它可以将输入和输出作为HDFS位置,然后我真的不需要担心hadoop/MR的并行计算能力。(如果我错了,请纠正我)。
然而,如果我的输入不是HDFS位置,那么我将使用MongoDB数据作为输入-mongodb://localhost:27017/mongo_hadoop.messages运行我的映射器和reducers并将数据存储回mongodb,HDFS将如何进入画面。我的意思是,我怎么能确定1GB或任何大小的大文件首先在HDFS上分发,然后在它上进行并行计算?是这个直接URI不会分发数据,而是我需要获取BSON文件,将其加载到HDFS上,然后将HDFS路径作为MR的输入,还是框架足够智能,可以自己完成这项工作?
如果以上问题太愚蠢或毫无意义,我很抱歉。我对大数据真的很陌生,但能深入到这个领域我感到非常兴奋。
谢谢。
您正在描述DBInputFormat
。这是一种从外部数据库读取拆分的输入格式。HDFS只参与设置作业,而不参与实际输入。还有一个CCD_ 2。对于像DBInputFormat
这样的输入,拆分是合乎逻辑的,例如键范围。
有关详细解释,请参阅使用Apache Hadoop进行数据库访问。
对不起,我不确定MongoDb。
如果你只是想知道,如果我们使用的数据源是一个表,那么这是我在MapRed使用HBase时的答案。
我们将使用TableInputFormat在MapRed作业中使用Hbase表。
来自http://hbase.apache.org/book.html#hbase.mapreduce.classpath
7.7.地图任务拆分7.7.1.默认HBase MapReduce拆分器
当TableInputFormat用于在MapReduce作业中获取HBase表时,其拆分器将为表的每个区域生成一个映射任务。因此,如果表中有100个区域,则无论在扫描中选择了多少列族,作业都将有100个映射任务。
7.7.2.自定义分离器
对于那些有兴趣实现自定义拆分器的人,请参阅TableInputFormatBase中的getSplits方法。这就是映射任务分配的逻辑所在。
这是一个好问题,而不是愚蠢的问题。
1.
"mongodb://localhost:27017/mongo_hadoop.messages运行我的映射器和reducers并将数据存储回mongodb,HDFS将如何进入画面。"
在这种情况下,您不必考虑hdfs。你不需要做任何与hdf相关的事情。就像编写一个多线程应用程序,每个线程都将数据写入mongodb。
事实上,hdfs独立于map reduce,map reduces也独立于hdfs。所以,你可以根据自己的意愿单独或一起使用它们。
2.如果您想输入/输出数据库以映射reduce,请考虑DBInputFormat,但这是另一个问题。
现在,hadoop DBInputFormat只支持JDBC。我不确定是否有mongodb版本的DBInputFormat。也许你可以自己搜索或实现它。