Hadoop界的Hello World!

2019-05-20  19:50:09

应用平台:Eclipse+ubantu+hadoop包

注:例分析的形式给宝宝们解释一下,详细运行过程省略。

实例:定义一个进行统计的原始文件

Hello MrZhangxd Hello Yootk

Hello Bye Bye Bye

Hello MrZhangxd

预期结果:

Bye 3

Hello 4

MrZhangxd 2

Yootk 1

主要实现利用MapReduce,那么什么是MapReduce?

MapReduce是一种可用于数据处理的编程模型。MapReduce程序本质是并行运行的。

第一步 使用可视化表格进行分析

对于MapReduce而言有两个阶段

Map阶段:对数据的处理阶段

Reduce阶段:对处理后的数据进行计算

以上实例如果使用MapReduce处理的话其流程如下:

Map处理

排序处理

合并处理

Reduce处理

<Hello,1>

<MrZhangxd,1>

<Hello,1>

<Yootk,1>

<Hello,1>

<Bye,1>
<Bye,1>

<Bye,1>

<Hello,1>

<MrZhangxd,1>

<Bye,1>

<Bye,1>

<Bye,1>

<Hello,1>

<Hello,1>

<Hello,1>

<Hello,1>

<MrZhangxd,1>

<MrZhangxd,1>

<Yootk,1>

<Bye,1,1,1>

<Hello,1,1,1,1>

<MrZhangxd,1,1>

<Yootk,1>

<Bye,3>

<Hello,4>

<MrZhangxd,2>

<Yootk,1>

以上整个操作称作一个完整的作业“Job”

第二步 代码编写(代码格式主要参考《代码整洁之道》的编码格式)

实现单词统计的代码:

package
org.mrzhangxd.com.linux;

import
java.io.IOException;

import
org.apache.hadoop.conf.Configuration;

import
org.apache.hadoop.fs.Path;

import
org.apache.hadoop.io.IntWritable;

import
org.apache.hadoop.io.Text;

import
org.apache.hadoop.mapreduce.Job;

import
org.apache.hadoop.mapreduce.Mapper;

import
org.apache.hadoop.mapreduce.Reducer;

import
org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

import
org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import
org.apache.hadoop.util.GenericOptionsParser;

/**

 * 本操作主要是进行Map的数据处理

 * @author MrZhangxd

 * 在Mapper父类里面接受的内容如下:

 * Object:输入数据的具体内容

 * Text:每行的文本数据

 * Text:每个单词分解后的统计结果

 * IntWritable:输出记录的结果

 */

public class WordCount {//本处要求实现单词统计的处理操作

     //在整个代码中最为关键部分就是Map和Reduce部分,而且这两个部分是需要用户自己了实现的

     private static class WordCountReducer extends Reducer<Text,IntWritable,Text,IntWritable>{

              @Override

              protected void reduce(Text key, Iterable<IntWritable> values,

                       Reducer<Text, IntWritable, Text, IntWritable>.Context context)

                       throws IOException, InterruptedException {

                   // TODO Auto-generated method stub

                   super.reduce(key, values, context);

                   int sum = 0;//保存每个单词出现的数据

                   for(IntWritable count : values) {

                       sum += count.get();

                   }

                   context.write(key, new IntWritable(sum));

              }   

         }

     @SuppressWarnings("unused")

     private static class WordCountMapper extends Mapper<Object,Text,Text,IntWritable>{   

         @Override

         protected void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context)

                   throws IOException, InterruptedException {

                   // TODO Auto-generated method stub

                   super.map(key, value, context);

                   //默认情况下是提取每一行数据,所以每行数据里面都会存在空格,那么要按照空格进行分割,每当出现一个单词就需要做一个统计的1

                   String lineContent = value.toString();   
//取出每行的数据

                   String result [] = lineContent.split(" ");//按空格进行数据拆分

                   for(int x = 0;x < result.length;x++) {   
//循环每行每个单词而后进行数据的生成

                       //每一个单词最终生成的保存个数是1

                       context.write(new Text(result[x]), new IntWritable(1)); 

                   }

         }

     }

     public static void main(String[] args) throws IOException {

         // TODO Auto-generated method stub

         if(args.length != 2) {

              System.out.println("本程序需要两个参数,执行,hadoop yootk.jar /input/info.txt
/output");

              System.exit(1);   

         }

         //每一次的执行实际上都属于一个作业(Job),但是现在希望可以通过初始化参数来设置HDFS的文件存储路径

         //假设现在的文件保存在HDFS上的“input/info.txt”上,而且最终输出结果也将保存在HDFS的“output”目录中

         Configuration conf = new Configuration();

         //考虑到最终要使用HDFS进行内容的处理操作,并且输入的时候不带有HDFS地址

         String[] argArray = new GenericOptionsParser(conf, args).getRemainingArgs();//对输入的参数进行处理

         //后面就需要作业进行处理了,而且Map与Reduces操作必须通过作业来配置

         Job job = Job.getInstance(conf,"hadoop");//定义一个hadoop作业

         job.setMapperClass(WordCountMapper.class);//设置执行的jar文件的程序类

         job.setJarByClass(WordCount.class);    //指定Mapper的处理类

         job.setMapOutputKeyClass(Text.class); //设置输出key的类型

         job.setMapOutputValueClass(IntWritable.class);//设置输出的value类型

         job.setReducerClass(WordCountReducer.class);//设置reduce操作的处理类

         //设置Map-Reduce最终的执行结果

         job.setOutputKeyClass(Text.class);//信息设置为文本

         job.setOutputValueClass(IntWritable.class);//最终将内容设置为一个数值

         //设置输入以及输出路径

         //FileInputFormat.addInputPath(job, new
Path(argArray[0]));

         FileInputFormat.addInputPath(job, new Path(argArray[0]));

         FileOutputFormat.setOutputPath(job,new Path(argArray[1]));

         //等待执行完毕

         try {

              System.exit(job.waitForCompletion(true) ? 0 : 1);

         } catch (ClassNotFoundException | InterruptedException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

         }//执行完毕并且退出

     }

 }

注:代码的编写是需要使用到Hadoop中提供的*.jar文件的。

C:\Users\ XXX \Desktop\大数据\hadoop-3.2.0\share\hadoop

需要配置如下几个路劲的开发包:

|--Common组件包:

|   |--C:\Users\XXX\Desktop\大数据\hadoop-3.2.0\share\hadoop\common

|   |--C:\Users\XXX\Desktop\大数据\hadoop-3.2.0\share\hadoop\common\lib;

|--Mapreduce组件包:

|   |--C:\Users\XXX\Desktop\大数据\hadoop-3.2.0\share\hadoop\mapreduce

|   |--C:\Users\XXX\Desktop\大数据\hadoop-3.2.0\share\hadoop\mapreduce\lib;

Hadoop界的Hello World!的更多相关文章

  1. Hadoop安装成功之后,访问不了web界面的50070端口怎么解决?

    Hadoop安装成功之后,访问不了web界面的50070端口 先查看端口是否启用 [hadoop@s128 sbin]$ netstat -ano |grep 50070 然后查看防火墙的状态,是否关 ...

  2. 使用ganglia监控hadoop及hbase集群

    一.Ganglia简介 Ganglia 是 UC Berkeley 发起的一个开源监视项目,设计用于测量数以千计的节点.每台计算机都运行一个收集和发送度量数据(如处理器速度.内存使用量等)的名为 gm ...

  3. Hadoop学习路线图

    Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项目包括, ...

  4. 从零自学Hadoop(06):集群搭建

    阅读目录 序 集群搭建 监控 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 上一 ...

  5. 一篇文看懂Hadoop:风雨十年,未来何去何从

    本文分为技术篇.产业篇.应用篇.展望篇四部分 技术篇 2006年项目成立的一开始,“Hadoop”这个单词只代表了两个组件——HDFS和MapReduce.到现在的10个年头,这个单词代表的是“核心” ...

  6. Hadoop! | 大数据百科 | 数据观 | 中国大数据产业观察_大数据门户

        你正在使用过时的浏览器,Amaze UI 暂不支持. 请 升级浏览器 以获得更好的体验! 深度好文丨读完此文,就知道Hadoop了! 来源:BiThink 时间:2016-04-12 15:1 ...

  7. Hadoop家族 路线图(转)

    主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项 ...

  8. 浅析Hadoop文件格式

    Hadoop 作为MR 的开源实现,一直以动态运行解析文件格式并获得比MPP数据库快上几倍的装载速度为优势.不过,MPP数据库社区也一直批评Hadoop由于文件格式并非为特定目的而建,因此序列化和反序 ...

  9. Hadoop 生态系统

    1.概述 最近收到一些同学和朋友的邮件,说能不能整理一下 Hadoop 生态圈的相关内容,然后分享一些,我觉得这是一个不错的提议,于是,花了一些业余时间整理了 Hadoop 的生态系统,并将其进行了归 ...

随机推荐

  1. 笔记 - C#从头开始构建编译器 - 2

    视频与PR:https://github.com/terrajobst/minsk/blob/master/docs/episode-02.md 作者是 Immo Landwerth(https:// ...

  2. java 扫描微信公众号二维码,关注并登录逻辑

    场景:户扫描微信公众号的二维码,关注后自动登录网站,若已关注则直接登录. 逻辑: 系统生成带参数的临时二维码:参数 scene_str 自定义为唯一值(可以是uuid),临时二维码的生成方式参照官方接 ...

  3. vue框架之脚手架(vue-cli)的使用

    前期准备 1.在使用之前需要安装node.js,https://nodejs.org/dist/latest-v8.x/ 2.下载之后在cmd中测试 node -v npm -v 如图上即可 3.下载 ...

  4. ngtos 天融信

    NGFW系列产品基于天融信公司10年高品质安全产品开发经验结晶的NGTOS系统架构,采用了多项突破性技术.基于分层的设计思想,天融信公司通过长期的安全产品研发经验,分析多种安全硬件平台技术的差异,创造 ...

  5. 日常2018/4/9---b/s和c/s架构分别是什么?区别?

    b/s和c/s架构分别是什么?区别? b/s是指前后端分别是 Browser/Server的模式.(3层c/s模式) c/s是指前后端分别是 Client/Server的模式.(2层c/s模式) c/ ...

  6. dt7.0自定义推送熊掌号功能插件

    因要推送较早的数据,所以写了一个自定义推送熊掌号的功能插件,因我自己站点是新站,推送的数据较少,所以程序比较简单,算是初始版本,凑合着用吧. <?php /* 百度当天主动推送熊掌功能 作者:6 ...

  7. 13 复习 - webpack基本配置2

    在webpack下使用样式表 1.安装处理样式表的loader cnpm i style-loader css-loader -D //css cnpm i less-loader less -D / ...

  8. git将一个分支的内容替换为另一分支内容

    假设我想将我的linux分支内容替换master分支的内容. # 切换到master分支 git checkout master # 再将本地的master分支重置成linux git reset - ...

  9. Selenium常用API的使用java语言之17-文件上传

    对于通过input标签实现的上传功能,可以将其看作是一个输入框,即通过sendKeys()指定本地文件路径的方式实现文件上传. 创建upfile.html文件,代码如下: <html> & ...

  10. C语言入坑指南-缓冲区溢出

    前言 缓冲区溢出通常指的是向缓冲区写入了超过缓冲区所能保存的最大数据量的数据.如果说之前所提到的一些问题可能只是影响部分功能的实现,那么缓冲区溢出将可能会造成程序运行终止,被不安全代码攻击等严重问题, ...