1. 系统概述
1.1 系统背景介绍
随着全球气候变化的日益严峻,气象数据的收集、处理和分析变得尤为重要。ISD-Lite数据集是由NOAA提供的,它包含了全球多个气象观测站的基本气象信息,如温度、湿度、气压、风速和风向等。这些数据对于研究气候变化、预测天气以及制定相关政策具有重要意义。
本项目旨在通过自动化脚本从NOAA的FTP服务器上爬取2024年的ISD-Lite气象数据,并对其进行处理和分析。爬取的数据将用于进一步的研究,以揭示气象要素之间的关系,提高天气预报的准确性,并为气候变化研究提供数据支持。
1.2 系统架构设计
本系统采用模块化设计,主要包括数据爬取、数据存储、数据处理和数据分析四个模块。
数据爬取模块:
-
- 使用wget命令通过FTP协议从NOAA的服务器上爬取指定时间范围内的ISD-Lite数据集。
- 设置合适的正则表达式(REGEX)以匹配需要下载的文件名,确保只下载2024年全年月份的数据。
- 将下载的数据保存到本地指定的目录(如data目录)中。
数据存储模块:
-
- 将爬取到的原始数据文件进行解压和整理,以便后续处理。
- 考虑使用Hive、HBase或MySQL等数据库系统来存储数据,以便进行高效的查询和分析。
- 设计合理的数据库表结构,以存储从原始数据中提取出的关键信息。
数据处理模块:
- 对存储的数据进行预处理,包括数据清洗、格式转换和缺失值处理等。
- 根据需求对数据进行聚合、汇总或计算衍生变量。
- 编写数据处理脚本,实现自动化处理流程。
数据分析模块:
- 使用 FineBI工具对处理后的数据进行统计分析、可视化展示和模型构建。
- 分析气象要素之间的相关性、趋势和异常值等。
- 根据分析结果撰写报告或制作图表,以直观展示数据特征和分析结果。
在系统实现过程中,还需要考虑数据的安全性、完整性和一致性等问题。同时,为了提高系统的可扩展性和可维护性,建议采用面向对象的编程思想进行模块化设计,并编写详细的文档和注释。
2.1 数据采集
利用wget下载源文件,获得2024年10月的气象数据,具体操作如下图所示
wget -D --accept-regex=REGEX -P data -r
-c ftp://ftp.ncdc.noaa.gov/pub/data/noaa/isd-lite/2019/5*
图2-1 wget下载源文件
切换到目的数据存储目录,通过ls命令查看已下载数据,具体数据如下图所示
图2-2 ls命令查看已下载数据
将数据归整在data.txt里
zcat 2019/*.gz > data.txt
上传到HDFS,查看uer/Hadoop/in 已存在data.txt,具体命令和结果如下图2-3 2-4所示
图2-3 上传hdfs
图2-4 查看hdfs 结果
2.2 数据初步分析
开始创建Hive表,具体命令如下图所示
图2-5 创建Hive表
加载数据到hive使用语句。
’LOAD DATA INPATH '/usr/hadoop/temperature/2024-12-17-23-08-22/part-r-00000' INTO TABLE temperaturee;’具体操作如下图2-6所示。
图2-6 加载数据到hive操作
查询明细表前5条数据, 具体如下图所示。
查询明细表前5条数据, 具体如下图所示。
图2-7 temperature数据查看
查询2024全年平均温度,四舍五入后处理结果为平均温度14度,显示结果如下图所示。
图2-8查询2024全年平均温度
查询2024全年高于平均温度的天数,查询结果为202天,显示结果如下如图所示。
图2-9查询2024全年高于平均温度的天
3. 数据预处理模块的设计与开发
3.1 Maven项目创建
1. 创建Maven项目 在 IDEA 创建一个名为 HadoopDataReport 的 Maven 项目,并且在项目中创建包 cn.itcast.hadoop,该包用于存放实现 MapReduce程序的相关类
图3-1 Maven项目结构
3.2 实现map阶段
1. 实现Map阶段 实现Map阶段需要用户自定义Mapper组件,在HadoopDataReport项目的 cn.itcast.hadoop包中创建用于自定义Mapper组件的类WeatherMapper,在该类中编写数据预处 理的相关代码,具体如图2-1所示。
图3-2 WeatherMapper包
这个WeatherMapper类是一个Hadoop MapReduce的Mapper实现,专门用于处理天气数据。它继承自Mapper<LongWritable, Text, Text, Text>,这意味着它接收的输入键(Key)类型是LongWritable(通常代表文件偏移量),输入值(Value)类型是Text(代表文件中的一行文本),并且它输出的键和值类型也都是Text。这个Mapper实现了以下功能:
- 解析天气数据行:输入的每一行文本(Text类型的value)被假定为包含天气数据的字符串。这个字符串被按空格分割成字段(fields数组),其中每个字段代表不同的数据(如日期、时间、气温等)。
- 验证数据完整性:Mapper首先检查每行数据是否至少包含5个字段(日期、时间、可能的其他字段、气温)。如果数据不完整(字段数少于5),则忽略该行。
- 提取日期和气温:如果数据完整,Mapper从字段中提取日期(fields[0], fields[1], fields[2])和气温(fields[4])。日期字段被格式化为YYYY-MM-DD的形式,并存储在dateKey中。
- 处理气温数据:气温数据(tempRaw)被假定为一个长整型(long)值。Mapper检查这个值是否不等于MISSING(即-9999L),这是一个标记,表示气温数据缺失或无效。如果气温数据有效,Mapper将其除以一个缩放因子(SCALE_FACTOR,这里是10),将结果转换为整数,并存储在tempValue中。这个步骤可能是为了将气温数据从某种测量单位转换为更常用的单位(例如,从十分之一度转换为度)。
- 输出键值对:对于每个有效的日期和气温对,Mapper将它们作为键值对输出。键是格式化后的日期(dateKey),值是转换后的气温(tempValue)。这些键值对被写入到MapReduce作业的下一个阶段(通常是Reducer阶段)进行进一步处理。
3.3. 实现Reduce阶段
图3-3 WeatherReducer包
这个WeatherReducer类是一个Hadoop MapReduce的Reducer实现,专门用于处理从Mapper阶段接收到的天气气温数据。它继承自Reducer<Text, Text, Text, Text>,意味着它接收的输入键(Key)和值(Value)类型都是Text,并且它输出的键和值类型也都是Text。这个Reducer实现了以下功能:
- 初始化统计变量:在reduce方法开始时,Reducer初始化了四个变量来跟踪气温的统计信息:minTemp(最低气温,初始化为Integer.MAX_VALUE),maxTemp(最高气温,初始化为Integer.MIN_VALUE),totalTemp(气温总和,初始化为0),以及count(气温值的数量,初始化为0)。
- 遍历气温值:对于与给定键(日期)相关联的所有气温值(Iterable<Text> values),Reducer遍历它们,将每个值从Text类型转换为int类型的气温值。
- 计算统计信息:在遍历过程中,Reducer更新最低气温、最高气温、气温总和以及气温值的数量。
- 计算平均气温:一旦遍历完成,Reducer使用气温总和除以气温值的数量来计算平均气温。
- 格式化结果:Reducer将最低气温、最高气温和平均气温格式化为一个字符串,其中气温值之间用制表符(\t)分隔,并且平均气温保留两位小数。
- 输出结果:最后,Reducer将格式化后的结果字符串作为值,与当前的键(日期)一起输出。这个键值对被写入到MapReduce作业的输出中,通常是一个HDFS文件或本地文件系统中。
3.4. 实现驱动类
图3-4 WeatherDriver包
这个WeatherDriver类是一个Hadoop MapReduce作业的驱动程序,它负责配置和启动整个作业。具体来说,它实现了以下功能:
- 日期格式化:首先,它创建了一个DateFormat对象(使用SimpleDateFormat),用于将当前日期和时间格式化为字符串。这个格式化后的日期和时间字符串稍后将用于为输出目录命名。
- 配置作业:接着,它创建了一个Configuration对象,这是Hadoop配置的核心,用于设置作业的各种参数。然后,它基于这个配置创建了一个Job对象,这是MapReduce作业的代表。
- 设置作业属性:
- 作业名称:通过job.setJobName("Weather Analysis")设置了作业的名称为“Weather Analysis”。
- JAR文件:通过job.setJarByClass(WeatherDriver.class)指定了包含作业所需的类和资源的JAR文件。Hadoop将基于这个JAR文件来运行作业。
- Mapper类:通过job.setMapperClass(WeatherMapper.class)指定了Mapper类为WeatherMapper。
- Reducer类:通过job.setReducerClass(WeatherReducer.class)指定了Reducer类为WeatherReducer。
- 输出键值类型:通过job.setOutputKeyClass(Text.class)和job.setOutputValueClass(Text.class)指定了输出键和值的类型为Text。
- 设置输入输出路径:
- 输入路径:通过FileInputFormat.setInputPaths(job, new Path("/usr/hadoop/in"))设置了输入数据的HDFS路径为/usr/hadoop/in。
- 输出路径:通过FileOutputFormat.setOutputPath(job, new Path("/usr/hadoop/temperature/" + date))设置了输出数据的HDFS路径。这个路径是基于前面格式化的当前日期和时间字符串动态生成的,确保了每次运行作业时输出目录都是唯一的。
- 启动作业:最后,通过调用job.waitForCompletion(true)启动作业,并等待它完成。这个调用会阻塞当前线程,直到作业完成或失败。如果作业成功完成,waitForCompletion方法将返回true;如果作业失败,它将返回false。
- 退出程序:根据作业的完成状态,程序将通过System.exit(result ? 0 : 1)正常退出(如果作业成功)或异常退出(如果作业失败)。
3.5将 MapReduce 程序封装jar文件
在IDEA的右侧单击“Maven”,在弹出的Maven窗口依次单击“HadoopDataReport” →“Lifecycle”,在 Lifecycle 折叠框中双击“package”选项将Maven项目HadoopDataReport 封装为jar文件。将包含HadoopDataReport项目依赖的jar文件提交到YARN集群执行, 为了便于后续使用,这里将jar文件重命名为WeatherMapReduce。
图3-6 生成jar包
上传jar 文件 将WeatherMapReduce.jar 文件上传到虚拟机Hadoop1的/export/data 目录。测试jar 文件 确保Hadoop集群处于启动状态下运行WeatherMapReduce.jar,在虚拟机Hadoop1的/export/data目录 执行如下命令。
运行jar包,具体命令如下图所示
图3-5 运行WeatherMapReduce.jar
上述命令执行完成后,会根据MapReduce程序在虚拟机Hadoop1执行时的系统日期和 时间,在HDFS的/usr/hadoop/temperature 目录下生成对应的目录,该目录中存放了MapReduce程序 的处理结果,查看具体结果如下图所示
图3-7 查看具体结果
4数据仓库的设计与开发
4.1 数据库设计
数据仓库开发主要是通过Hive构建数据仓库,通过数据仓库中的表来存储与需求分析 相关的数据,
针对此次网站流量日志数据分析系统,需要在Hive数据仓库中创建数据仓库层对应的总表data明细表 temperature、业务表 daily_max_temp 和 业务表 daily_min_temp和daily_avg_temp,具体介绍如下。
总表data存在于hdfs上,其作用是存储元数据,提供通过MapReduce程序进行数据预处理。如图4.1所示
字段 | 数据类型 | 描述 |
observation_year | INT | 观测年份 |
observation_month | INT | 观测月份 |
observation_day | INT | 观测日期 |
observation_hour | INT | 观测小时 |
air_temperature | FLOAT | 空气温度 |
dew_point | FLOAT | 露点温度 |
sea_level_pressure | FLOAT | 海平面压力 |
wind_direction | INT | 风向 |
wind_speed | FLOAT | 风速 |
sky_condition | INT | 天空状况 |
图4-1 data总表的结构
这里我只用前5个字段,任务是统计每日最高温度、最低温度、平均温度,
明细表temperature存在于数据仓库层的明细层,其做用是存储通过MapReduce程序进 行数据预处理之后的数据,
字 段 | 数据类型 | 描 述 |
t_date | STRING | 记录温度的日期 |
t_max | DOUBLE | 当日最高温度 |
t_min | DOUBLE | 当日最低温度 |
t_avg | DOUBLE | 当日平均温度 |
图4-2temperature明细表的结构
4.2 数据库的创建准备
CREATE TABLE temperature ( t_date STRING, t_max DOUBLE, t_min DOUBLE, t_avg DOUBLE ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; |
创建明细表HIVE.temperature
创建业务表(每日最高温度分析),基于总表temperature表统计数据,创建业务表daily_max_temp。
具体sql语句如下图4-3所示
图4-3 hive业务表创建
基于总表temperature表统计数据,创建业务表daily_avg_temp。
图4-4 hive业务表创建
基于总表temperature表统计数据,创建业务表daily_min_temp,具体操作语句如下如所示。
图4-5 hive业务表创建
5. 数据分析模块的设计与开发
根据前期准备,weather 是数据库名称,而 temperature 是已经存在于该数据库中的一个表,用于存储温度数据。数据仓库构建完成后,户便可以使用HiveQL语句进行数据分析。本项目主要针对每日最高温度分析、每日最低温度分析和每日平均温度分析这三个需求进行分析,
5.1. 每日最高温度分析
基于总表temperature表统计数据,并将统计结果插入到业务表daily_max_temp
图5-1 统计结果插入到业务表daily_max_temp
最后,查询业务表中的数据以验证结果,具体查询结果如下图所示
图5-2 验证结果
5.2每日平均温度分析
基于总表temperature表统计数据,并将统计结果插入到业务表daily_avg_temp,具体命令如图5-3所示
图5-3 统计结果插入到业务表daily_avg _temp
显示导入成功,查看询业务表中的前五条数据以验证结果,具体如下图所示
图5-4 验证结果
5.3每日最低温度分析
基于总表temperature表统计数据,并将统计结果插入到业务表daily_min_temp,具体命令如图5-5所示
图5-5 验证结果
显示导入成功,查看询业务表中的前五条数据以验证结果,具体数据如图5-6所示
图5-6验证结果
6. 数据导出模块的设计与开发
Mysq建表建库准备工作,具体操作语句如下如所示。
图6-1MYSQL创表
为了方便后续进行数据可视化,使用Sqoop将Hive数据仓库中业务表的数据导出到MySQL的数据表temperature,具体操作步骤如下。如图示
图6-2 6-3 Sqoop导出数据操作
在MySQL中执行SELECT * FROM weather.temperature; 查询数据表统计结果如下
图6-4 SELECT * FROM weather.temperature; 查询数据表统计结果如下
数据可视化是指将数据或信息表示为图形中的可视对象来传达数据或信息的技术,目的 是清晰有效地向用户传达信息,以便用户可以轻松了解数据或信息中的复杂关系。用户可以通过图形中的可视对象直观地看到数据分析结果,从而更容易理解业务变化趋势或发现新的 业务模式。数据可视化是数据分析中的一个重要步骤。本项目使用FineBI 工具实现数据可视化。
-
7.1 每日平均温度数据图
2024年每日平均气温数据可视化组件如下图所示
图7-1 每日平均温度数据可视化组件
7.2每日最高温度数据图
2024年每日最高气温数据可视化组件如下图所示
图7-2 每日最高温度数据可视化组件
-
- 每日最低温度数据图
-
2024年每日最低气温数据可视化组件如下图所示
图7-3 每日最低温度数据可视化组件
-
- 热力图
-
2024年热力数据可视化组件如下图所示
图7-4 热力图数据可视化组件
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.youkuaiyun.com/qq_39410381/article/details/106367411 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.youkuaiyun.com/qq_39410381/article/details/106367411
以上仅为二创,修改了mapreduce代码部分。