自从我开始接触Hadoop,这个大数据处理的开源框架,我的学习之路就充满了挑战与收获。Hadoop以其强大的数据处理能力和高度的可扩展性,成为了大数据领域的一颗璀璨明星。以下是我对Hadoop学习的一些心得和体会。
一、初识Hadoop
在开始学习Hadoop之前,我对大数据和分布式计算的概念还相对模糊。但随着对Hadoop的深入了解,我逐渐认识到它的重要性。Hadoop不仅仅是一个技术框架,更是一种处理大数据的思维方式。它通过将数据划分为多个小块,并在集群中的多个节点上并行处理,从而实现了对海量数据的快速处理。
二、学习过程中的挑战
在学习Hadoop的过程中,我遇到了很多挑战。首先,Hadoop的生态系统庞大而复杂,包括HDFS、MapReduce、YARN等多个组件,每个组件都有其独特的功能和用法。我需要花费大量的时间和精力去熟悉这些组件,并理解它们之间的相互作用。其次,Hadoop的配置和部署也是一个复杂的过程,需要仔细配置各种参数和环境变量,以确保集群的稳定运行。此外,Hadoop的编程模型MapReduce也具有一定的学习难度,需要掌握其编程范式和数据处理流程。
三、 hadoop的核心构架
Hadoop 由许多元素构成。其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。HDFS的上一层是MapReduce 引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心。
1.HDFS
对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。
2.NemeNode
NameNode 是一个通常在 HDFS 实例中的单独机器上运行的软件
3.DetaNode
DataNode 也是一个通常在 HDFS实例中的单独机器上运行的软件
四、MapReduce编程
现有以下数据,现要求统计本次月考各科目平均成绩
Map类
package task1;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
public class ScoreMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// 将文本行拆分为字段
String[] fields = value.toString().split(",");
// 获取课程和分数
String course = fields[1];
int score = Integer.parseInt(fields[2]);
// 发送课程和分数到Reduce阶段
context.write(new Text(course), new IntWritable(score));
}
}
Reduce类
package task1;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class ScoreReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
int count = 0;
// 遍历所有分数,求和并计数
for (IntWritable value : values) {
sum += value.get();
count++;
}
// 求平均数
int average = Math.round((float) sum / count); // 四舍五入到最接近的整数
// 输出键值对
context.write(key, new IntWritable(average));
}
}
main方法
package task1;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class ScoreAverage {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "Score Average");
job.setJarByClass(ScoreAverage.class);
job.setMapperClass(ScoreMapper.class);
job.setReducerClass(ScoreReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.setInputPaths(job,new Path("D:\\Hadoop课程\\代码\\begin\\Hadoop\\input\\subject_score.csv"));
FileOutputFormat.setOutputPath(job,new Path("D:\\Hadoop课程\\代码\\begin\\Hadoop\\output1\\avgcount"));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
输出结果
五、总结 学习心得
通过这一个学期的学习,我对hadoop的理解也多了很多,学习了很多东西这里我就写了很少的一部分。
可以讲Hadoop的核心内容看作是两个部分,一个是分布式存储,一个是分布式计算。
对于分布式存储,Hadoop有自己的一套系统来处理叫Hadoop distribution file system。为什么分布式存储需要一个额外的系统来处理呢,而不是就把1TB以上的文件分开存放就好了呢。如果不采用新的系统,我们存放的东西没办进行一个统一的管理。存放在A电脑的东西只能在连接到A去找,存在B的又得单独去B找。繁琐且不便于管理。而这个分布式存储文件系统能把这些文件分开存储的过程透明化,用户看不到文件是怎么存储在不同电脑上,看到的只是一个统一的管理界面。现在的云盘就是很好的给用户这种体验。
对于分布式计算。在对海量数据进行处理的时候,一台机器肯定也是不够用的。所以也需要考虑将将数据分在不同的机器上并行的进行计算,这样不经可以节省大量的硬件的I/O开销。也能够将加快计算的速度。Hadoop对分布式计算的系统为MapReduce。
Map即将数据分开存放进行计算,Reduce将分布计算的得到的结果进行整合,最后汇总得到一个最终的结果。这样对Hadoop的技术有一个清晰框架思路。