Hadoop入门案例

news/2024/5/20 3:39:57 标签: hadoop, hdfs, 大数据

Hadoop的运行流程:

  1. 客户端向HDFS请求文件存储或使用MapReduce计算。
  2. NameNode负责管理整个HDFS系统中的所有数据块和元数据信息;DataNode则实际存储和管理数据块。客户端通过NameNode查找需要访问或处理的文件所在的DataNode,并将操作请求发送到相应的DataNode上。
  3. 当客户端上传一个新文件时(比如输入某些日志),它会被分成固定大小(默认64MB)并进行数据复制以保证可靠性。这些被称为“块”的小段才能与其他硬件组合得出代价最小化、且最佳速度/容错平衡所需表现出来呈现极高效率,并用checksum标记各实例在磁盘上是否一致。
  4. 数据已经保存在位于本地节点存储空间位置内,然后开始进入初始mapper/reducer任务管道处理阶段。(Mapper任务通常需要读取其中一部分输入记录并生成输出键值对给reducer;第二个reducer任务read前面评估器输出字节码映射子集与之相关联,注意写入不同单元)。
  5. Mapper 生成中间结果后,结果根据key排序并重新分配给下一级别stage管道里面去展开reducer工作,直至最终输出结果得到计算。
  6. 输出文件缺省有两个副本。

简单案例

需要注意的是此流程依赖于MapReduce执行模式。

  1. 准备工作

安装Hadoop集群,并将数据文件传输到HDFS中。

  1. 编写Mapper类

每个Mapper类负责解析输入并产生键/值对。在这个简单的案例中,我们已经将整个文件读入内存,并将其行进行拆分:

public class WordCountMapper extends Mapper<Object, Text, Text, IntWritable>{
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        String[] words = value.toString().split("\\s+");
        for(String w : words){
            word.set(w);
            context.write(word,one);
        }
    }
}
  1. 编写Reducer类

Reducer是这个案例中另一个关键部分。它接收自定义类型Text和Iterable作为输入,并生成相同类型的输出去避免发生huge memort hit以及I/O相关问题:

public class WordCountReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
   private TreeMap<Integer,List<String>> sortedMap;

   protected void setup(Context context) throws IOException,
       InterruptedException
      {
         sortedMap = new TreeMap<Integer,List<String>>(Collections.reverseOrder());
      }

     public void reduce(Text key , Iterable<IntWritable> values , Context
         context) throws IOException , InterruptedException{

          int sum = 0;
          for(IntWritable value : values){
              sum += value.get();
          }
          List<String> keys = sortedMap.get(sum);
          if(keys == null)
             keys = new ArrayList<String>();

         keys.add(key.toString());
         sortedMap.put(sum,keys);

      }

    protected void cleanup(Context context) throws IOException,
       InterruptedException
     {
        Set<Map.Entry<Integer,List<String>>> entrySet = sortedMap.entrySet();

        int counter = 0;
        for(Map.Entry<Integer,List<String>> entry : entrySet){

            Integer key = entry.getKey();
            List<String> values = entry.getValue();

            for(String val: values){
              if(counter++ == 10)
                  break;
                context.write(new Text(val), new IntWritable(key));
           }
       }
   }
}
  1. 配置作业并运行

配置Hadoop作业的驱动程序,它通过DelegatingMapper、IdentityReducer和LazyOutputFormat方法将输出写入HDFS。

在main()函数中设置作业以及传递输入/输出路径:

Job job=Job.getInstance(getConf(),"word count");
job.setJarByClass(WordCount.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);

job.setMapperClass(WordCountMapper.class);
//set combiner class reducer to optimize performance
job.setCombinerClass(WordCountReducer.class);
//num of reducers is set as one only here since output size is very small.
 job.setNumReduceTasks(1);

LazyOutputFormat.setOutputFormatClass(job,TextOutputFormat.class); //write directoy instead of file.

FileInputFormat.addInputPath(job,new Path(args[0]));
FileOutputFormat.setOutputPath(job,new Path(args[1]));

System.exit(job.waitForCompletion(true)? 0 : 1);
  1. 运行作业

将编译后的jar文件上传到Hadoop集群中,并执行以下命令来运行MapReduce作业:

hadoop jar wordcount.jar /input /output

这个简单的案例就完成了,它读入文本文件并计算出现频率最高的10个单词。


http://www.niftyadmin.cn/n/202891.html

相关文章

python案例之绝对领域全站图片采集(超级简单)

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 课程亮点: 1、系统性分析页面 2、多页面数据解析 3、海量图片数据保存 开发环境 & 第三方模块: 解释器版本 >>> python 3.8 代码编辑器 >>> pycharm 2021.2 requests >>> 主要用来发 …

std::move()注意点

前言 std::move()的原始语义&#xff0c;是将一个左值变为右值&#xff0c;它本身并不涉及到调用拷贝构造还是调用移动构造。不要有使用std::move()是为了调用移动构造函数这种错觉。比如在下面的例子中&#xff0c;使用std::move()只是为了将一个值从左值变为右值&#xff0c…

4.6日报

Java 基础 1. JDK 和 JRE 有什么区别&#xff1f; JDK&#xff1a;Java Development Kit 的简称&#xff0c;Java 开发工具包&#xff0c;提供了 Java 的开发环境和运行环境。 JRE&#xff1a;Java Runtime Environment 的简称&#xff0c;Java 运行环境&#xff0c;为 Java 的…

32位单片机MM32G0140免费申请样品及开发板

灵动微MM32G系列MCU搭载ArmCortex-M0或安谋科技“星辰”STAR-MC1处理器&#xff0c;率先推出的产品支持64KB到128KB Flash存储范围&#xff0c;提供从20脚到64脚封装选项&#xff0c;适用于广泛的智能工业与电机&#xff0c;物联网&#xff0c;智能家居和消费类等应用。其中&am…

一种常见的采购和费用管理流程

使用场景 提针对零售类公司企业、费用报销和资产招采、经营物资招采、合同招标等共用系统的场景。将业务拆解为申请、采购、入库 3大环节&#xff0c;为跨部门合规管理和 IT 运营提供了便利性。 典型用途&#xff1a;IT 人员监控全流程&#xff0c;各个业务部门按需操作自己的…

Nuxt3中的常用seo标签

title标签&#xff1a;主要是为了告诉搜索引擎我们的网站标题是什么&#xff0c;然后搜索引擎才会根据你提供的的title给你打上tag&#xff0c;用户在搜索的时候才会搜索到你。meta标签&#xff1a;这个标签根据name的不同有很多中&#xff0c;和SEO相关的主要是namedescriptio…

探索六西格玛在医疗行业的应用,提升医疗企业的市场竞争力

六西格玛是一种基于数据的管理方法&#xff0c;旨在通过对医疗流程和服务进行量化分析和改进&#xff0c;以优化医疗企业的运营和管理。它能够有效地解决医疗企业面临的各种问题和挑战&#xff0c;提高医疗服务的质量和效率&#xff0c;降低医疗成本和风险&#xff0c;增强医疗…

ios 基础开发

https://blog.csdn.net/bingjiewenqing/article/details/108908665 blockhttps://blog.csdn.net/bingjiewenqing/article/details/108904965 protocolhttps://blog.csdn.net/spicyshrimp/category_6790461.html ios基础开发 单例、网络、基本类型https://zhuanlan.zhihu.com/p/…