0 database hadoop hive bigdata
我正在学习班上的大数据,现在我们正在学习HIVE.我们今天了解了地图绘制器和减速器,但老实说它已经超越了我的脑海.有人可以向我解释映射器和减速器在每一步中的作用吗?或者至少指出一些好的读数?提前致谢

让我们尝试从上面从互联网上下载的图表中理解map-reduce流程.
我们将讨论hadoop中的字数统计问题,它也被称为Hadoop中的hello world.
字数是一个程序,我们从文件中找到每个单词的出现.
让我们试着去理解
第1步):
输入文件:我们需要一些数据,我们将运行word count program,在集群上运行这个程序,第一步应该把这个文件放在hadoop上,这可以通过各种方式完成,最简单的方法是使用hadoop shell命令:可以使用put或copyFromLocal:
第2步)
Map以键值对的形式减少通话,这意味着mapper将以键和值对的形式输入,它们将执行所需的处理,然后它们将以键值对的形式产生中间结果,这将被输入reducer进一步研究,最后reducer也会将它们的输出写入键值对.
但是我们知道映射器在主驱动程序之后执行,所以谁以键值对的形式向映射器提供输入,输入格式为你做这件事.
InputFormat是做两件大事的类:
1)输入拆分(由此输入拆分驱动的映射器实例数或映射器数由输入拆分驱动,默认情况下,如果按默认配置运行,则一个拆分大小相当于一个块,但您可以更改拆分根据您的需要大小.
因此,如果您正在玩,假设512 MB的数据,并且您的块大小为64 MB,那么将使用大约8个输入分割大小,将运行8个映射器实例或将使用8个映射器)
2)打破键值对中的数据(记录阅读器是在后端执行此操作的类)
现在,映射器的关键和价值将由您使用的文件输入格式驱动,例如TextInputFormat,它是最常用的输入格式.它将longWritable(等效于long)作为键发送,将Text(字符串)作为值发送给mapper
你的mapper类可以在1个分割中工作,在类中你有一个map函数,它一次只能在一行上工作,所以我们可以从上面的图中看到单行会转到map函数
例如它发送:"Apple orange Mango"来映射功能
3)Mapper
在mapper中,我们将line作为输入,所以现在我们需要编写逻辑.
我们将这一行分成基于分隔的单词,所以现在我们在一行中有单个单词因为我们知道地图适用于键值对.我们可以把这项工作作为关键和价值1
为什么我们把关键词当作关键而不是反过来,因为下一阶段是
混洗和排序阶段:在此阶段框架将使组基于相似的键,或者所有不同的键将在混洗阶段聚集在一起,并且它们将基于键进行排序.
现在让我们再次修改 :
最初我们有一个文件根据输入拆分发送到不同的不同映射器,然后在map函数中的mapper类中我们得到一行作为输入,因此构建了我们相对于一行的逻辑,所有行都将在类似的工作一个实例的方式,最后所有实例都可以像这样并行工作.
现在让我们说你有10个映射器在运行,现在在map中减少你的reducer数量总是小于mapper.
因此,如果我们使用了10个映射器,那么很可能会使用2-3个降低器.
在洗牌和分拣阶段,我们已经看到所有相似的键将组合在一起.
首先,在哪个基础上决定哪个映射器数据将转到哪个reducer.在外壳情况下,10个映射器数据必须分成2个减速器,因此它将根据它来决定.
有一个名为Partitioner的组件,它将根据散列分区决定哪个映射器输出将转到哪个reducer,并在其上使用模运算符.
因此,如果我们使用散列,那么这是100%确保所有相同的键将转到相同的reducer.
我们不必为任何事情而烦恼,因为框架已被设计为有效地进行,但是因为它是用java编写的,所以我们可以根据需要灵活地使用不同的组件,如自定义键,自定义分区器,自定义比较器等.
4) Reducer:现在reducer将在其输入中得到键及其值列表
苹果,<1,1,1,1)>
现在在reducer中我们编写逻辑我们想要做什么,对于我们的情况,我们想要进行字数统计,所以我们只需要计算值.
这也是我们最初在Map阶段将1作为值的原因,因为我们只需要计算.
输出:最终输出将由reducer写入hdfs再次在键值对中.