Hadoop:运行首个MapReduce任务
实训目标
(1) 掌握以 hadoop jar 方式提交 MapReduce 任务。
实训环境
(1) 使用 CentOS 6.10 的 Linux 操作系统搭建的 3 个节点的 Hadoop 集群。
(2) 使用 1.8 的 JDK 。
(3) 使用 2.6.4 版本的 Hadoop 。
实训内容
(1) 在 HDFS 上有日志文件 /user/root/email_log.txt ,如 图 3 ‑1 所示,其中每行记录是一个用户名,每一行记录表示用户登录了网站一次,要求统计每个用户登录的次数。
图 3 ‑ 1 email_log.txt
(2) 提交 MapReduce 任务给集群运行。
实训步骤
前置步骤
提交 MapReduce 任务给集群运行
提交 MapReduce 任务,通常使用 hadoop jar 命令。它的基本用法格式如 表 4 ‑1 所示。
表 4 ‑ 1 hadoop jar 语法格式
hadoop jar <jar> [mainClass] args
因为 hadoop jar 命令 的附带参数较多,下面结合实际任务,对它的各项参数进行说明。示例如 代码 4‑2 所示,其中,每个参数需要空格分开,反斜杠 \ 为换行作用。
代码 4 ‑ 2 使用 hadoop jar 命令提交 MapReduce 任务 命令
hadoop jar \ $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar \ wordcount \ /user/root/email_log.txt \ /user/root/output
参考 代码 4‑2 中的内容,针对 hadoop jar 命令的常用参数做以下解释说明。
( 1 ) $HADOOP_HOME :指主机中设置的环境变量(参考 /etc/profile 内容)。此处的 $HADOOP_HOME 就是本地目录 /usr/local/hadoop-2.6.4 。
( 2 ) hadoop-mapreduce-examples-2.6.5.jar : Hadoop 官方提供的示例程序包,其中包括词频统计模块( wordcount )。
( 3 ) wordcount :程序包中的主类名称。
( 4 ) /user/root/email_log.txt : HDFS 上的输入文件名称。
( 5 ) /user/root/output : HDFS 上的输出文件目录。
在理解了 hadoop jar 命令的各项参数后,执行统计用户登录次数的任务,这里是通过统计数据中用户名出现的次数来统计用户的登录次数,如 代码 4‑3 所示。
代码 4 ‑ 3 执行统计登录次数程序的命令
[root@master data]# hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar wordcount /user/root/email_log.txt /user/root/output
20/06/27 08:41:15 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 20/06/27 08:41:16 INFO client.RMProxy: Connecting to ResourceManager at master/192.168.128.130:8032 20/06/27 08:41:17 INFO input.FileInputFormat: Total input paths to process : 1 20/06/27 08:41:17 INFO mapreduce.JobSubmitter: number of splits:2 20/06/27 08:41:18 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1593205940394_0001 20/06/27 08:41:18 INFO impl.YarnClientImpl: Submitted application application_1593205940394_0001 20/06/27 08:41:19 INFO mapreduce.Job: The url to track the job: http://master:8088/proxy/application_1593205940394_0001/ 20/06/27 08:41:19 INFO mapreduce.Job: Running job: job_1593205940394_0001 20/06/27 08:41:29 INFO mapreduce.Job: Job job_1593205940394_0001 running in uber mode : false 20/06/27 08:41:29 INFO mapreduce.Job: map 0% reduce 0% 20/06/27 08:41:45 INFO mapreduce.Job: map 38% reduce 0% 20/06/27 08:41:48 INFO mapreduce.Job: map 46% reduce 0% 20/06/27 08:41:51 INFO mapreduce.Job: map 61% reduce 0% 20/06/27 08:41:54 INFO mapreduce.Job: map 70% reduce 0% 20/06/27 08:41:55 INFO mapreduce.Job: map 78% reduce 0% 20/06/27 08:41:57 INFO mapreduce.Job: map 83% reduce 0% 20/06/27 08:41:59 INFO mapreduce.Job: map 100% reduce 0% 20/06/27 08:42:06 INFO mapreduce.Job: map 100% reduce 84% 20/06/27 08:42:09 INFO mapreduce.Job: map 100% reduce 100% 20/06/27 08:42:09 INFO mapreduce.Job: Job job_1593205940394_0001 completed successfully 20/06/27 08:42:09 INFO mapreduce.Job: Counters: 49 File System Counters FILE: Number of bytes read=416431063 FILE: Number of bytes written=584943367 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=226383985 HDFS: Number of bytes written=114167885 HDFS: Number of read operations=9 HDFS: Number of large read operations=0 HDFS: Number of write operations=2 Job Counters Launched map tasks=2 Launched reduce tasks=1 Data-local map tasks=2 Total time spent by all maps in occupied slots (ms)=203092 Total time spent by all reduces in occupied slots (ms)=47524 Total time spent by all map tasks (ms)=50773 Total time spent by all reduce tasks (ms)=11881 Total vcore-milliseconds taken by all map tasks=50773 Total vcore-milliseconds taken by all reduce tasks=11881 Total megabyte-milliseconds taken by all map tasks=103983104 Total megabyte-milliseconds taken by all reduce tasks=24332288 Map-Reduce Framework Map input records=8000000 Map output records=8000000 Map output bytes=250379675 Map output materialized bytes=168189616 Input split bytes=214 Combine input records=12301355 Combine output records=9352725 Reduce input groups=3896706 Reduce shuffle bytes=168189616 Reduce input records=5051370 Reduce output records=3896706 Spilled Records=17558337 Shuffled Maps =2 Failed Shuffles=0 Merged Map outputs=2 GC time elapsed (ms)=1394 CPU time spent (ms)=41520 Physical memory (bytes) snapshot=515846144 Virtual memory (bytes) snapshot=6172655616 Total committed heap usage (bytes)=272535552 Shuffle Errors BAD_ID=0 CONNECTION=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0 WRONG_REDUCE=0 File Input Format Counters Bytes Read=226383771 File Output Format Counters Bytes Written=114167885]]
代码 4‑3 显示了 hadoop jar 执行 MapReduce 任务时的日志输出,其中的一些关键信息有助于检查执行的过程与状态。
任务执行完成后,在输出目录 /user/root/output/ 中有两个新文件生成:一个是 _SUCCESS ,这是一个标识文件,表示这个任务执行完成:另一个是 part-r-00000 ,即任务执行完成后产生的结果文件。显示出 part-r-00000 的内容,如 图 4‑1 所示。
图 4 ‑ 1 统计用户登录次数的结果
图 4‑1 中有两列数据,第 1 列是用户名 ,第 2 列就是该用户的登录次数。