(java语言版) spark+hive+hbase 离线大数据分析统计及运行效率实验

首先介绍一下我做实验的前提,我的数据都是存在Hbase中的,现在我的需求是要对Hbase中的数据进行大数据分析。

这里有一个前提条件,我的Hbase里的数据都是String类型,这个时候就存在一个Hbase排序的问题。因为hbase是根据ascii码进行字典排序,那么比如说:速度这种数字类型的字段,我保存成String以后,速度20,实际上比速度3小。不理解的可以自己去百度Hbase的数据排序规则。由于这个原因,如果我想查询速度<20的全部数据有一些困难,而且只用Hbase的scan进行查询效率也很慢。因此需要用到其他的大数据技术来满足我的需求。

以下我做的实验有很多,目的是找到一个快速的大数据分析方案,目前的阶段,我只需要生成报表,而不进行数据导出。

当然最终的方案是使用spark进行大数据分析,毕竟这是目前的主流技术。

首先介绍下我的实验环境,我这里是用3台机器搭建的最小集群,实习的生产环境至少比我的测试环境快10倍以上,当然现阶段不可能在生产环境上测试效率。我这里用的是linux centos6.5虚拟机,16G内存,8核CPU。

集群版本:我这里用的是HDP的Ambari集成的环境,说下我用到的技术的版本,因为版本不同,代码写法和注意事项也不一样,跟我环境不一样的只能进行参考。

HDFS 2.7.1.2.4

MapReduce2 2.7.1.2.4

YARN 2.7.1.2.4

Hive 1.2.1.2.4

HBase 1.1.2.2.4

Spark 1.6.0.2.4

这里首先我初始化了1000万条数据,作为数据集。

实验一:  Hive与HBase结合

Hive可以解决HBase排序问题。因为有必须使用HBase这个前提,所以我创建的是 EXTERNAL  表,即Hive的外部表。具体创建Hive表语句参考我的另外一个帖子,地址如下:

https://blog.csdn.net/lwb314/article/details/80346993

我这里做的实验是查询SOC字段<20;

首先是hive,代码如下

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;

public class HiveTest2 {

	/*
	 * 之前网上有个错误的例子,加载路径是org.apache.hadoop.hive.jdbc.HiveDriver,多了一个hadoop,应该是比较老的版本的
	 * 我用的hive版本是1.2.1
	 */
	private static String driverName = "org.apache.hive.jdbc.HiveDriver";

	public static void main(String[] args) {
		try {
			Class.forName(driverName);
			Connection con = null;
			con = DriverManager.getConnection("jdbc:hive2://10.10.171.169:10000", "hive", "hive");// 之前是jdbc:hive:可能也是老版本的写法
			Statement stmt = con.createStatement();
			ResultSet res = null;
			// String sql =
			// "select * from lwb_test1 where vin = 'LBVHY1101JMK00005' and soc<10 limit 10";
			String sql = " select count(1) from lwb_test1 where soc<20";
			System.out.println("");
			System.out.println("Running: " + sql);
			long startTime = System.currentTimeMillis();
			res = stmt.executeQuery(sql);
//			ResultSetMetaData rsm = res.getMetaData(); // 获取列名
//			for (int i = 0; i < rsm.getColumnCount(); i++) {
//				System.out.print(rsm.getColumnName(i + 1).split("\\.")[1] + "\t");//输出列名
//			}
			System.out.println();
			long k = 0;
			while (res.next()) {
				k++;
				//System.out.println(res.getString(1));
//				System.out.println(res.getString(1) + "\t" + res.getString(2) + "\t" + res.getInt(3) + "\t" + res.getInt(4) + "\t"
//						+res.getString(5) + "\t" + res.getString(6) );
			}
			long endTime = System.currentTimeMillis();
			System.out.println("用时:" + (endTime - startTime));
			System.out.println("总共条数:" + k);
			stmt.close();
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("error");
		}

	}

}

结果:

Running:  select count(1) from lwb_test1 where soc<20

记录条数:2001000
用时:50430

这里是从hive的1000万数据条数据里查询出来200万条的数量,条件查询,用时50秒。这是count

我把语句修改成如下,查询全部字段进行遍历

select * from lwb_test1 where soc<23然后屏蔽上循环里的打印语句,打印会降低执行效率

程序执行结果如下:

Running:  select * from lwb_test1 where soc<22
用时:160525
总共条数:2201156

以下是我的HBase查询代码

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.NavigableMap;
import java.util.Map.Entry;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.util.Bytes;


public class SocScan {

	public static Configuration configuration;
	public static String zkHost = "devhadoop3,devhadoop2,devhadoop1";
	public static String zkPort = "2181";
	public static String zkParent = "/hbase-unsecure";
	private static Connection connection;

	static {
		configuration = HBaseConfiguration.create();
		configuration.set("hbase.zookeeper.quorum", zkHost);
		configuration.set("hbase.zookeeper.property.clientPort", zkPort);
		configuration.set("zookeeper.znode.parent", zkParent);
		try {
			connection = ConnectionFactory.createConnection(configuration);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) throws Exception {
		try {

			Table table = connection.getTable(TableName.valueOf("lwb_test1"));
			Scan scan = new Scan();
			// scan.setStartRow(start.getBytes());
			// scan.setStopRow(stop.getBytes());
			// scan.setReversed(true);//
			// 倒序,倒序时候的开始结束rowkey也得反过来,例如不设置之前start是1,stop是3,那么设置之后start是3,stop是1
			Filter filter = new SingleColumnValueFilter("data".getBytes(), "soc".getBytes(), CompareOp.LESS, "29".getBytes());
			scan.setFilter(filter);
			scan.setCaching(1000);
			scan.setCacheBlocks(false);
			long startTime = System.currentTimeMillis();
			ResultScanner scanner = table.getScanner(scan);
			byte[] vin = "vin".getBytes();
			byte[] soc = "soc".getBytes();
			long k=0;
			for (Result result : scanner) {
//				NavigableMap<byte[], byte[]> map = result.getFamilyMap("data".getBytes());
//				System.out.println(new String(map.get(vin)) + "," + new String(map.get(soc)));
				k++;
			}
			long endTime = System.currentTimeMillis();
			System.out.println("用时:"+(endTime-startTime));
			System.out.println("总共条数:"+k);
			scanner.close();
			table.close();
			connection.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

Hbase查询结果:

用时:83657
总共条数:2200369

 

实验一结论:

简单条件查询,基数相同,查询结果集相同的条件下,Hive用时基本是Hbase的一倍。但是Hive查询结果是正确的。

 

实验二:使用hive内部表进行查询

首先创建一张Hive自己的表,就是创建hbase关联表的第一行代码。创建后表里是没有数据的,那么这里复制数据的语句如下:

insert into lwb_test3 select * from lwb_test1;

这是直接从之前的lwb_test1表里查出全部数据,存入lwb_test3;

之后还是运行hive代码,只是把表名换一下。可以看到,时间基本上还要比HbaseScan快一点,多次测试,基本和HbaseScan时间一样。

Running:  select * from lwb_test3 where soc<22

用时:79297

总共条数:2201156

实验二结论:

hive使用内部表的查时间是外部表的一半,和HbaseScan的效率基本一样,而且结果正确。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: flume+spark+hive+spark sql离线分析系统是一种基于大数据技术的离线数据分析系统。其中,flume用于数据采集和传输,spark用于数据处理和计算,hive用于数据存储和管理,spark sql用于数据查询和分析。通过这个系统,可以实现对大量数据的高效处理和分析,为企业决策提供有力的支持。 ### 回答2: flume spark hive spark sql离线分析系统是一种数据处理系统。该系统可以用于处理大量的数据,生成相应的报告和分析。博客文章有详细讨论。 flume是一个分布式日志采集系统,它可以将数据从不同的地方采集并传输到所需的位置。它可以采集不同的日志数据,包括web日志、服务器日志、应用程序日志等。flume是一个可扩展的系统,可以用于处理大量的数据。 spark是一个强大的分布式计算引擎,它允许用户在大规模的数据集上进行高性能计算。spark可以快速地处理大量的数据,并支持多种编程语言,例如Java、Python和Scala等。spark还提供了可视化编程工具,例如RDD(弹性分布式数据集)来支持数据处理和分析等任务。 hive是一个基于Hadoop的数据仓库系统,它可以将结构化的数据存储在Hadoop的HDFS文件系统中。hive提供了类SQL的查询语言,例如HQL,并支持复杂查询和数据分析任务。hive还提供了很多插件,使用户可以轻松地将数据导入和导出到不同的数据源中。 spark sql是spark的一部分,它提供了SQL查询和数据分析功能。spark sql的灵活性和可扩展性使其非常适合处理大数据量的数据,包括结构化数据和半结构化数据。 综上所述,flume spark hive spark sql离线分析系统是一个可以用于处理大量的数据的系统,它由flume、sparkhive以及spark sql等组成部分。该系统可以帮助用户轻松地采集、存储、分析和报告大量的数据,有着非常广泛的应用。 ### 回答3: Flume、SparkHiveSpark SQL四个工具都是用于离线分析系统的。 Flume是由Apache基金会开发的开源数据采集系统,用于收集、聚合和移动大量数据。Flume可以实现数据的采集、压缩、持久化和转发,从而实现数据流水线。Flume可以将数据从不同来源收集到不同的目标,支持多种数据源,包括文件、HTTP、数据库等。Flume可以使数据收集更加高效和可靠。 Spark是一种快速、通用的计算引擎,用于大规模数据处理。Spark支持分布式计算,可以在数百台计算机上并行运行Spark是用Java、Scala或Python编写的,可以处理数据,并提供先进的机器学习和图形处理功能。Spark具有内存计算和多种处理任务的灵活性,可以用于各种大规模数据处理的场景中。 Hive是面向Hadoop的数据仓库软件,提供了一个类似SQL的查询语言,用于查询和分析大规模数据。Hive将数据以表格的形式组织和存储,并通过SQL语言进行查询和分析Hive可以用于各种数据仓库的管理,包括文件、HDFS、HBase等。 Spark SQL是在Spark引擎之上构建的结构化数据处理系统,提供了一种基于SQL的编程接口。Spark SQL可以将结构化数据与RDD集成在一起,可以使用Spark的内存计算引擎和流式处理引擎进行大规模的数据分析Spark SQL可以在SQL查询中使用自己的数据格式,从而实现高效的数据处理和分析。 综上所述,Flume、SparkHiveSpark SQL这四个工具是离线分析系统中的重要组成部分,可以实现数据采集、数据处理和数据分析。在大数据分析的过程中,这些工具为数据科学家提供了丰富的选项,从而可以更好地处理数据,加快分析速度并获得更深入的见解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

其实我是真性情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值