前面将Cloudera Manager安装到集群上的一台主机后,并通过Cloudera manager安装了hadoop-2.6.0-CDH5.4.4。今日来测试安装的集群是否很够很好的执行mapreduce任务。测试的方法就是测试WordCount的例子。

1、在讲测试用例之前,我们首先为系统当前用户在HDFS中创建一下工作目录,并服务相应的权限。

1.1、由于我安装的时候是用的root用户,因此也就需要在hdfs中为root用户创建工作目录,并授予权限。

  (1)首先在HDFS中,在用户目录/user/下创建一个root用户文件夹,作为root用户的工作目录。执行如下代码:

    sudo -u hdfs  hadoop  fs  -mkdir  /user/root

  (2)授予/user/root目录相应的权限

    1)先将该目录的所有权赋给root用户: sudo -u hdfs  hadoop  fs  -chown  root  /user/root

    2)再将该目录的组的权限赋给root用户自己管理:sudo -u hdfs  hadoop  fs  -chgrp  root  /user/root

    3)最后设置该目录的权限:sudo -u hdfs  hadoop  fs -chmod  777  /user/root    (该权限是拥有者:可读可写可执行;组用户:可读可写可执行;其他用户:可读可写可执行)

1.2、给普通用户创建HDFS工作目录,并授予权限。普通用户与root方法类似,只不过这个过程是需要在root用户下执行的。

2、测试WordCount例子。

2.1、执行测试用例

  通过CDH自身的jar来测试,该jar是在/opt/cloudera/parcels/CDH/jars/hadoop-examples.jar包。然后通过在界面执行如下命令:

    hadoop  jar /opt/cloudera/parcels/CDH/jars/hadoop-examples.jar  /user/root/input  /user/root/output

  以上代码需要注意的是/user/root/output必须是未存在的。mapreduce运行完之后,会自动创建。

  本以为可以搞定,并等待结果,当执行完毕后,通过hdfs网页管理进入/user/root/output发现有48个part-r-000xx文件,这说明该作业提交后,执行了48个reducer任务。这就奇了怪了。我并没有让他执行48个reducer任务啊,而且我以前部署了这么多次的hadoop集群都没有出现过这个问题,这次运行WordCount竟然出现了这样的问题。

2.2、2.1的问题的原因分析

  通过查看上面产生的48个文件的内容,发现对应的是只是执行了map任务,对应的每一个单词就是1,reducer并没有进行累加。出现上面的这个问题,开始分析发现是由于yarn-site.xml配置文件中没有设置shuffle过程。就是没有设置洗牌的过程。也就是在yarn-site.xml文件中设置:

     <property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

通过查看Cloudera CDH的配置文件,发现貌似还真的没有设置。查看的方式是分别查看两个路径下的配置文件内容:

  客户端:/etc/hadoop

  服务端:/var/run/cloudera-scm-agent/process/ (在该目录下找yarn-RESOURCEMANAGER或yarn-NODEMANAGER的目录)

在这两个目录下可以查看相应的配置文件。发现配置文件并没有上面需要添加的信息,于是手动添加。最后发现也还是没用。

最后考虑reducer的代码的问题。最后发现是我的reducer类的代码下的有问题。

2.3、此时本以为问题已经解决了,但是运行之后,发现还是会有48个文件产生,这个时候我有郁闷了,我在查看了这48个文件的内容,发现这次reducer函数起到了作用,单词的个数进行了累加。那为什么还是会产生48个文件呢?

  原因:不明

  修改的方法是:通过在代码中设置reduce的个数来设置reducer的数目。如:job.setNumReduceTasks(1);

  此时发现有效,最后只有一个reducer。

  进一步测试,通过分别设置job.setNumReduceTasks(10);和job.setNumReduceTasks(100);,并运行产生结果,发现最后的结果都产生了我设置数目的reducer的个数的文件。这个时候,我推断默认情况下是reducer是48个。

下一步要去分析pritition函数的应用。

CDH上执行WordCount的意外和收获的更多相关文章

  1. cdh 上安装spark on yarn

    在cdh 上安装spark on yarn 还是比较简单的,不需要独立安装什么模块或者组件. 安装服务 选择on yarn 模式:上面 Spark 在spark 服务中添加 在yarn 服务中添加 g ...

  2. Hadoop基础学习(一)分析、编写并执行WordCount词频统计程序

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jiq408694711/article/details/34181439 前面已经在我的Ubuntu ...

  3. Windows 7上执行Cake 报错原因是Powershell 版本问题

    在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...

  4. .Net程序在linux mono环境和WindowsServer上执行测试对比

    最近研究了一下mono,想把windows上写的.Net程序移植到linux上跑.网上有资料说Linux上mono执行.Net程序效率比Windows高,本着实证的态度,只有实际验证过才有说服力. 写 ...

  5. Spark源码编译并在YARN上运行WordCount实例

    在学习一门新语言时,想必我们都是"Hello World"程序开始,类似地,分布式计算框架的一个典型实例就是WordCount程序,接触过Hadoop的人肯定都知道用MapRedu ...

  6. PHP在linux上执行外部命令

    PHP在linux上执行外部命令 一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍在PHP中调用外部命令,可以 ...

  7. Linux 在一个命令行上执行多个命令

    Linux 在一个命令行上执行多个命令 1. [ ; ] 如果被分号(;)所分隔的命令会连续的执行下去,就算是错误的命令也会继续执行后面的命令. 2. [ && ] 如果命令被 &am ...

  8. MySQL线上执行大事务或锁表操作

    前提 在线执行一些大事务或锁表操作(给某个核心级表加一列或者执行修改操作),此时不但主库从库要长时间锁表,主从延迟也会变大.未避免大事务sql对整个集群产生影响,,我们希望一条SQL语句只在Maste ...

  9. Linux 在一个命令行上执行多个命令(转载)

    对于单个命令执行我想大多数人都是明了的,也就是在一个命令行上执行一条命令.那对于在一行上执行多个命令怎么办呢,其实也很简单,只需在各命令之间加上特殊命令符号,我们常规使用到的有3个特殊命令符号. 1. ...

随机推荐

  1. Libsvm:脚本(subset.py、grid.py、checkdata.py) | MATLAB/OCTAVE interface | Python interface

    1.脚本 This directory includes some useful codes: 1. subset selection tools. (子集抽取工具) subset.py 2. par ...

  2. 【转】APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了

    只要是需要进行联网获取数据的APP,那么不管是版本更新,还是图片缓存,都会在本地产生缓存文件.那么,这些缓存文件到底放在什地方合适呢?系统有没有给我们提供建议的缓存位置呢?不同的缓存位置有什么不同呢? ...

  3. libCEF总结02字符串

    libCEF 的 CefString.cef_string_t 在 Windows 下均表示一个 16 位的 Unicode 字符串,它们的使用请参考下面的代码 {//wchar_t* ==> ...

  4. canvas drawImage异步特性

    先看代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  5. Python--关于 join 和 split

    .join() join将 容器对象 拆分并以指定的字符将列表内的元素(element)连接起来,返回字符串(注:容器对象内的元素须为字符类型) >>> a = ['no','pai ...

  6. Qt之QSequentialAnimationGroup

    简述 QSequentialAnimationGroup类提供动画的串行组. QSequentialAnimationGroup是一个串行运行动画的QAnimationGroup,在另一个动画播放结束 ...

  7. 如何使用java调用DLL运行C++(初篇)

    JNI:Java Native Interface,简称JNI,是Java平台的一部分,可用于让Java和其他语言编写的代码进行交互. 下面是从网上摘取的JNI工作示意图:

  8. Trapping Rain Water [LeetCode]

    Problem Description: http://oj.leetcode.com/problems/trapping-rain-water/ Basic idea: Get the index ...

  9. Java 集合系列 15 Map总结

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  10. Quoted-printable 编码介绍、编码解码转换

    求教,“=B9=A4=D7=F7=BC=F2=B1=A8” 这种是什么编码方式? Quoted-printable 可译为“可打印字符引用编码”.“使用可打印字符的编码”,我们收邮件,查看信件原始信息 ...