<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>MapReduce on F嘉阳</title><link>https://blog.fjy8018.top/tags/mapreduce/</link><description>Recent content in MapReduce on F嘉阳</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 07 Sep 2023 14:44:47 +0800</lastBuildDate><atom:link href="https://blog.fjy8018.top/tags/mapreduce/index.xml" rel="self" type="application/rss+xml"/><item><title>MapReduce对网站日志进行分析</title><link>https://blog.fjy8018.top/archives/149/</link><pubDate>Fri, 20 Apr 2018 22:58:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/149/</guid><description>&lt;h2 id="代码"&gt;&lt;a href="#%e4%bb%a3%e7%a0%81" class="header-anchor"&gt;&lt;/a&gt;代码&#10;&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/FJiayang/hadoopstudy" target="_blank" rel="noopener"&#10; &gt;GitHub链接&lt;/a&gt;&#10;&lt;a class="link" href="https://github.com/LeeKemp/UserAgentParser" target="_blank" rel="noopener"&#10; &gt;开源工具类UserAgentParser地址&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="日志来源"&gt;&lt;a href="#%e6%97%a5%e5%bf%97%e6%9d%a5%e6%ba%90" class="header-anchor"&gt;&lt;/a&gt;日志来源&#10;&lt;/h2&gt;&lt;p&gt;根据之前的作业提交系统项目的后台获取，为了本地测试，故先从数据库中备份下来并做了适当的处理，仅保留UserAgent的相关信息&#10;&lt;img alt="请输入图片描述" class="gallery-image" data-flex-basis="524px" data-flex-grow="218" height="582" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25OjDr.png" width="1273"&gt;&lt;/p&gt;&#10;&lt;h2 id="本地文件测试"&gt;&lt;a href="#%e6%9c%ac%e5%9c%b0%e6%96%87%e4%bb%b6%e6%b5%8b%e8%af%95" class="header-anchor"&gt;&lt;/a&gt;本地文件测试&#10;&lt;/h2&gt;&lt;p&gt;使用开源工具类解析UserAgent中的信息&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;@Test&#10; public void testReadFile() throws Exception {&#10; String path = &amp;quot;F:\\JAVA Workspace\\hadoopstudy\\access.log&amp;quot;;&#10; BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(path))));&#10;&#10; String line = &amp;quot;&amp;quot;;&#10; int count = 0;&#10;&#10; //模拟MapReduce存储&#10; Map&amp;lt;String, Integer&amp;gt; browerMap = new HashMap&amp;lt;String, Integer&amp;gt;();&#10;&#10; UserAgentParser userAgentParser = new UserAgentParser();&#10;&#10; while (line != null) {&#10; line = reader.readLine();&#10; count++;&#10; if (StringUtils.isNotBlank(line)) {&#10; String source = line;&#10; UserAgent agent = userAgentParser.parse(source);&#10; //测试&#10; String browser = agent.getBrowser();&#10; String engine = agent.getEngine();&#10; String engineVersion = agent.getEngineVersion();&#10; String os = agent.getOs();&#10; String platform = agent.getPlatform();&#10; boolean mobile = agent.isMobile();&#10; Integer browserValue = browerMap.get(browser);&#10; &#10; if (browserValue != null) {&#10; browerMap.put(browser, browerMap.get(browser) + 1);&#10; } else {&#10; browerMap.put(browser, 1);&#10; }&#10;&#10; //输出解析的信息&#10; System.out.println(browser + &amp;quot;,&amp;quot; + engine + &amp;quot;,&amp;quot; + engineVersion + &amp;quot;,&amp;quot; + os + &amp;quot;,&amp;quot; + platform + &amp;quot;,&amp;quot; + mobile);&#10; }&#10;&#10; }&#10; System.out.println(&amp;quot;总记录数：&amp;quot; + count);&#10; System.out.println(&amp;quot;====================================&amp;quot;);&#10; for (Map.Entry&amp;lt;String,Integer&amp;gt;entry :browerMap.entrySet()){&#10; System.out.println(entry.getKey()+&amp;quot;:&amp;quot;+entry.getValue());&#10; }&#10; }&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;执行单元测试&#10;&lt;img alt="请输入图片描述" class="gallery-image" data-flex-basis="416px" data-flex-grow="173" height="548" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25ObQF.png" width="952"&gt;&lt;/p&gt;&#10;&lt;h2 id="使用mapreduce统计"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8mapreduce%e7%bb%9f%e8%ae%a1" class="header-anchor"&gt;&lt;/a&gt;使用MapReduce统计&#10;&lt;/h2&gt;&lt;p&gt;代码以WordCount为原型，结合本地测试的代码编写&#10;&amp;hellip;&#10;boolean mobile = agent.isMobile();&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt; if (mobile){&#10; mobileuser = &amp;quot;手机用户&amp;quot;;&#10; }else {&#10; mobileuser = &amp;quot;非手机用户&amp;quot;;&#10; }&#10;&#10; //通过上下文把map的处理结果输出&#10; context.write(new Text(browser), one);&#10;...&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h3 id="打包运行"&gt;&lt;a href="#%e6%89%93%e5%8c%85%e8%bf%90%e8%a1%8c" class="header-anchor"&gt;&lt;/a&gt;打包运行&#10;&lt;/h3&gt;&lt;p&gt;将工程用&lt;code&gt;mvn assembly:assembly&lt;/code&gt;命令把插件一起打包，上传至虚拟机，同时将log上传至HDFS的根目录&#10;[hadoop@localhost testFile]$ hadoop fs -put access.log /&#10;18/04/11 06:12:14 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform&amp;hellip; using builtin-java classes where applicable&#10;[hadoop@localhost testFile]$ hadoop fs -ls /&#10;18/04/11 06:12:21 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform&amp;hellip; using builtin-java classes where applicable&#10;Found 9 items&#10;-rw-r&amp;ndash;r&amp;ndash; 1 hadoop supergroup 73 2018-04-11 00:30 /PartitionerTest.txt&#10;-rw-r&amp;ndash;r&amp;ndash; 1 hadoop supergroup 26888 2018-04-11 06:12 /access.log&#10;drwxr-xr-x - hadoop supergroup 0 2018-04-08 10:56 /hdfsapi&#10;-rw-r&amp;ndash;r&amp;ndash; 1 hadoop supergroup 60 2018-04-10 23:03 /hello.txt&#10;drwxrwx&amp;mdash; - hadoop supergroup 0 2018-04-11 01:28 /history&#10;drwxr-xr-x - hadoop supergroup 0 2018-04-11 00:35 /output&#10;drwxr-xr-x - hadoop supergroup 0 2018-04-08 10:35 /test&#10;drwx&amp;mdash;&amp;mdash; - hadoop supergroup 0 2018-04-11 01:36 /tmp&#10;drwxr-xr-x - hadoop supergroup 0 2018-04-09 20:11 /user&#10;运行&#10;&lt;img alt="请输入图片描述" class="gallery-image" data-flex-basis="1354px" data-flex-grow="564" height="293" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25OQyM.png" width="1654"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="请输入图片描述" class="gallery-image" data-flex-basis="2360px" data-flex-grow="983" height="174" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25Oamt.png" width="1711"&gt;&lt;/p&gt;&#10;&lt;p&gt;结果与本地测试一致&#10;[hadoop@localhost testFile]$ hadoop fs -ls /logaccess/browserout&#10;18/04/11 06:15:18 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform&amp;hellip; using builtin-java classes where applicable&#10;Found 2 items&#10;-rw-r&amp;ndash;r&amp;ndash; 1 hadoop supergroup 0 2018-04-11 06:14 /logaccess/browserout/_SUCCESS&#10;-rw-r&amp;ndash;r&amp;ndash; 1 hadoop supergroup 32 2018-04-11 06:14 /logaccess/browserout/part-r-00000&#10;[hadoop@localhost testFile]$ hadoop fs -text /logaccess/browserout/part-r-00000&#10;18/04/11 06:15:32 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform&amp;hellip; using builtin-java classes where applicable&#10;Chrome 191&#10;Firefox 10&#10;Unknown 1&#10;增加其他属性重新运行MapReduce，结果如下&#10;[hadoop@localhost testFile]$ hadoop fs -ls /logaccess&#10;18/04/11 06:33:11 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform&amp;hellip; using builtin-java classes where applicable&#10;Found 2 items&#10;-rw-r&amp;ndash;r&amp;ndash; 1 hadoop supergroup 0 2018-04-11 06:32 /logaccess/_SUCCESS&#10;-rw-r&amp;ndash;r&amp;ndash; 1 hadoop supergroup 192 2018-04-11 06:32 /logaccess/part-r-00000&#10;[hadoop@localhost testFile]$ hadoop fs -text /logaccess/part-r-00000&#10;18/04/11 06:33:21 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform&amp;hellip; using builtin-java classes where applicable&#10;20100101 10&#10;537.36 191&#10;604.3.5 1&#10;Android 48&#10;Chrome 191&#10;Firefox 10&#10;Gecko 10&#10;Linux 48&#10;Unknown 1&#10;Webkit 192&#10;Windows 296&#10;Windows 7 10&#10;iPhone 1&#10;iPhone OS 11.1 1&#10;手机用户 49&#10;非手机用户 153&#10;日志离线统计完成！&lt;/p&gt;&#10;</description></item><item><title>单节点MapReduce开发</title><link>https://blog.fjy8018.top/archives/146/</link><pubDate>Tue, 17 Apr 2018 13:03:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/146/</guid><description>&lt;h2 id="官方原理解析"&gt;&lt;a href="#%e5%ae%98%e6%96%b9%e5%8e%9f%e7%90%86%e8%a7%a3%e6%9e%90" class="header-anchor"&gt;&lt;/a&gt;官方原理解析&#10;&lt;/h2&gt;&lt;h3 id="mapreduce演进"&gt;&lt;a href="#mapreduce%e6%bc%94%e8%bf%9b" class="header-anchor"&gt;&lt;/a&gt;MapReduce演进&#10;&lt;/h3&gt;&lt;p&gt;MapReduce2.x的架构&#10;&lt;img alt="官方原理解析" class="gallery-image" data-flex-basis="355px" data-flex-grow="147" height="388" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/2Hnwbt.png" width="574"&gt;&lt;/p&gt;&#10;&lt;p&gt;MapReduce1.x的架构，一旦JobTracker挂了，整个分布式节点就崩溃了，因此被淘汰&#10;&lt;img alt="官方原理解析" class="gallery-image" data-flex-basis="391px" data-flex-grow="163" height="368" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/2Hnt2T.jpg" width="600"&gt;&lt;/p&gt;&#10;&lt;h2 id="开发wordcount"&gt;&lt;a href="#%e5%bc%80%e5%8f%91wordcount" class="header-anchor"&gt;&lt;/a&gt;开发WordCount&#10;&lt;/h2&gt;&lt;h3 id="wordcount原理"&gt;&lt;a href="#wordcount%e5%8e%9f%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;WordCount原理&#10;&lt;/h3&gt;&lt;p&gt;数据输入到MapReduce，每个MapReduce任务都被初始化为一个Job，每个Job又可以分为两种阶段：map阶段和reduce阶段。map方法接收一个&amp;lt;key,value&amp;gt;形式的输入，key表示词组偏移量，value表示该偏移量对应的值，然后同样产生一个&amp;lt;key,value&amp;gt;形式的中间输出，Hadoop函数接收一个如&amp;lt;key,(list of values)&amp;gt;形式的输入，list of values即Java中的集合，用于表示相同偏移量下的字符统计数量，然后对这个value集合进行处理，每个Reduce方法产生0或1个输出，reduce的输出也是&amp;lt;key,value&amp;gt;形式的。&#10;&lt;img alt="官方原理解析" class="gallery-image" data-flex-basis="461px" data-flex-grow="192" height="359" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/2HnZ1M.jpg" width="690"&gt;&lt;/p&gt;&#10;&lt;p&gt;如果文本为&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Hadoop Hello Hadoop &#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;实际过程大概为：&lt;/p&gt;&#10;&lt;p&gt;Mapping：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;&amp;lt;Hadoop ,1&amp;gt;，&amp;lt;Hello,1&amp;gt;，&amp;lt;Hadoop ,1&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;Shuffling：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;&amp;lt;Hadoop ,1&amp;gt;，&amp;lt;Hadoop ,1&amp;gt;&#10;&amp;lt;Hello,1&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;Reducing：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;&amp;lt;Hadoop ,2&amp;gt;&#10;&amp;lt;Hello,1&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;img alt="官方原理解析" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.fjy8018.top/images/recovered/6d3b91eec2ec6159544e.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;多节点下的并行计算原理示意图&#10;&lt;img alt="官方原理解析" class="gallery-image" data-flex-basis="278px" data-flex-grow="115" height="623" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/2HnfEF.png" width="722"&gt;&lt;/p&gt;&#10;&lt;h3 id="开发代码"&gt;&lt;a href="#%e5%bc%80%e5%8f%91%e4%bb%a3%e7%a0%81" class="header-anchor"&gt;&lt;/a&gt;开发代码&#10;&lt;/h3&gt;&lt;h4 id="查看源码"&gt;&lt;a href="#%e6%9f%a5%e7%9c%8b%e6%ba%90%e7%a0%81" class="header-anchor"&gt;&lt;/a&gt;查看源码&#10;&lt;/h4&gt;&lt;p&gt;通过查看Mapper类的源码，发现官方已经定义的run方法，包含了所有基础的Mapper操作（模板方法设计模式），主要操作在map中，因此，只要重写map方法即可。&#10;&lt;img alt="请输入图片描述" class="gallery-image" data-flex-basis="341px" data-flex-grow="142" height="931" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/2HeOsr.png" width="1326"&gt;&lt;/p&gt;&#10;&lt;p&gt;同理Reduce类中也有类似的定义&#10;&lt;img alt="请输入图片描述" class="gallery-image" data-flex-basis="375px" data-flex-grow="156" height="920" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/2HeqIJ.png" width="1438"&gt;&lt;/p&gt;&#10;&lt;h4 id="重写方法"&gt;&lt;a href="#%e9%87%8d%e5%86%99%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;重写方法&#10;&lt;/h4&gt;&lt;p&gt;这里只列举部分代码，其余所有代码可去本人的GitHub中查看：&lt;a class="link" href="https://github.com/FJiayang/hadoopstudy" target="_blank" rel="noopener"&#10; &gt;GitHub链接&lt;/a&gt;&#10;/**&#10;* Map：读取输入文件&#10;* Text:类似字符串&#10;*/&#10;public static class MyMapper extends Mapper&amp;lt;LongWritable, Text, Text, LongWritable&amp;gt; {&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt; LongWritable one = new LongWritable(1);&#10;&#10; /**&#10; * @param key 偏移量&#10; * @param value 每行的字符串&#10; * @param context 上下文&#10; * @throws IOException&#10; * @throws InterruptedException&#10; */&#10; @Override&#10; protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {&#10; /*super.map(key, value, context);*/&#10;&#10; //接收到每一行数据&#10; String line = value.toString();&#10;&#10; //按照指定分隔符进行拆分&#10; /*line.split(&amp;quot;\t&amp;quot;);//以Tab分隔*/&#10; String[] words = line.split(&amp;quot; &amp;quot;);//以空格分隔&#10;&#10; for (String word : words) {&#10; //通过上下文把map的处理结果输出&#10; context.write(new Text(word), one);&#10; }&#10; }&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h3 id="运行"&gt;&lt;a href="#%e8%bf%90%e8%a1%8c" class="header-anchor"&gt;&lt;/a&gt;运行&#10;&lt;/h3&gt;&lt;p&gt;通过宝塔面板上传到服务器，确保此时Hadoop所有服务均为启动状态&#10;&lt;img alt="请输入图片描述" class="gallery-image" data-flex-basis="521px" data-flex-grow="217" height="209" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/2HlUXd.png" width="454"&gt;&lt;/p&gt;&#10;&lt;p&gt;在HDFS中预先创建好要测试的文件，通过绝对路径的方法&lt;code&gt;hadoop fs -ls hdfs://192.168.79.129:8020/&lt;/code&gt;确认文件是可以访问的&#10;&lt;img alt="请输入图片描述" class="gallery-image" data-flex-basis="1067px" data-flex-grow="444" height="210" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/2HlEaD.png" width="934"&gt;&lt;/p&gt;&#10;&lt;p&gt;输入运行命令即可运行&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hadoop jar hadoopstudy-1.0-SNAPSHOT.jar com.fjy.hadoop.mapreduce.WordCountApp hdfs://192.168.79.129:8020/hello.txt hdfs://192.168.79.129:8020/output/wc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动至&lt;code&gt;FileInputFormat&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost testFile&lt;span class="o"&gt;]&lt;/span&gt;$ hadoop jar hadoopstudy-1.0-SNAPSHOT.jar com.fjy.hadoop.mapreduce.WordCountA2.168.79.129:8020/hello.txt hdfs://192.168.79.129:8020/output/wc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/10 09:57:43 WARN util.NativeCodeLoader: Unable to load native-hadoop library &lt;span class="k"&gt;for&lt;/span&gt; your platform... using builtin-java classes where applicable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/10 09:57:44 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/10 09:57:45 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/10 09:57:45 INFO input.**FileInputFormat**: Total input paths to process : &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;执行&lt;code&gt;Job&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/10 09:57:46 INFO mapreduce.JobSubmitter: number of splits:1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/10 09:57:46 INFO mapreduce.JobSubmitter: Submitting tokens &lt;span class="k"&gt;for&lt;/span&gt; job: job_1523322221448_0001&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/10 09:57:47 INFO impl.YarnClientImpl: Submitted application application_1523322221448_0001&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/10 09:57:47 INFO mapreduce.Job: The url to track the job: http://localhost:8088/proxy/application_1523322221448_0001/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/10 09:57:47 INFO mapreduce.Job: Running job: job_1523322221448_0001&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/10 09:57:56 INFO mapreduce.Job: Job job_1523322221448_0001 running in uber mode : &lt;span class="nb"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/10 09:57:56 INFO mapreduce.Job: map 0% reduce 0%&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/10 09:58:04 INFO mapreduce.Job: map 100% reduce 0%&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/10 09:58:10 INFO mapreduce.Job: map 100% reduce 100%&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/10 09:58:12 INFO mapreduce.Job: Job job_1523322221448_0001 completed successfully&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/10 09:58:12 INFO mapreduce.Job: Counters: &lt;span class="m"&gt;49&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File System Counters&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FILE: Number of bytes &lt;span class="nv"&gt;read&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;39&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FILE: Number of bytes &lt;span class="nv"&gt;written&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;222915&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FILE: Number of &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nv"&gt;operations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FILE: Number of large &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nv"&gt;operations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FILE: Number of write &lt;span class="nv"&gt;operations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HDFS: Number of bytes &lt;span class="nv"&gt;read&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;113&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HDFS: Number of bytes &lt;span class="nv"&gt;written&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;17&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HDFS: Number of &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nv"&gt;operations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HDFS: Number of large &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nv"&gt;operations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HDFS: Number of write &lt;span class="nv"&gt;operations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Job Counters&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Map&lt;/code&gt;方法执行&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Launched map &lt;span class="nv"&gt;tasks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Launched reduce &lt;span class="nv"&gt;tasks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Data-local map &lt;span class="nv"&gt;tasks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Total &lt;span class="nb"&gt;time&lt;/span&gt; spent by all maps in occupied slots &lt;span class="o"&gt;(&lt;/span&gt;ms&lt;span class="o"&gt;)=&lt;/span&gt;&lt;span class="m"&gt;5920&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Total &lt;span class="nb"&gt;time&lt;/span&gt; spent by all reduces in occupied slots &lt;span class="o"&gt;(&lt;/span&gt;ms&lt;span class="o"&gt;)=&lt;/span&gt;&lt;span class="m"&gt;3321&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Total &lt;span class="nb"&gt;time&lt;/span&gt; spent by all map tasks &lt;span class="o"&gt;(&lt;/span&gt;ms&lt;span class="o"&gt;)=&lt;/span&gt;&lt;span class="m"&gt;5920&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Total &lt;span class="nb"&gt;time&lt;/span&gt; spent by all reduce tasks &lt;span class="o"&gt;(&lt;/span&gt;ms&lt;span class="o"&gt;)=&lt;/span&gt;&lt;span class="m"&gt;3321&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Total vcore-seconds taken by all map &lt;span class="nv"&gt;tasks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5920&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Total vcore-seconds taken by all reduce &lt;span class="nv"&gt;tasks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3321&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Total megabyte-seconds taken by all map &lt;span class="nv"&gt;tasks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;6062080&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Total megabyte-seconds taken by all reduce &lt;span class="nv"&gt;tasks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3400704&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Map-Reduce Framework&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Map input &lt;span class="nv"&gt;records&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Map output &lt;span class="nv"&gt;records&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Map output &lt;span class="nv"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;29&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Map output materialized &lt;span class="nv"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;39&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Reduce &lt;/code&gt;方法执行&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Input split &lt;span class="nv"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;101&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Combine input &lt;span class="nv"&gt;records&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Combine output &lt;span class="nv"&gt;records&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Reduce input &lt;span class="nv"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Reduce shuffle &lt;span class="nv"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;39&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Reduce input &lt;span class="nv"&gt;records&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Reduce output &lt;span class="nv"&gt;records&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Spilled &lt;span class="nv"&gt;Records&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Shuffled &lt;span class="nv"&gt;Maps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Failed &lt;span class="nv"&gt;Shuffles&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Merged Map &lt;span class="nv"&gt;outputs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; GC &lt;span class="nb"&gt;time&lt;/span&gt; elapsed &lt;span class="o"&gt;(&lt;/span&gt;ms&lt;span class="o"&gt;)=&lt;/span&gt;&lt;span class="m"&gt;115&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CPU &lt;span class="nb"&gt;time&lt;/span&gt; spent &lt;span class="o"&gt;(&lt;/span&gt;ms&lt;span class="o"&gt;)=&lt;/span&gt;&lt;span class="m"&gt;1080&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Physical memory &lt;span class="o"&gt;(&lt;/span&gt;bytes&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;snapshot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;300331008&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Virtual memory &lt;span class="o"&gt;(&lt;/span&gt;bytes&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;snapshot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5493092352&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Total committed heap usage &lt;span class="o"&gt;(&lt;/span&gt;bytes&lt;span class="o"&gt;)=&lt;/span&gt;&lt;span class="m"&gt;165810176&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Shuffle &lt;/code&gt;方法执行&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Shuffle Errors&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;BAD_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;CONNECTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;IO_ERROR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;WRONG_LENGTH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;WRONG_MAP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;WRONG_REDUCE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt;`&lt;/span&gt;File Input&lt;span class="sb"&gt;`&lt;/span&gt;和&lt;span class="sb"&gt;`&lt;/span&gt;File Output&lt;span class="sb"&gt;`&lt;/span&gt; 方法执行 &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File Input Format Counters&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Bytes &lt;span class="nv"&gt;Read&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File Output Format Counters&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Bytes &lt;span class="nv"&gt;Written&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;17&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;运行结果如图&#10;&lt;img alt="请输入图片描述" class="gallery-image" data-flex-basis="673px" data-flex-grow="280" height="332" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/2HlKEv.png" width="932"&gt;&lt;/p&gt;&#10;&lt;h3 id="进一步优化"&gt;&lt;a href="#%e8%bf%9b%e4%b8%80%e6%ad%a5%e4%bc%98%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;进一步优化&#10;&lt;/h3&gt;&lt;h4 id="使用combiner"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8combiner" class="header-anchor"&gt;&lt;/a&gt;使用Combiner&#10;&lt;/h4&gt;&lt;p&gt;使用Combiner组件可以在Mapping时就先进行一次聚合，再发送到Shuffling继续运算，从而提高运算效率&#10;在主方法中进行如下配置即可&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//通过job设置combiner处理类，逻辑上与reduce一致，注意，如果要计算平均数等不能使用Combiner!&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCombinerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyReducer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编写完后使用Maven重新打包&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mvn clean package -DskipTests&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上传到服务器后再次执行计算命令&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hadoop jar hadoopstudy-0.3.jar com.fjy.hadoop.mapreduce.WordCountApp hdfs://192.168.79.129:8020/hello.txt hdfs://192.168.79.129:8020/output/wc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看图形界面可观察是否完成&#10;&lt;img alt="请输入图片描述" class="gallery-image" data-flex-basis="855px" data-flex-grow="356" height="526" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/2riYsr.png" width="1874"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="请输入图片描述" class="gallery-image" data-flex-basis="902px" data-flex-grow="376" height="503" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/2riK3F.png" width="1892"&gt;&lt;/p&gt;&#10;&lt;p&gt;通过查看代码可发现&lt;code&gt;Combine input records&lt;/code&gt;已经不为0(之前未使用Combiner 时该值为0)，说明使用成功&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt; Map-Reduce Framework&#10; Map input records=4&#10; ...&#10; Combine input records=9&#10; Combine output records=5&#10; ...&#10; Physical memory (bytes) snapshot=298844160&#10; Virtual memory (bytes) snapshot=5493088256&#10; Total committed heap usage (bytes)=165810176&#10; Shuffle Errors&#10; BAD_ID=0&#10; ...&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查看结果&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost testFile&lt;span class="o"&gt;]&lt;/span&gt;$ hadoop fs -cat /output/wc/part-r-00000&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/10 23:06:51 WARN util.NativeCodeLoader: Unable to load native-hadoop library &lt;span class="k"&gt;for&lt;/span&gt; your platform... using builtin-java classes where applicable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ! &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Hadoop &lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Hello &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MapReduce &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; YARN &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="使用partitioner组件"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8partitioner%e7%bb%84%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;使用Partitioner组件&#10;&lt;/h2&gt;&lt;h3 id="作用"&gt;&lt;a href="#%e4%bd%9c%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;作用&#10;&lt;/h3&gt;&lt;p&gt;Partitioner决定MapTask输出的数据交由哪个ReduceTask处理，其默认实现为分发的key的hash值对ReduceTask个数取模&lt;/p&gt;&#10;&lt;h3 id="文件准备"&gt;&lt;a href="#%e6%96%87%e4%bb%b6%e5%87%86%e5%a4%87" class="header-anchor"&gt;&lt;/a&gt;文件准备&#10;&lt;/h3&gt;&lt;p&gt;在宝塔测试目录&lt;code&gt;/www/hadoop/testFile&lt;/code&gt;下准备好&lt;code&gt;PartitionerTest.txt&lt;/code&gt;文件，文件内容如图，将其上传到HDFS根目录中&#10;&lt;img alt="请输入图片描述" class="gallery-image" data-flex-basis="547px" data-flex-grow="228" height="226" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25VUyL.png" width="516"&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt; [hadoop@localhost root]$ cd /www/hadoop/testFile&#10; [hadoop@localhost testFile]$ ls&#10; PartitionerTest.txt hello.txt&#10; [hadoop@localhost testFile]$ hadoop fs -put PartitionerTest.txt /&#10; 18/04/11 00:30:31 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable&#10; [hadoop@localhost testFile]$ hadoop fs -ls /&#10; 18/04/11 00:30:39 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable&#10; Found 7 items&#10; -rw-r--r-- 1 hadoop supergroup 73 2018-04-11 00:30 /PartitionerTest.txt&#10; drwxr-xr-x - hadoop supergroup 0 2018-04-08 10:56 /hdfsapi&#10; -rw-r--r-- 1 hadoop supergroup 60 2018-04-10 23:03 /hello.txt&#10; drwxr-xr-x - hadoop supergroup 0 2018-04-10 23:05 /output&#10; drwxr-xr-x - hadoop supergroup 0 2018-04-08 10:35 /test&#10; drwx------ - hadoop supergroup 0 2018-04-09 20:11 /tmp&#10; drwxr-xr-x - hadoop supergroup 0 2018-04-09 20:11 /user&#10; [hadoop@localhost testFile]$ hadoop fs -text /PartitionerTest.txt&#10; 18/04/11 00:30:59 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable&#10; xiaomi 200&#10; huawei 300&#10; xiaomi 100&#10; huawei 200&#10; iphone 300&#10; iphone 200&#10; sony 50&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="代码编写"&gt;&lt;a href="#%e4%bb%a3%e7%a0%81%e7%bc%96%e5%86%99" class="header-anchor"&gt;&lt;/a&gt;代码编写&#10;&lt;/h3&gt;&lt;p&gt;主要对分隔符和上下文内容进行修改，&lt;code&gt;map&lt;/code&gt;类中修改为&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//每一个空格是一个手机品牌，另一个是销售数量&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LongWritable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Long&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseLong&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;新增&lt;code&gt;Partitioner&lt;/code&gt;处理类&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cm"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * Partitioner处理类&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyPartitioner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;extends&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Partitioner&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;LongWritable&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getPartition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LongWritable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;xiaomi&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="c1"&gt;//若为xiaomi则交由0 ReduceTask处理&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;huawei&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="c1"&gt;//若为huawei则交由1 ReduceTask处理&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;iphone&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="c1"&gt;//若为iphone则交由2 ReduceTask处理&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="c1"&gt;//若为其他，则交由3 ReduceTask处理&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最后在驱动中配置&lt;code&gt;Partitioner&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//设置job的Partition&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setPartitionerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyPartitioner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//设置四个reducer，每个分区一个，否则Partitioner配置不生效&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setNumReduceTasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过复制类名全路径（以IDEA为例），修改运行命令&#10;&lt;img alt="请输入图片描述" class="gallery-image" data-flex-basis="681px" data-flex-grow="284" height="269" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25VsmW.png" width="764"&gt;&lt;/p&gt;&#10;&lt;p&gt;此时，运行命令为&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hadoop jar hadoopstudy-0.4.jar com.fjy.hadoop.mapreduce.WordCountPartitionerApp hdfs://192.168.79.129:8020/PartitionerTest.txt hdfs://192.168.79.129:8020/output/partitioner&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="执行"&gt;&lt;a href="#%e6%89%a7%e8%a1%8c" class="header-anchor"&gt;&lt;/a&gt;执行&#10;&lt;/h3&gt;&lt;p&gt;再次用Maven打包并上传到测试目录运行&#10;运行前：&#10;&lt;img alt="请输入图片描述" class="gallery-image" data-flex-basis="776px" data-flex-grow="323" height="530" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25Vzaw.png" width="1714"&gt;&lt;/p&gt;&#10;&lt;p&gt;运行中：&#10;&lt;img alt="请输入图片描述" class="gallery-image" data-flex-basis="912px" data-flex-grow="380" height="500" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25VKn8.png" width="1901"&gt;&lt;/p&gt;&#10;&lt;p&gt;运行结束&#10;&lt;img alt="请输入图片描述" class="gallery-image" data-flex-basis="1183px" data-flex-grow="493" height="385" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25VDDR.png" width="1899"&gt;&lt;/p&gt;&#10;&lt;p&gt;查看结果内容：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost testFile&lt;span class="o"&gt;]&lt;/span&gt;$ hadoop fs -ls /output/partitioner&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/11 00:36:28 WARN util.NativeCodeLoader: Unable to load native-hadoop library &lt;span class="k"&gt;for&lt;/span&gt; your platform... using builtin-java classes where applicable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Found &lt;span class="m"&gt;5&lt;/span&gt; items&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; hadoop supergroup &lt;span class="m"&gt;0&lt;/span&gt; 2018-04-11 00:35 /output/partitioner/_SUCCESS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; hadoop supergroup &lt;span class="m"&gt;11&lt;/span&gt; 2018-04-11 00:35 /output/partitioner/part-r-00000&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; hadoop supergroup &lt;span class="m"&gt;11&lt;/span&gt; 2018-04-11 00:35 /output/partitioner/part-r-00001&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; hadoop supergroup &lt;span class="m"&gt;11&lt;/span&gt; 2018-04-11 00:35 /output/partitioner/part-r-00002&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; hadoop supergroup &lt;span class="m"&gt;8&lt;/span&gt; 2018-04-11 00:35 /output/partitioner/part-r-00003&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost testFile&lt;span class="o"&gt;]&lt;/span&gt;$ hadoop fs -text /output/partitioner/part-r-00000&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/11 00:36:53 WARN util.NativeCodeLoader: Unable to load native-hadoop library &lt;span class="k"&gt;for&lt;/span&gt; your platform... using builtin-java classes where applicable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; xiaomi &lt;span class="m"&gt;300&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost testFile&lt;span class="o"&gt;]&lt;/span&gt;$ hadoop fs -text /output/partitioner/part-r-00001&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/11 00:36:58 WARN util.NativeCodeLoader: Unable to load native-hadoop library &lt;span class="k"&gt;for&lt;/span&gt; your platform... using builtin-java classes where applicable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; huawei &lt;span class="m"&gt;500&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost testFile&lt;span class="o"&gt;]&lt;/span&gt;$ hadoop fs -text /output/partitioner/part-r-00002&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/11 00:37:05 WARN util.NativeCodeLoader: Unable to load native-hadoop library &lt;span class="k"&gt;for&lt;/span&gt; your platform... using builtin-java classes where applicable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; iphone &lt;span class="m"&gt;500&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost testFile&lt;span class="o"&gt;]&lt;/span&gt;$ hadoop fs -text /output/partitioner/part-r-00003&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 18/04/11 00:37:12 WARN util.NativeCodeLoader: Unable to load native-hadoop library &lt;span class="k"&gt;for&lt;/span&gt; your platform... using builtin-java classes where applicable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sony &lt;span class="m"&gt;50&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果正确！&lt;/p&gt;&#10;&lt;h2 id="开启jobhistory"&gt;&lt;a href="#%e5%bc%80%e5%90%afjobhistory" class="header-anchor"&gt;&lt;/a&gt;开启JobHistory&#10;&lt;/h2&gt;&lt;h3 id="jobhistory作用"&gt;&lt;a href="#jobhistory%e4%bd%9c%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;JobHistory作用&#10;&lt;/h3&gt;&lt;p&gt;记录已经运行完 的MapReduce信息到指定的HDFS目录下，但默认不开启&#10;因此此时不配置直接访问如下&lt;/p&gt;&#10;&lt;p&gt;![jobhistory][33]&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="jobhistory" class="gallery-image" data-flex-basis="774px" data-flex-grow="322" height="375" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25wHdi.png" width="1210"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="jobhistory" class="gallery-image" data-flex-basis="387px" data-flex-grow="161" height="511" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25wGpv.png" width="826"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="jobhistory" class="gallery-image" data-flex-basis="400px" data-flex-grow="166" height="450" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25wcPa.png" width="751"&gt;&lt;/p&gt;&#10;&lt;h3 id="配置jobhistory"&gt;&lt;a href="#%e9%85%8d%e7%bd%aejobhistory" class="header-anchor"&gt;&lt;/a&gt;配置JobHistory&#10;&lt;/h3&gt;&lt;p&gt;在&lt;code&gt;mapred-site.xml&lt;/code&gt;加入配置&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- jobhistory地址--&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nt"&gt;&amp;lt;property&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;mapreduce.jobhistory.address&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;192.168.79.129:10020&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="nt"&gt;&amp;lt;description&amp;gt;&lt;/span&gt;MapReduce JobHistory Server IPC host:port&lt;span class="nt"&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nt"&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- jobhistory web的地址--&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nt"&gt;&amp;lt;property&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;mapreduce.jobhistory.webapp.address&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;192.168.79.129:19888&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="nt"&gt;&amp;lt;description&amp;gt;&lt;/span&gt;MapReduce JobHistory Server Web UI host:port&lt;span class="nt"&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nt"&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- 作业运行完存放地址--&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nt"&gt;&amp;lt;property&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;mapreduce.jobhistory.done-dir&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;/history/done&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nt"&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- 作业运行中存放地址--&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nt"&gt;&amp;lt;property&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;mapreduce.jobhistory.intermediate-done-dir&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;/history/done_intermediate&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nt"&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt="jobhistory" class="gallery-image" data-flex-basis="180px" data-flex-grow="75" height="786" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25wCMd.png" width="592"&gt;&lt;/p&gt;&#10;&lt;p&gt;配置完后重启YARN&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost mapreduce&lt;span class="o"&gt;]&lt;/span&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; /www/hadoop/hadoop-2.6.0-cdh5.7.0/sbin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost sbin&lt;span class="o"&gt;]&lt;/span&gt;$ ./stop-yarn.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; stopping yarn daemons&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; stopping resourcemanager&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; localhost: stopping nodemanager&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; no proxyserver to stop&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost sbin&lt;span class="o"&gt;]&lt;/span&gt;$ jps&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;2353&lt;/span&gt; DataNode&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;80224&lt;/span&gt; Jps&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;2228&lt;/span&gt; NameNode&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;2522&lt;/span&gt; SecondaryNameNode&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost sbin&lt;span class="o"&gt;]&lt;/span&gt;$ ./start-yarn.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; starting yarn daemons&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; starting resourcemanager, logging to /www/hadoop/hadoop-2.6.0-cdh5.7.0/logs/yarn-hadoop-resourcemanager-localhost.localdomain.out&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; localhost: starting nodemanager, logging to /www/hadoop/hadoop-2.6.0-cdh5.7.0/logs/yarn-hadoop-nodemanager-localhost.localdomain.out&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost mapreduce&lt;span class="o"&gt;]&lt;/span&gt;$ jps&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;2353&lt;/span&gt; DataNode&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;80336&lt;/span&gt; ResourceManager&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;2228&lt;/span&gt; NameNode&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;81510&lt;/span&gt; Jps&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;2522&lt;/span&gt; SecondaryNameNode&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;63582&lt;/span&gt; JobHistoryServer&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;80447&lt;/span&gt; NodeManager&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动jobhistory服务&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost sbin&lt;span class="o"&gt;]&lt;/span&gt;$ ./mr-jobhistory-daemon.sh start historyserver&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; starting historyserver, logging to /www/hadoop/hadoop-2.6.0-cdh5.7.0/logs/mapred-hadoop-historyserver-localhost.localdomain.out&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;运行PI测试&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost sbin&lt;span class="o"&gt;]&lt;/span&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; /www/hadoop/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost mapreduce&lt;span class="o"&gt;]&lt;/span&gt;$ hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar pi &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="访问报错"&gt;&lt;a href="#%e8%ae%bf%e9%97%ae%e6%8a%a5%e9%94%99" class="header-anchor"&gt;&lt;/a&gt;访问报错&#10;&lt;/h4&gt;&lt;p&gt;进入日志查看，发现仍然无法访问&#10;&lt;img alt="jobhistory" class="gallery-image" data-flex-basis="982px" data-flex-grow="409" height="378" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25w1gu.png" width="1548"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="jobhistory" class="gallery-image" data-flex-basis="374px" data-flex-grow="155" height="659" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25w4GD.png" width="1027"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="jobhistory" class="gallery-image" data-flex-basis="2125px" data-flex-grow="885" height="195" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25wZVT.png" width="1727"&gt;&lt;/p&gt;&#10;&lt;p&gt;报未开启聚合的错误，同时发现指向跳转链接为&lt;code&gt;localhost&lt;/code&gt;&#10;&lt;img alt="jobhistory" class="gallery-image" data-flex-basis="1402px" data-flex-grow="584" height="267" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25wn3J.png" width="1560"&gt;&lt;/p&gt;&#10;&lt;h4 id="增加配置"&gt;&lt;a href="#%e5%a2%9e%e5%8a%a0%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;增加配置&#10;&lt;/h4&gt;&lt;p&gt;因此在&lt;code&gt;yarn-site.xml&lt;/code&gt;加入配置&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- 开启YARN log的聚合功能--&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nt"&gt;&amp;lt;property&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;yarn.log-aggregation-enable&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nt"&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同时，为了让虚拟机的跳转链接不为&lt;code&gt;localhost&lt;/code&gt;，此处再加入一段配置，制定IP&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;property&amp;gt;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;yarn.nodemanager.hostname&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;192.168.79.129&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/property&amp;gt;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt="jobhistory" class="gallery-image" data-flex-basis="308px" data-flex-grow="128" height="405" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25wwGM.png" width="520"&gt;&lt;/p&gt;&#10;&lt;h3 id="重启服务"&gt;&lt;a href="#%e9%87%8d%e5%90%af%e6%9c%8d%e5%8a%a1" class="header-anchor"&gt;&lt;/a&gt;重启服务&#10;&lt;/h3&gt;&lt;p&gt;再次重启YARN，并同时&lt;strong&gt;重启jobhistory服务&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost sbin&lt;span class="o"&gt;]&lt;/span&gt;$ ./mr-jobhistory-daemon.sh stop historyserver&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; stopping historyserver&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost sbin&lt;span class="o"&gt;]&lt;/span&gt;$ ./stop-yarn.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; stopping yarn daemons&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; stopping resourcemanager&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; localhost: stopping nodemanager&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; no proxyserver to stop&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost sbin&lt;span class="o"&gt;]&lt;/span&gt;$ ./start-yarn.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; starting yarn daemons&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; starting resourcemanager, logging to /www/hadoop/hadoop-2.6.0-cdh5.7.0/logs/yarn-hadoop-resourcemanager-localhost.localdomain.out&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; localhost: starting nodemanager, logging to /www/hadoop/hadoop-2.6.0-cdh5.7.0/logs/yarn-hadoop-nodemanager-localhost.localdomain.out&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost sbin&lt;span class="o"&gt;]&lt;/span&gt;$ ./mr-jobhistory-daemon.sh start historyserver&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; starting historyserver, logging to /www/hadoop/hadoop-2.6.0-cdh5.7.0/logs/mapred-hadoop-historyserver-localhost.localdomain.out&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;【注意】此时若只重启YARN就算配置正确，仍然可能出现&lt;code&gt;Aggregation is not enabled&lt;/code&gt;的错误&lt;/p&gt;&#10;&lt;h3 id="验证"&gt;&lt;a href="#%e9%aa%8c%e8%af%81" class="header-anchor"&gt;&lt;/a&gt;验证&#10;&lt;/h3&gt;&lt;p&gt;再次执行PI运算&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost sbin&lt;span class="o"&gt;]&lt;/span&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; /www/hadoop/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;hadoop@localhost mapreduce&lt;span class="o"&gt;]&lt;/span&gt;$ hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar pi &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看Logs记录&#10;&lt;img alt="jobhistory" class="gallery-image" data-flex-basis="369px" data-flex-grow="153" height="762" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25w6YF.png" width="1172"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="jobhistory" class="gallery-image" data-flex-basis="369px" data-flex-grow="153" height="762" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25wfpt.png" width="1172"&gt;&lt;/p&gt;&#10;&lt;p&gt;已经有日志记录，配置成功！&#10;&lt;img alt="jobhistory" class="gallery-image" data-flex-basis="369px" data-flex-grow="153" height="762" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/25wiur.png" width="1172"&gt;&lt;/p&gt;&#10;</description></item></channel></rss>