Hadoop:大数据处理的基石
随着信息化时代的来临,数据已成为现代社会最宝贵的资源之一。然而,随着数据的快速增长,如何有效地存储、处理和分析这些数据成为了一个亟待解决的问题。在这一背景下,Hadoop以其独特的分布式处理框架,成为了大数据处理领域的佼佼者。
一、Hadoop是什么?
Hadoop是一个由Apache基金会所开发的分布式系统基础架构,主要解决的是大数据存储和大数据处理的问题。它利用集群的威力进行高速运算和存储,使得用户可以在不了解分布式底层细节的情况下,开发分布式程序。Hadoop的核心是HDFS(Hadoop Distributed File System)和MapReduce编程模型。
二、HDFS:Hadoop的分布式文件系统
HDFS是Hadoop的核心组件之一,它是一个高度容错性的系统,适合部署在廉价的硬件上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS的设计理念是“一次写入,多次读取”,这意味着数据一旦被写入HDFS,就不应该被修改。这种设计简化了数据一致性和数据恢复的问题。
(1)HDFS架构如图:
NameNode
●NameNode用于存储元数据以及处理客户端发出的请求。
●在NameNode中存放元信息的文件是fsimage文件。
Secondary NameNode
●Secondary NameNode用于备份NameNode的数据。
DataNode
●DataNode是真正存储数据的地方。
(2)➢HDFS的优点:
高容错性
●HDFS.上传的数据自动保存多个副本,通过增加副本的数量增加HDFS的容错性。
如果某-一个副本丢失,那么HDFS将复制其他节点上的副本。
适合大规模数据的处理
●HDFS能够处理上百万的GB、TB甚至PB级别的数据,数量非常大。
流式数据访问
●HDFS以流式数据访问模式存储超大文件,有着“一次写入,多次读取”的特点,
文件一旦写入,不能修改,只能增加,以保证数据的一致性。
(3)➢HDFS的缺点
●不适合低延迟数据访问
●无法高效存储大量小文件
●不支持多用户写入及任意修改文件
三、MapReduce:Hadoop的编程模型
MapReduce是Hadoop的另一个核心组件,它是一个编程模型,用于大规模数据集(大于1TB)的并行运算。MapReduce将复杂的、运行于大规模集群上的并行计算过程高度地抽象到了两个函数:Map和Reduce。Map函数处理一个数据集合中的每个元素,并产生一个新的数据集合,而Reduce函数则处理Map函数输出的数据集合,并返回最终的结果。
(1)MapReduce工作原理
一个完整的MapReduce过程包含数据的输入与分片、Map阶段数据处理、Shuffle&Sort阶 段数据整合、Reduce阶段数据处理、数据输出等阶段。
读取输入数据
从HDFS分布式文件系统中读取的,根据所设置的分片大小对文件重新分片( Split)
Map阶段
数据将以键值对的形式被读入,键的值一般为每行首字符与文件最初始位置的偏移量,即中间所隔字符个数,值为该行的数据记录。
根据具体的需求对键值对进行处理,映射成新的键值对,将新的键值对传输至Reduce端。Shuffle&Sort阶段
将同一个Map中输出的键相同的数据先进行整合,减少传输的数据量,并且在整合后将数据按照键进行排序。
Reduce阶段
针对所有键相同的数据,对数据进行规约,形成新的键值对。
输出阶段
将数据文件输出至HDFS,输出的文件个数和Reduce的个数一致,如果只有一个Reduce,那么输出的只有一个数据文件,默认命名为“par-00000”。
四、Hadoop的生态系统
Hadoop不仅仅是一个独立的系统,它已经形成了一个庞大的生态系统。这个生态系统包括了许多其他与大数据处理相关的工具和框架,如HBase、Hive、Pig、Spark等。这些工具和框架与Hadoop相互补充,共同构建了一个完整的大数据处理解决方案。
(1)Hadoop生态系统中组件LOGO
➢HBase .
简介
●HBase是一个针对非结构化数据的可伸缩、高可靠、高性能、分布式和面向列的动态模式数据库。
●提供了对大规模数据的随机、实时读写访问。
●保存的数据可以使用MapReduce进行处理。
●将数据存储和并行计算很好地结合在一- 起。
应用场景
●大数据量(TB级数据)且有快速随机访问的需求,如淘宝交易记录等;
●及时响应用户的需求;:
●业务场景简单,不需要关系型数据库中的很多特殊操作,如交叉查询、连接查询等。
➢Hive
简介
●Hive是建立在Hadoop.上的数据仓库基础构架。
●提供了一系列的工具,可存储、查询和分析存储在Hadoop中的大规模数据。
●定义了一种类SQL语言为HQL (Hive Query Language) ,HQL语句在Hive的底层将被转换为复杂
的MapReduce程序,运行在Hadoop大数据平台上。
应用场景
●大数据集的批处理作业,如网络日志分析。
➢Pig
简介
●Pig是一个基于Hadoop的大规模数据分析框架。
●提供的类SQL语言为Pig Latin。Pig Latin语言的编译器会将类SQL的数据分析请求转换成一系 列经过
优化处理的MapReduce程序进行计算。
●支持的数据格式非常灵活,可以自由转化,并且在运算过程中用关系进行存储,减少了文件的输出。
应用场景
●对数据存储的要求较低,适用于非结构化的数据集,支持复合数据类型,如Map、 Tuple、 Bag等;
●支持常见的数据操作,如筛选、排序和连接;
●适用于日志数据的处理。雅虎和推特均采用了Pig处理数据。
➢Sqoop
简介
●Sqoop是一.款开源的工具。
●主要用于在Hadoop与关系型数据库(如MySQL、PostgreSQL等) 之间传输数据,可以将一一个关系
型数据库中的数据导入至Hadoop的HDFS中,也可以将HDFS的数据导出至关系型数据库中。
应用场景
●对于结构化数据库,采用Sqoop进行数据传输是合适的,可以实现结构化数据库中的数据并行批
量入库至HDFS进行存储。
➢Flume
简介
●Flume是Cloudera提供的一一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输系统。
●支持在日志系统中定制各类数据发送方,用于收集数据。
●可以对数据进行简单处理,并传输至各种数据接收方。
应用场景
●日志文件的采集。
➢Oozie
简介
●Oozie是基于Hadoop的调度器,编写xml格式的文件制定调度流程,可以调度MapReduce、Pig、
Hive、Shell等任务。
●当一个工作任务中需要调用几个任务时,一个任务完成再启动另一个是比较麻烦的,在这种情况
下即可使用Oozie将任务串联,通过Oozie调动整个任务进程。
➢ZooKeeper
简介
●ZooKeeper可解决分布式环境下的数据管理问题,如统一命名、 状态同步、集群管理、配置同步等。
●ZooKeeper的使用主要是为了保证集群各项功能正常进行,并在出现异常时能够及时通知处理,保
持数据一致性,是对整个集群的监控。
➢Mahout
简介
●Mahout的主要目标是创建--些可扩展的机器学习领域经典算法,旨在帮助开发人员更加方便快捷;
地创建智能应用程序。
●现已包含了聚类、分类、推荐(协同过滤)和关联规则等广泛使用的机器学习算法。
●除了算法外,Mahout还包含数据输入和输出的工具、与其他存储工具(如MySQL、 MongoDB等)
集成等支持架构。
应用场景
●通过提供机器学习算法包使得用户在使用的过程中能够直接通过调用算法包缩短编程时间,同时
也减少用户复杂的算法程序对资源的消耗。
五、Hadoop的应用场景
Hadoop的应用场景非常广泛,包括但不限于搜索引擎、日志分析、推荐系统、数据挖掘等。例如,搜索引擎需要处理海量的网页数据,Hadoop可以帮助它们快速地存储和索引这些数据;日志分析系统需要处理大量的用户行为数据,Hadoop可以帮助它们快速地提取出有价值的信息;推荐系统需要处理用户的个人信息和购买历史等数据,Hadoop可以帮助它们进行高效的机器学习算法训练。
六、代码实战
统计单词的数量:以下是文件里的全部内容 现在我们要对它进行相同单词的统计
(1)编写Mapper
public class WordCountMap extends Mapper<LongWritable, Text,Text, IntWritable>{
// 初始化输出值,outkey写入word, outvalue写入1
private Text outkey = new Text();
private IntWritable outvalue = new IntWritable(1);
// 输入map, 然后按回车, 自动补完下面这段
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text,Text, IntWritable>.Context context)
throws IOException,InterruptedException{
// super.map(key,value,context); 注释掉
// 1.获取一行 , 技巧: 输入value.toString(). v弹出var提示时 点回车补齐String XX = value.toString();
String line = value.toString();
// 2. 切割,元素把第一行是"a a a" 变成了:words = ["a","a","a"]
String[] words = line.split(" ");
// 3.循环输出,技巧:words.fo弹出for提示时,点击回车补齐循环体
for (String word : words) {
outkey.set(word);
// 使用context 把数据传给reduce
context.write(outkey,outvalue);
}
}
}
(2)编写reduce
public class WordCountReduce extends Reducer<Text, IntWritable,Text,IntWritable> {
private IntWritable outvalue = new IntWritable();
@Override
protected void reduce(Text key, Iterable<IntWritable> values,Reducer<Text, IntWritable,Text,IntWritable>.Context context)
throws IOException,InterruptedException{
// super.reduce(key, value ,context);
// aa, (1,1)
int sum = 0;
// 1. 累加
for (IntWritable value : values) {
sum += value.get();
}
outvalue.set(sum);
// 2. 输出
context.write(key,outvalue);
}
}
(3)编写Drive
public class WordCountDrive {
public static void main(String[] args) throws IOException,InterruptedException,ClassNotFoundException {
// 1.获取job
Configuration conf = new Configuration();
// Job job = Job.getInstance(conf);
Job job = Job.getInstance(conf);
// 2.设置jar 路径
job.setJarByClass(WordCountDrive.class);
// 3.关联mapper 和reducer
job.setMapperClass(WordCountMap.class);
job.setReducerClass(WordCountReduce.class);
// 4.设置map输出的key,value类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
// 5.设置输入路径和输出路径
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
// 6. 设置输入路径和输出路径
FileInputFormat.setInputPaths(job,new Path("test.txt"));//这里写你的原文件 也可以是绝对路径
FileOutputFormat.setOutputPath(job,new Path("output1112"));// 这里写的文件是在你保存的位置里是不能有存在相同的名称文件 也就是这个文件名是第一个也是唯一一个
// 7.提交job
boolean result = job.waitForCompletion(true);
System.exit(result ? 0:1);
}
}
(4)结果展示:可以看到我们的词汇都被统计出来了
七、结语
Hadoop作为大数据处理领域的佼佼者,已经得到了广泛的应用和认可。然而,随着技术的不断发展,Hadoop也面临着一些挑战和机遇。未来,我们期待Hadoop能够继续发展,为大数据处理领域带来更多的创新和突破。
Hadooop的环境配置
可参考这位博主的链接讲述的非常详细:
Hadoop环境搭建_hadoop搭建-CSDN博客https://blog.csdn.net/yi247630676/article/details/131409462?或者这位博主的包含(详细过程和安装包):