在目前的大数据架构中hive是用来做离线数据分析的,而在Spark1.4版本中 spark 加入了spark sql , 我们知道spark的优势是速度快,那么到底spark sql 会比hive 快多少呢。
Spark 1.4 在spark sql中加入了 窗口函数,这降低了hive 向spark sql迁移的难度。
本文有两个目的,一是hive 与spark sql 整合,二是测试 spark sql 与 hive的效率。
一下是版本信息:
hive版本 hive-0.12.0
spark版本 spark-1.5.2
Scala版本 scala-2.11.6
老规矩,没有废话
在Hive-site.xml 填入如下信息
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://10.10.113.44:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<property>
<name>datanucleus.autoCreateTables</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoCreateColumns</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoCreateSchema</name>
<value>true</value>
</property>`
</configuration>
这样做的目的是使用mysql作为hive的 metastore数据库。
将配置好的文件拷贝到 spark的 conf 目录下
[hadoop@10.10.113.45 ~/hive/conf]$>cp hive-site.xml /home/hadoop/spark/conf/
修改spark 中conf 目录下的spark-env.sh 文件,并添加如下内容
SPARK_EXECUTOR_MEMORY=2G
SPARK_DRIVER_MEMORY=1500M
SPARK_MASTER_IP=10.10.113.45
SPARK_WORKER_MEMORY=4g
export JAVA_HOME=/usr/local/java
export HADOOP_CONF_DIR=/home/hadoop/hadoop/etc/hadoop
export HIVE_CONF_DIR=/home/hadoop/hive/conf
export SPARK_CLASSPATH=$SPARK_CLASSPATH:/home/hadoop/hive/lib/mysql-connector-java-5.1.28.jar
修改log4j.properties.template 加入如下内容
log4j.rootCategory=WARN, console
然后重启 spark
./sbin/start-all.sh
我们首先来看一下,hive中有哪些数据库
hive> show databases;
OK
default
Hive1
然后在进入spark sql中看一下 是否一样。
spark-sql> show databases;OK
default
hive1
(删除掉日志信息后的结果)
我们看到 数据是一样的。
下面 我们来 测试一下hive和spark sql 查询同一张表的效率如何:
1、准备数据
Csv 格式的数据 dividends.csv,一共有15208条数据。
2、将数据上传到hadoop集群中
[hadoop@10.10.113.45 ~]$>hdfs dfs -put dividends.csv /
[hadoop@10.10.113.45 ~]$>hdfs dfs -ls /
Found 8 items
-rw-r--r-- 1 hadoop supergroup 405380 2015-11-26 14:29 /dividends.csv
drwxr-xr-x - hadoop supergroup 0 2015-11-23 17:22 /hbase
drwxr-xr-x - hadoop supergroup 0 2015-10-30 11:21 /hive_external
drwxr-xr-x - hadoop supergroup 0 2015-11-20 14:37 /spark
drwxr-xr-x - root supergroup 0 2015-11-25 15:37 /tachyon
-rw-r--r-- 1 hadoop supergroup 99 2015-11-25 16:36 /test.txt
drwx------ - hadoop supergroup 0 2015-11-26 10:08 /tmp
drwxr-xr-x - hadoop supergroup 0 2015-10-29 16:30 /user
3、在hive中建测试表
hive> create table test (
> a string ,
> b string ,
> c string ,
> d int
> )
> row format delimited
> fields terminated by ',';
OK
Time taken: 0.061 seconds
4、接着在spark sql 中看一下 是都存在
spark-sql> show tables;
ct false
s false
ss false
sss false
test false
whatsit false
5、将数据load 到hive中
hive> load data inpath '/dividends.csv' overwrite into table test;
Loading data to table default.test
Table default.test stats: [num_partitions: 0, num_files: 1, num_rows: 0, total_size: 405380, raw_data_size: 0]
OK
Time taken: 0.242 seconds
6、在hive中做count(*) 查询
hive> select count(*) from test;
OK
_c0
15208
Time taken: 20.104 seconds, Fetched: 1 row(s)
花费了20秒时间。
7,我们在spark中做相同的操作
hive> select count(*) from test;
15/11/26 14:38:10 INFO scheduler.StatsReportListener: 133.0 ms 133.0 ms 133.0 ms 133.0 ms 133.0 ms 133.0 ms133.0 ms 133.0 ms 133.0 ms
15208
花费了多长时间呢? 0.133秒
spark的速度是hive的200倍!!!!!!(不同硬件,会有不同)
这里只分享干货技术!!!!!!!