文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

一文带你了解大数据基石-Hadoop

2024-11-29 22:45

关注

当前的互联网的时代,信息爆炸的年代,抓住了风口那么距离成功也就走了一半啦!这个风口如何抓住我不知道,但是如何分析用户的喜好以及其他行为却是唾手可得的,用户的行为如何存储如何分析就是本文的下面要讲的知识点。

那么为什么要用到本文提到的hadoop组件,这里啰嗦两句,因为信息爆炸必然会带来海量的数据,那么单机服务器势必会造成存储以及计算瓶颈,那么hadoop组件就是在做这两件事情的。

基于存储以及计算hadoop量大两大功能模块-分布式存储HDFS以及分布式计算MapReduce,下面分别针对这两大功能模块详细介绍。

hadoop之分布式存储HDFS

首先呢,这个HDFS的设计灵感来自google的GFS论文,设计的目的 就是应付海量的数据存储(PB|TB)

HDFS有如下特点:

HDFS是一个主从(Master/Slaves)架构,由一个NameNode和一些DataNode组成,下图是HDFS架构:

HDFS 架构图

从上图看NameNode节点存储所有文件的与数据信息以及地址信息充当着目录索引的作用,SecondaryNameNode 节点则可以认为是NameNode的预备节点,DataNode节点则负责着文件以及文件副本的保存,正是有着副本以及Secondary NameNode节点的存在,保障了整个系统的高可用,下面则有一个简单的连接HDFS的例子。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class HdfsExample {
  
  public static void main(String[] args) {
    try {
      // 创建Hadoop配置对象
      Configuration conf = new Configuration();
      
      // 获取Hadoop文件系统实例
      FileSystem fs = FileSystem.get(conf);
      
      // 定义要操作的文件路径
      String hdfsPath = "/user/hadoop/sample.txt";
      Path path = new Path(hdfsPath);
      
      // 检查文件是否存在
      boolean exists = fs.exists(path);
      System.out.println("文件是否存在:" + exists);
      
      // 在HDFS上创建一个新文件
      if (!exists) {
        OutputStream os = fs.create(path);
        System.out.println("文件创建成功");
        os.close();
      }
      
      // 将本地文件上传到HDFS
      String localFilePath = "/path/to/local/file.txt";
      Path localPath = new Path(localFilePath);
      fs.copyFromLocalFile(localPath, path);
      System.out.println("文件上传成功");
      
      // 从HDFS中读取文件内容
      InputStream is = fs.open(path);
      byte[] buffer = new byte[1024];
      int bytesRead = is.read(buffer);
      while (bytesRead > 0) {
        System.out.println(new String(buffer, 0, bytesRead));
        bytesRead = is.read(buffer);
      }
      is.close();
      
      // 删除HDFS上的文件
      boolean deleted = fs.delete(path, false);
      System.out.println("文件是否删除成功:" + deleted);
      
      // 关闭Hadoop文件系统实例
      fs.close();
      
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

hadoop之分布式计算之MapReduce

此功能的灵感同样是来自google的同名论文(牛逼的永远是写论文的呀)。

此功能模块的牛逼之处就在于它的编程思想,那么就已worldcount实例简单讲下。

假设现在有两个文件,数据如下,假如我们要读取文件中的数据进行wordcount统计,那么需要进 行如下步骤。

以上过程演示的就是MapReduce处理数据的大体流程,MapReduce模型由两个主要阶段组成: Map阶段和Reduce阶段:


Map阶段:

在Map阶段中,输入数据被分割成若干个独立的块,并由多个Mapper任务并行处理,每个Mapper 任务都会执行用户定义的map函数,将输入数据转换成一系列键-值对的形式(Key-Value Pairs), 这些键-值对被中间存储,以供Reduce阶段使用。 Map阶段主要是对数据进行映射变换,读取一条数据可以返回一条或者多条K,V格式数据。

Reduce阶段:

在Reduce阶段中,所有具有相同键的键-值对会被分配到同一个Reducer任务上,Reducer任务会执 行用户定义的reduce函数,对相同键的值进行聚合、汇总或其他操作,生成最终的输出结果, Reduce阶段也可以由多个Reduce Task并行执行。 Reduce阶段主要对相同key的数据进行聚合,最终对相同key的数据生成一个结果,最终写出到磁盘 文件中。

下面就是一個简单的MapReduce代码示例:

import java.io.IOException;
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;

public class WordCount {
  
  public static class TokenizerMapper extends Mapper{
    
    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 {
      StringTokenizer itr = new StringTokenizer(value.toString());
      while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        context.write(word, one);
      }
    }
  }
  
  public static class IntSumReducer extends Reducer {
    private IntWritable result = new IntWritable();
    
    public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
      }
      result.set(sum);
      context.write(key, result);
    }
  }
  
  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = Job.getInstance(conf, "word count");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}
本文到此就结束了,当然hadoop肯定不止这样简单的内容,感兴趣的小伙伴可以到apache官网学习下,毕竟这个是大厂大数据必会的东西。
来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯