知识点
相关文章
更多最近更新
更多Hadoop对Map执行框架的实现(客户端)
2019-03-28 14:01|来源: 网络
在这篇:Hadoop中Map任务的执行框架中(见 http://www.linuxidc.com/Linux/2012-01/50853.htm ),我花了大力气把Map任务在TaskTracker节点上的具体执行过程抽象出了框架,这个框架主要涉及到这些组件:map任务执行器Mapper、map任务执行上下文环境Context、任务报告器TaskReporter,而实际上,Context由两个子组件构成:记录读取器RecordReader、记录写入器RecordWriter。所以我将在接下来一系列文章将主要围绕这三大组件来详细阐述Hadoop是如何具体的来Map任务的执行框架,即Map任务的执行过程。这个过程的实现即涉及到客户端对这些操作是如何实现的,有涉及到TaskTracker端是如何这些操作进行有序调度的,而本文则主要纠结于客户端的配置细节。
对于任意一个Map任务的执行,它都首先需要用户在提交作业的时候对Map操作进行相应的设置,这些配置包括:map操作的输入数据来源、如何读取这些数据并组织成map操作的输入记录、map操作、如何对map的输出进行合并、reduce的工作数量等。当然,这些配置信息可以通过Job来配置,也可以通过当前MapReduce的配置文件mapred-site.xml来配置下面就来看看与之相关的类吧!
先要必须说明的是我只在Job中列举了与map操作设置相关的方法,现在来分别介绍这些配置的作用:
1.setNumReduceTasks()
它用来设置作业在reduce阶段被分为几个reduce任务来完成,这个值决定了每一个map任务最后的输出结果被分为多少个部分,而每一个部分将交由不同的ruduce来处理。对应配置文件mapred-site.xml中的mapred.reduces.tasks项。
2.setInputFormatClass()
它用来设置如何读取map的输入数据,它包含两个方法,一个是getSplits(),另一个createRecordRader(),其中getSplits方法用来对map任务的输入数据进行切分,每一个输入数据切片都将对应一个map任务,也就是说它决定了这个作业将被分成几个map任务来完成;createRecordRader方法用来构造一个RecordReader,这个RecordReader就是上面提到的Map任务执行框架中的记录读取器——读取一个输入数据切片,并把这些数据构造成若干个key-value。对于map任务的输入数据进行切分这个操作一定是在客户端完成,并且在客户端提交作业之前(这一点的详细介绍我在前面的博文中已经详细的提高过了)。对应配置文件mapred-site.xml中的mapreduce.inputformat.class项。
3.setMapperClass()
map任务的实际操作类,它在run()方法中不断地从Contex中的RecordReader处读取一个key-value,然后对这个key-value对进行用户自定义的处理,处理结果会是一个新的key-value,然后再将这个新的key-value保存到Contex中的RecordWriter中,一直重复这个操作,直到Contex的RecordReader中再也没有key-value。对应配置文件mapred-site.xml中的mapreduce.map.class项。
4.setCombineClass()
它被用来设置对map的输出结果如何进行合并,其实map操作的输出也是key-value,这个合并操作一般是在Contex的RecordWriter中完成。从这个方法我们可以看出,合并类需要继承Reducer,它实际上可以看作是reduce操作的一个预处理,在map阶段进行数据的合并主要有两个目的:一是合并map操作的输出可以减少存储空间,同时也减轻了后面reduce的工作量;而是在map操作合并时,它的key-value数据都在内存中,这样做要比交给后来的reduce任务做要方便、快速的多。对应配置文件mapred-site.xml中的mapreduce.combine.class项。
5.setPartitionerClass()
它被用来设置对map操作结果中的每一个key-value进行划分,即应该把这个key-value交由那个reduce来处理,因此对于它的唯一的一个有效方法getPartition(K,V,int)中的int入参指的就是作业的reduce数量。对应配置文件mapred-site.xml中的mapreduce.partitioner.class项。
6.setMapOutputKeyClass()/ setMapOutputValueClass()
它们被用来指定map任务的结果输出key、value类型,它们应该和合并类的输入key-value类型保持一致。分别对应配置文件mapred-site.xml中的mapred.mapoutput.key.class项和mapred.mapoutput.value.class项。
7.setSortComparatorClass()
它被用来设置如何对map操作结果的key-value集合进行排序,这个排序一般以key为主。这里有一个问题,这个排序是在合并之前进行的呢,还是在合并之后进行的呢,或者在合并前后都进行呢?这个问题,我将在TaskTracker端进行分析。对应配置文件mapred-site.xml中的mapred.output.key.comparator.class项。
相关问答
更多-
hadoop客户端该如何配置[2023-10-18]
hadoop客户端只需要能够访问hadoop master即可(namenode jobtracker)。 -
hadoop client 客户端是什么意思[2024-01-20]
hadoop1.0的大致原理 文件写入: 1、Client将文件切分 2、然后Client与Namenode交互,获取datanode的文件、地址信息 3、然后Client根据这些信息将文件写入到datanode,写到datanode之后,datanode会把自身地址和文件信息反馈给Namenode; -
hive客户端需要hadoop吗[2022-01-10]
需要,Hive需要用到Hadoop的相关配置和jar包。 -
用这个 //depot/location1/main/... //myclient/main/... +//depot/location2/main/... //myclient/main/... plus会执行您正在查找的内容,它会告诉perforce将该软件仓库位置中的文件添加到已定义的工作区位置。 Use this //depot/location1/main/... //myclient/main/... +//depot/location2/main/... //myclient/main/.. ...
-
Hadoop在$HADOOP_HOME/lib/native/查找libsnappy.so 。 所以你可以尝试这样做: 创建一个像/home/user/hadoop/lib/native这样的文件夹结构 将libsnappy.so和libhadoop.so放在此文件夹中。 您可以从群集中复制它。 将$HADOOP_HOME设置$HADOOP_HOME /home/user/hadoop 运行你的应用程序 I finally got this sorted out. As shutty expected, i ...
-
如何从客户端Windows机器访问hadoop集群(unix)(How to access hadoop cluster (unix) from client windows machine)[2023-11-22]
可能它不是最好的解决方案,但我弄清楚了: 1)在linux机器上创建“windows”用户 2)将该用户添加到运行hadoop的用户组 3)hdfs-site.xml为dfs.permissions.supergroup添加prperty到用户组hadoop正在运行 这解决了我的问题。 我并不认为它是最好的,但并不是一个用户管理器。 Probably it is not the best solution but I figure it out: 1) created "windows" user on l ... -
由于Google API请求的异步性质,您始终首先打印“测试”字符串(您在执行$log.info("testing");行后获得响应)。 获得所需结果的一种方法是使用$q服务: // need to inject the $q service $scope.isRegistered = function () { var joe = function () { var deferred = $q.defer(); gapi .client .conference ...
-
pydoop vs hadoopy - hadoop python客户端[关闭](pydoop vs hadoopy - hadoop python client [closed])[2022-07-17]
我认为最全面的文档是http://blog.cloudera.com/blog/2013/01/a-guide-to-python-frameworks-for-hadoop/ 最近,我真的认为mrjob已经成为一个明确的领跑者。 它有一个非常活跃的邮件列表,它似乎相对稳定和最新。 它还与Amazon EMR很好地集成。 The most comprehensive documentation of this I think is http://blog.cloudera.com/blog/2013/01/ ... -
假设您的用户名是hdfs ,请将&user.name=hdfs添加到您的URL。 写操作需要有效用户。 您的Java代码有效,因为它从unix环境中提取您的用户信息。 如果您在任何地方看到用户dr.who ,可能是因为您没有在请求中设置user.name 。 Assuming your user name is hdfs, add &user.name=hdfs to your URL. Write operations require a valid user. Your java code works ...
-
@Praveen:使用映射器来克服每个客户端数据到Hadoop服务器的停机时间,因为客户端数据在这种情况下保存主键。 充分利用每个客户端的分区以及Date分区。 在开始sqoop导入之前,必须为HDFS文件位置实现TDE区域。 * TDE:Trasparent Data Encryption专区,是客户数据安全区域的最佳实践。 @Praveen: Use mappers to overcome the downtime for each clients data to Hadoop servers, as ...