高可用Hadoop平台-启航

1.概述

  在上篇博客中,我们搭建了《配置高可用Hadoop平台》,接下来我们就可以驾着Hadoop这艘巨轮在大数据的海洋中遨游了。工欲善其事,必先利其器。是的,没错;我们开发需要有开发工具(IDE);本篇文章,我打算讲解如何搭建和使用开发环境,以及编写和讲解WordCount这个例子,给即将在Hadoop的海洋驰骋的童鞋入个门。上次,我在《网站日志统计案例分析与实现》中说会将源码放到Github,后来,我考虑了下,决定将《高可用的Hadoop平台》做一个系列,后面基于这个平台,我会单独写一篇来赘述具体的实现过程,和在实现过程中遇到的一些问题,以及解决这些问题的方案。下面我们开始今天的启航

2.启航

  IDE:JBoss Developer Studio 8.0.0.GA (Eclipse的升级版,Redhat公司出的)

  JDK:1.7(或1.8)

  Hadoop2x-eclipse-plugin:这个插件,本地单元测试或自己做学术研究比较好用

  插件下载地址:https://github.com/smartdengjie/hadoop2x-eclipse-plugin

  由于JBoss Developer Studio 8基本适合于Retina屏,所以,我们这里直接使用JBoss Developer Studio 8,JBoss Developer Studio 7对Retina屏的支持不是很完美,这里就不赘述了。

  附上一张IDE的截图:

2.1安装插件

  下面我们开始安装插件,首先展示首次打开的界面,如下图所示:

  然后,我们到上面给的Github的地址,clone整个工程,里面有编译好的jar和源码,可自行选择(使用已存在的和自己编译对应的版本),这里我直接使用编译好的版本。我们将jar放到IDE的plugins目录下,如下图所示:

  接着,我们重启IDE,界面出现如下图所示的,即表示插件添加成功,若没有,查看IDE的启动日志,根据异常日志定位出原因。

2.2设置Hadoop插件

  配置信息如下所示(已在图中说明):

  添加本地的hadoop源码目录:

  到这里,IDE和插件的搭建就完成了,下面我们进入一段简单的开发,hadoop的源码中提供了许多example让我学习,这里我以WordCount为例子来说明:

3.WordCount

  首先我们看下hadoop的源码文件目录,如下图所示:

3.1源码解读

package cn.hdfs.mr.example;

import java.io.IOException;
import java.util.Random;
import java.util.StringTokenizer;

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.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.hdfs.utils.ConfigUtils;

/**
 *
 * @author dengjie
 * @date 2015年03月13日
 * @description Wordcount的例子是一个比较经典的mapreduce例子,可以叫做Hadoop版的hello world。
 *              它将文件中的单词分割取出,然后shuffle,sort(map过程),接着进入到汇总统计
 *              (reduce过程),最后写道hdfs中。基本流程就是这样。
 */
public class WordCount {

    private static Logger log = LoggerFactory.getLogger(WordCount.class);

    public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {

    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    /*
     * 源文件:a b b
     *
     * map之后:
     *
     * a 1
     *
     * b 1
     *
     * b 1
     */
    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        StringTokenizer itr = new StringTokenizer(value.toString());// 整行读取
        while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());// 按空格分割单词
        context.write(word, one);// 每次统计出来的单词+1
        }
    }
    }

    /*
     * reduce之前:
     *
     * a 1
     *
     * b 1
     *
     * b 1
     *
     * reduce之后:
     *
     * a 1
     *
     * b 2
     */
    public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
        sum += val.get();
        }
        result.set(sum);
        context.write(key, result);
    }
    }

    @SuppressWarnings("deprecation")
    public static void main(String[] args) throws Exception {
    Configuration conf1 = new Configuration();
    Configuration conf2 = new Configuration();
    long random1 = new Random().nextLong();// 重定下输出目录1
    long random2 = new Random().nextLong();// 重定下输出目录2
    log.info("random1 -> " + random1 + ",random2 -> " + random2);
    Job job1 = new Job(conf1, "word count1");
    job1.setJarByClass(WordCount.class);
    job1.setMapperClass(TokenizerMapper.class);// 指定Map计算的类
    job1.setCombinerClass(IntSumReducer.class);// 合并的类
    job1.setReducerClass(IntSumReducer.class);// Reduce的类
    job1.setOutputKeyClass(Text.class);// 输出Key类型
    job1.setOutputValueClass(IntWritable.class);// 输出值类型  

    Job job2 = new Job(conf2, "word count2");
    job2.setJarByClass(WordCount.class);
    job2.setMapperClass(TokenizerMapper.class);
    job2.setCombinerClass(IntSumReducer.class);
    job2.setReducerClass(IntSumReducer.class);
    job2.setOutputKeyClass(Text.class);
    job2.setOutputValueClass(IntWritable.class);
    // FileInputFormat.addInputPath(job, new
    // Path(String.format(ConfigUtils.HDFS.WORDCOUNT_IN, "test.txt")));
    // 指定输入路径
    FileInputFormat.addInputPath(job1, new Path(String.format(ConfigUtils.HDFS.WORDCOUNT_IN, "word")));
    // 指定输出路径
    FileOutputFormat.setOutputPath(job1, new Path(String.format(ConfigUtils.HDFS.WORDCOUNT_OUT, random1)));
    FileInputFormat.addInputPath(job2, new Path(String.format(ConfigUtils.HDFS.WORDCOUNT_IN, "word")));
    FileOutputFormat.setOutputPath(job2, new Path(String.format(ConfigUtils.HDFS.WORDCOUNT_OUT, random2)));

    boolean flag1 = job1.waitForCompletion(true);// 执行完MR任务后退出应用
    boolean flag2 = job1.waitForCompletion(true);
    if (flag1 && flag2) {
        System.exit(0);
    } else {
        System.exit(1);
    }

    }
}

4.总结

  这篇文章就和大家分享到这里,如果在研究的过程有什么问题,可以加群讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!

时间: 2024-11-08 19:17:47

高可用Hadoop平台-启航的相关文章

高可用Hadoop平台-实战

1.概述 今天继续<高可用的Hadoop平台>系列,今天开始进行小规模的实战下,前面的准备工作完成后,基本用于统计数据的平台都拥有了,关于导出统计结果的文章留到后面赘述.今天要和大家分享的案例是一个基于电商网站的用户行为分析,这里分析的指标包含以下指标: 统计每日PV 每日注册用户 每日IP 跳出用户 其他指标可以参考上述4个指标进行拓展,下面我们开始今天的分析之旅. 2.流程 首先,在开发之前我们需要注意哪些问题?我们不能盲目的按照自己的意愿去开发项目,这样到头来得不到产品的认可,我们的工作

高可用Hadoop平台-Flume NG实战图解篇

1.概述 今天补充一篇关于Flume的博客,前面在讲解高可用的Hadoop平台的时候遗漏了这篇,本篇博客为大家讲述以下内容: Flume NG简述 单点Flume NG搭建.运行 高可用Flume NG搭建 Failover测试 截图预览 下面开始今天的博客介绍. 2.Flume NG简述 Flume NG是一个分布式,高可用,可靠的系统,它能将不同的海量数据收集,移动并存储到一个数据存储系统中.轻量,配置简单,适用于各种日志收集,并支持Failover和负载均衡.并且它拥有非常丰富的组件.Fl

高可用Hadoop平台-Ganglia安装部署

1.概述 最近,有朋友私密我,Hadoop有什么好的监控工具,其实,Hadoop的监控工具还是蛮多的.今天给大家分享一个老牌监控工具Ganglia,这个在企业用的也算是比较多的,Hadoop对它的兼容也很好,不过就是监控界面就不是很美观.下次给大家介绍另一款工具——Hue,这个界面官方称为Hadoop UI,界面美观,功能也比较丰富.今天,在这里主要给大家介绍Ganglia这款监控工具,介绍的内容主要包含如下: Ganglia背景 Ganglia安装部署.配置 Hadoop集群配置Ganglia

高可用Hadoop平台-Oozie工作流

1.概述 在开发Hadoop的相关应用使用,在业务不复杂,任务不多的情况下,我们可以直接使用Crontab去完成相关应用的调度.今天给大家介绍的是统一管理各种调度任务的系统,下面为今天分享的内容目录: 内容介绍 Oozie Server 截图预览 下面开始今天的内容分享. 2.内容介绍 今天的内容不涉及Oozie的具体细节操作,它的工作流程在下一篇博客为大家详细介绍.今天主要给大家分享Oozie的作用,它的集成步骤等内容. 2.1 作用 Oozie它是一个开源的工作流调度系统,它可以管理逻辑复杂

看我如何快速学习.Net(高可用数据采集平台)

最近文章:高可用数据采集平台(如何玩转3门语言php+.net+aauto).高并发数据采集的架构应用(Redis的应用) 项目文档:关键词匹配项目深入研究(二)- 分表思想的引入 吐槽:本人也是非常讨厌拿来主义的,有些培训每个细节都提到过,主管还找我要实际案例,而不是去安排合适的人去做这件事情,有点过于拿来主义了,有点担心. 好消息的是:高并发数据采集的架构应用(Redis的应用)团队已经实现了,不过有部分代码还是我写的,值得喝彩下,说明团队的能力还是不错的. 最近有时间,我也是用.net完成

高可用数据采集平台(如何玩转3门语言php+.net+aauto)

同类文章:高并发数据采集的架构应用(Redis的应用) 吐槽下:本人主程是PHP,团队里面也没有精通.net的人才,为了解决这个平台方案,还是费了一部分劲. 新年了,希望有个新的开始.技术+团队管理都有新的突破吧,在新的一年对自己好些,不能再继续搞基下去. 问题出发点: ´随着软件的日益强大,用户的使用需求越来越多,用户也希望众多数据进行整合,来达到资源的合理应用. ´有些数据资源需要抓取网页的形式来采集到数据. ´采集应用不统一,没有良好的管理程序,杂乱无章. ´采集应用经常性无响应,无相应的

安装高可用Hadoop生态 (一 ) 准备环境

为了学习Hadoop生态的部署和调优技术,在笔记本上的3台虚拟机部署Hadoop集群环境,要求保证HA,即主要服务没有单点故障,能够执行最基本功能,完成小内存模式的参数调整. 1.    准备环境 1.1. 规划 克隆3台服务器,主机名和IP如下 主机名 IP 软件 hadoop 192.168.154.128 原始虚拟机用于克隆 hadoop1 192.168.154.3 Zookeeper,journalnode Namenode, zkfc, Resourcemanager hadoop2

安装高可用Hadoop生态 (二) 安装Zookeeper

2.    安装Zookeeper 2.1. 解压程序 ※ 3台服务器分别执行 tar -xf ~/install/zookeeper-3.4.9.tar.gz -C/opt/cloud/packages ln -s /opt/cloud/packages/zookeeper-3.4.9 /opt/cloud/bin/zookeeper ln -s /opt/cloud/packages/zookeeper-3.4.9/conf /opt/cloud/etc/zookeeper mkdir -p

高并发高可用的平台架构就一个字“拆”

根本目的是,随着用户量.数据量不断增加,系统可以通过不断的增加服务器就能解决问题,可拆的几个要点: 1.流程.通过消息组件,流程的各个节点异步交互,独立部署. 2.数据库.读写分离,多主多从.根据数据的时间.类型等等,单表的数据保存到多表.多库. 3.文件储存.通过分布式文件系统,集群存储 4.部署.通过各种的负载均衡硬件软件.域名均衡,分发到不同服务器.动静分离. 北京哪里找富婆包养鸭子 海淀区哪里找富婆包养鸭子 东城区哪里找富婆包养鸭子 西城区哪里找富婆包养鸭子 宣武区哪里找富婆包养鸭子 丰