Hadoop-02 基于Hadoop的JavaEE数据可视化简易案例

需求

1.统计音乐点播次数

2.使用echarts柱状图显示每首音乐的点播次数

项目结构

创建JavaEE项目

统计播放次数Job关键代码

package com.etc.mc;

import java.io.IOException;
import java.util.HashMap;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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 MusicCount {

	//定义保存统计数据结果的map集合
	public static HashMap<String, Integer> map=new HashMap<String, Integer>();

	public static class MusicMapper extends Mapper<Object, Text, Text, IntWritable> {

		public void map(Object key, Text value, Context context) throws IOException, InterruptedException {

			IntWritable valueOut = new IntWritable(1);
			String keyInStr = value.toString();
			String[] keyInStrArr = keyInStr.split("\t");// 使用\t将输入 文本行转换为字符串
			String keyOut = keyInStrArr[0];// 获取歌曲名称
			context.write(new Text(keyOut), valueOut);
		}
	}

	public static class MusicReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
		private IntWritable result = new IntWritable();

		public void reduce(Text key, Iterable<IntWritable> values, Context context)
				throws IOException, InterruptedException {
			int sum = 0;
			for (IntWritable val : values) {
				sum += val.get();
			}
			result.set(sum);
			context.write(key, result);//统计数据保存到hdfs文件
			map.put(key.toString(), sum);//将统计结果保存到map集合
		}
	}

	public static HashMap<String, Integer> main() throws Exception {
		Configuration conf = new Configuration();
		conf.addResource("core-site.xml");// 读取项目中hdfs配置信息
		conf.addResource("mapred-site.xml");// 读取项目中mapreduce配置信息
		// 实例化作业
		Job job = Job.getInstance(conf, "music_count");
		// 指定jar的class
		job.setJarByClass(MusicCount.class);
		// 指定Mapper
		job.setMapperClass(MusicMapper.class);
		// 压缩数据
		job.setCombinerClass(MusicReducer.class);// 减少datanode,TaskTracker之间数据传输
		// 指定reducer
		job.setReducerClass(MusicReducer.class);
		// 设置输出key数据类型
		job.setOutputKeyClass(Text.class);
		// 设置输出Value数据类型
		job.setOutputValueClass(IntWritable.class);
		// 设置输入文件路径
		FileInputFormat.addInputPath(job, new Path("hdfs://192.168.137.131:9000/music/music1.txt"));
		FileInputFormat.addInputPath(job, new Path("hdfs://192.168.137.131:9000/music/music2.txt"));
		FileInputFormat.addInputPath(job, new Path("hdfs://192.168.137.131:9000/music/music3.txt"));
		FileInputFormat.addInputPath(job, new Path("hdfs://192.168.137.131:9000/music/music4.txt"));
		//设置输出文件路径
		FileSystem fs=FileSystem.get(conf);
		Path path=new Path("hdfs://192.168.137.131:9000/musicout");
		if(fs.exists(path)) {
			fs.delete(path,true);
		}
		FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.137.131:9000/musicout"));
		if(job.waitForCompletion(true)) {
			return map;
		}else {
			return null;
		}

	}
}

  

Servlet关键代码

package com.etc.action;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alibaba.fastjson.JSON;
import com.etc.mc.MusicCount;

/**向客户端提供json数据*/
@WebServlet("/CountServlet")
public class CountServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//post乱码处理
		request.setCharacterEncoding("utf-8");
		// 设置响应数据类型
		response.setContentType("text/html");
		// 设置响应编码格式
		response.setCharacterEncoding("utf-8");
		// 获取out对象
		PrintWriter out = response.getWriter();
		//组织json数据
		HashMap<String, Integer> map=null;

		try {
			map=MusicCount.main();
		} catch (Exception e) {
			System.out.println("获取数据出错");
		}

		//通过构建map集合转换为嵌套json格式数据
		HashMap jsonmap = new HashMap();
		jsonmap.put("mytitle","歌词播放统计");
		jsonmap.put("mylegend", "点播");
		jsonmap.put("prolist", map);

		String str =JSON.toJSONString(jsonmap);			

		out.print(str);
		out.flush();
		out.close();

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

  

视图index.jsp关键代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>金融大数据解析</title>
<!-- 引入 echarts.js -->
<script src="script/echarts.min.js"></script>
<!-- 引入 jquery.js -->
<script src="script/jquery-1.8.3.min.js"></script>
</head>

<body>
	<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
	<div id="main" style="width: 600px; height: 400px;"></div>

	<script type="text/javascript">
		//显示柱状图函数
		function showdata(mytitle, mylegend, xdata, ydata) {
			// 基于准备好的dom,初始化echarts实例
			var myChart = echarts.init(document.getElementById(‘main‘));
			// 指定图表的配置项和数据
			var option = {
				title : {
					text : mytitle
				},
				tooltip : {},
				legend : {
					data : mylegend
				},
				xAxis : {
					data : xdata
				},
				yAxis : {},
				series : [ {
					name : ‘点播‘,
					type : ‘bar‘,
					data : ydata
				} ]
			};
			// 使用刚指定的配置项和数据显示图表。
			myChart.setOption(option);
		}

		$(function() {
			var mytitle;
			var mylegend;
			var xdata=new Array();
			var ydata=new Array();		

			$.getJSON("CountServlet", function(data) {
				mytitle = data.mytitle;
				mylegend = data.mylegend;
				//获取x轴数据
				$.each(data.prolist, function(i, n) {
					xdata.push(i);
				});
				//获取y轴数据
				$.each(data.prolist, function(i, n) {
					ydata.push(n);
				});

				//执行函数
				showdata(mytitle, [ mylegend ], xdata, ydata);
			});

		});
	</script>
</body>

</html>

  

运行结果

项目所需jar列表

总结

1.该案例的缺点是什么?每次访问数据需要提交job到hadoop集群运行,性能低。

2.数据分析结果保存在HDFS和集合中,不适合分析结果为大数据集合。

3.如何改进?使用HBase存储解析后的数据集,构建离线分析和即时查询大数据分析平台。

原文地址:https://www.cnblogs.com/rask/p/11130921.html

时间: 2024-08-29 19:26:41

Hadoop-02 基于Hadoop的JavaEE数据可视化简易案例的相关文章

快速基于echarts的大数据可视化

[Author]: kwu 快速基于echarts的大数据可视化,echarts纯粹的js实现的图表工具,快速开发的步骤如下: 1.引入echarts的依赖js库 <script type="text/javascript" src="js/esl/esl.js"></script> <script type="text/javascript" src="js/echarts.js"><

基于javascript的简单数据可视化:DVisual

也是好久没更新博客了,主要是之前都是学到了新东西新算法就写篇博客总结一下,去年也是到处实习了一段时间,没有太多时间去吃透大部头,所以也就好久没有更新了. 最近看了不少数据可视化的书,所以也就顺理成章想做点东西,同时准备把『数据可视化套件开发』这个作为毕业设计搞一搞,花了一两周写了一个DVisual出来,目前倒是只支持一些基本的图表绘制,后面可能会加入一些比较炫酷的图标,以及鼠标操作等功能吧. 当然如果你想在在html上绘制简单图表,并且没有其它特殊要求的话,现在也是可以试用一下的,本文就简单用中

基于echarts组件制作数据可视化大屏

什么是数据可视化:数据可视化主要旨在借助于图形化手段,清晰有效地传达与沟通信息.在实际工作中,数据分析能够帮助管理者进行判断和决策,以便采取适当策略与行动. 数据可视化分析有什么作用:1.现状分析告诉你过去发生了什么,告诉你企业现阶段的整体运营情况,通过各个经营指标的完成情况来衡量企业的运营状态,以说明企业整体运营是更好了还是坏了,好的程度是如何,坏的程度又到哪里. 2.原因分析告诉你某一现状为什么发生,经过第一阶段的现状分析,我们对企业的运营情况有了一个基本的了解,但是不知道运营情况具体好在哪

hadoop三----基于hadoop伪分布式整合hive和hbase

hadoop的生态圈: ETL 数据的抽取.转换.加载 1)安装hive 1.解压   # tar zvxf hive-0.13.0.tar.gz -C /usr/local   # cd /usr/local   # ln -sv  /usr/local/hive-0.12.0 /usr/local/hive 2.替换jar包,保持hbase0.98与hadoop1.2一致   # cd /usr/hive/lib   # rm -rf hbase-0.94*   # find /usr/hb

pgspider基于pg 的高性能数据可视化sql 集群引擎

pgspider 是在pg 源码中直接打的patch,增强了FDW 的功能 执行的特性 多租户 并行处理 数据下推 说明 pgspider 是一个很不错的扩展,目前官方已经支持了sqlite,mysql,influxdb 等数据库 参考资料 https://github.com/pgspider/pgspider 原文地址:https://www.cnblogs.com/rongfengliang/p/12260801.html

基于Hadoop生态圈的数据仓库实践 —— 概述(二)

二.在Hadoop上实现数据仓库 (大部分翻译自<Big Data Warehousing>) 数据仓库技术出现很长时间了,现在为什么要从传统数据库工具转为使用Hadoop呢?答案就是最引人关注的流行词汇 -- 大数据.对许多组织来说,传统关系数据库已经不能够经济地处理他们所面临的数据量.而Hadoop生态圈就是为了能够廉价处理大量数据的目的应运而生的.下面看看大数据是怎么定义的. 1. 大数据的定义 虽然数据仓库技术自诞生之日起的二十多年里一直被用来处理大数据,但"大数据"

《基于Vue的数据可视化系统的设计与实现》文献阅读(十四)

一.基本信息 标题:基于Vue的数据可视化系统的设计与实现 时间:2018 来源:华中科技大学 关键词:数据可视化:数据可视化工具:探索式分析:Vue 二.研究内容 1.主要内容: 1.1 研究背景与意义随着互联网技术与信息化进程的高速发展,不管是传统行业还是互联网企业其信息化与数字化的进程不断加快,产生数据的速度及数据量也在飞速上升,这些数据中通常蕴含着大量对企业有价值的信息,如何从这些数据中发掘有价值的信息成为企业迫切需求.为了使企业更加方便有效的利用这些数据,可视化系统应运而生.数据可视化

企业如何开展数据可视化建设

有关数据,我们知道,不加以处理运用就会沉淀在系统中,很难成为信息.信息如果得不到利用,就不能成为资源. 在市场竞争激烈.变数不定的大环境下,越来越多的企业意识到信息资源的重要性.信息,无论是来自企业内部还是市场外部,都能帮助企业在现有资源上提高运营效率,分析挖掘辅助决策的策略,做出符合行情的战略规划. 关于企业的数据可视化建设,这里分享一个大连华锐重工的案例,原文是大连华锐重工企业管理部副部长毕建林在帆软大数据可视化分析案例巡展上的演讲. 系统独立,数据利用率低 华锐重工从2001年进行信息化建

超级好用的 Java 数据可视化库:Tablesaw

本文适合刚学习完 Java 语言基础的人群,跟着本文可了解和使用 Tablesaw 项目.示例均在 Windows 操作系统下演示 本文作者:HelloGitHub-秦人 HelloGitHub 推出的<讲解开源项目>系列,今天给大家带来一款基于 Java 语言的数据可视化库开源项目--Tablesaw Tablesaw是一款 Java 的数据可视化库.它主要包括两部分:一部分是数据解析库,另一部分是数据可视化库.数据解析库主要是加载数据,对数据进行操作(转化,过滤,汇总等).数据可视化库就是