Shark(Hive on Spark)是UC Lab为Spark设计并开源的一款数据仓库系统,提供了分布式SQL查询引擎,它能够完全兼容Hive。首先,我们通过下面的图,看一下Shark与Hive的关系(http://shark.cs.berkeley.edu/img/shark-hive-integration.png):
以前我们使用Hive分析HDFS中数据时,通过将HQL翻译成MapReduce作业(Job)在Hadoop集群上运行;而使用Shark可以像使用Hive一样容易,如HQL、Metastore、序列化格式、UDF等Shark都支持,不同的是Shark运行在Spark集群上执行计算,基于Spark系统所使用的RDD模型。官方文档给出的性能方面的数据是,使用Shark查询分析HDFS数据,能比Hive快30多倍,如图所示(http://shark.cs.berkeley.edu/img/perf.png):
下面,我们通过安装配置Shark来简单地体验一下。
准备软件包
- jdk-7u25-linux-x64.tar.gz
- scala-2.10.3.tgz
- apache-maven-3.2.1-bin.tar.gz
- hadoop-1.2.1.tar.gz
- spark-0.9.0-incubating-bin-hadoop1.tgz
- hive-0.11-shark-0.9.0.tar.gz
环境变量配置
针对上述准备软件包,我们需要安装配置好JDK、Scala环境,保证Hadoop集群能够正常启动运行,同时Hive也能够执行正确地查询分析工作
01 |
export JAVA_HOME=/usr/java/jdk1.7.0_25/ |
02 |
export PATH=$PATH:$JAVA_HOME/bin |
03 |
export CLASSPATH=$JAVA_HOME/lib/*.jar:$JAVA_HOME/jre/lib/*.jar |
05 |
export SCALA_HOME=/usr/scala/scala-2.10.3 |
06 |
export PATH=$PATH:$SCALA_HOME/bin |
08 |
export MAVEN_HOME=/home/shirdrn/cloud/programs/apache-maven-3.2.1 |
09 |
export PATH=$PATH:$MAVEN_HOME/bin |
11 |
export HADOOP_HOME=/home/shirdrn/cloud/programs/hadoop-1.2.1 |
12 |
export PATH=$PATH:$HADOOP_HOME/bin |
13 |
export HADOOP_LOG_DIR=/home/shirdrn/cloud/storage/hadoop-1.2.1/logs |
15 |
export HIVE_HOME=/home/shirdrn/cloud/programs/hive-0.11-shark-0.9.0 |
16 |
export PATH=$PATH:$HIVE_HOME/bin |
18 |
export SPARK_HOME=/home/shirdrn/cloud/programs/spark-0.9.0-incubating-bin-hadoop1 |
19 |
export PATH=$PATH:$SPARK_HOME/bin |
21 |
export SHARK_HOME=/home/shirdrn/cloud/programs/shark-0.9.0 |
22 |
export PATH=$PATH:$SHARK_HOME/bin |
Hive安装配置
这里,我们使用一个用来与Shark进行整合而开发的版本的Hive软件包,可以在这里https://github.com/amplab/hive/releases选择对应的版本。
例如,在主节点m1上准备Hive的软件包:
2 |
mv v0.11-shark-0.9.0 hive-0.11-shark-0.9.0. tar .gz |
3 |
tar xvzf hive-0.11-shark-0.9.0. tar .gz |
然后修改Hive的配置文件,指定在HDFS上的目录即可,如下所示:
02 |
<? xml-stylesheet type = "text/xsl" href = "configuration.xsl" ?> |
06 |
< name >hive.metastore.warehouse.dir</ name > |
08 |
< description >location of default database for the warehouse</ description > |
简单使用这样配置即可。
安装配置Shark
由于我之前先安装配置了Spark-0.9.0,没有找到对应版本的Shark(只找到了Shark-0.8.1的编译包),所以直接从github下载Shark-0.9.0分支的源码,使用sbt进行构建,执行如下命令行:
上面最后一步使用sbt构建的过程可能需要下载很多依赖包,等待的时间比较长。构建成功之后,可以修改Shark的配置文件:
2 |
mv shark- env .sh.template shark- env .sh |
3 |
mv log4j.properties.template log4j.properties |
然后修改shark-env.sh,修改内容如下所示:
1 |
export SHARK_MASTER_MEM=512m |
3 |
export SCALA_HOME=/usr/scala/scala-2.10.3 |
4 |
export HIVE_CONF_DIR=/home/shirdrn/cloud/programs/hive-0.11-shark-0.9.0/conf |
编译构建并配置Shark,就可以启动Shark Shell,类似Hive Shell一样,执行HQL。
验证Shark
首先,需要启动Hadoop和Spark集群。
启动Shark可以执行如下明命令:
这样就进入了Shark的Shell环境,类似于Hive。现在,我们可以通过如下一个简单的例子来验证Shark,如下所示:
1 |
CREATE DATABASE user_db; |
2 |
CREATE TABLE users (login STRING, password STRING, id INT , group INT , user STRING, home STRING, cmd STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ':' LINES TERMINATED BY '\n' ; |
3 |
LOAD DATA LOCAL INPATH '/etc/passwd' INTO TABLE users; |
对应于本地Unix系统的/etc/passwd文件,我们创建了一个数据库user_db,然后在该数据库中创建了一个users表,最后将本地/etc/passwd文件上传到HDFS,作为Hive表数据。
执行查询:
验证结果示例如下:
01 |
shark> SELECT * FROM users ; |
02 |
223.128: [Full GC 99467K->25184K(506816K), 0.1482850 secs] |
04 |
root x 0 0 root /root /bin/ bash |
05 |
bin x 1 1 bin /bin /sbin/nologin |
06 |
daemon x 2 2 daemon /sbin /sbin/nologin |
07 |
adm x 3 4 adm /var/adm /sbin/nologin |
08 |
lp x 4 7 lp /var/spool/lpd /sbin/nologin |
09 |
sync x 5 0 sync /sbin /bin/ sync |
10 |
shutdown x 6 0 shutdown /sbin /sbin/ shutdown |
11 |
halt x 7 0 halt /sbin /sbin/halt |
12 |
mail x 8 12 mail /var/spool/mail /sbin/nologin |
13 |
uucp x 10 14 uucp /var/spool/uucp /sbin/nologin |
14 |
operator x 11 0 operator /root /sbin/nologin |
15 |
games x 12 100 games /usr/games /sbin/nologin |
16 |
gopher x 13 30 gopher /var/gopher /sbin/nologin |
17 |
ftp x 14 50 FTP User /var/ ftp /sbin/nologin |
18 |
nobody x 99 99 Nobody / /sbin/nologin |
19 |
dbus x 81 81 System message bus / /sbin/nologin |
20 |
usbmuxd x 113 113 usbmuxd user / /sbin/nologin |
21 |
avahi-autoipd x 170 170 Avahi IPv4LL Stack /var/lib/avahi-autoipd /sbin/nologin |
22 |
vcsa x 69 69 virtual console memory owner /dev /sbin/nologin |
23 |
rtkit x 499 497 RealtimeKit /proc /sbin/nologin |
24 |
abrt x 173 173 /etc/abrt /sbin/nologin |
25 |
haldaemon x 68 68 HAL daemon / /sbin/nologin |
26 |
saslauth x 498 76 "Saslauthd user" /var/empty/saslauth /sbin/nologin |
27 |
postfix x 89 89 /var/spool/postfix /sbin/nologin |
28 |
ntp x 38 38 /etc/ntp /sbin/nologin |
29 |
apache x 48 48 Apache /var/www /sbin/nologin |
30 |
avahi x 70 70 Avahi mDNS/DNS-SD Stack /var/run/avahi-daemon /sbin/nologin |
31 |
pulse x 497 496 PulseAudio System Daemon /var/run/pulse /sbin/nologin |
32 |
gdm x 42 42 /var/lib/gdm /sbin/nologin |
33 |
sshd x 74 74 Privilege-separated SSH /var/empty/sshd /sbin/nologin |
34 |
tcpdump x 72 72 / /sbin/nologin |
35 |
shirdrn x 500 500 Jeff Stone /home/shirdrn /bin/ bash |
36 |
mysql x 27 27 MySQL Server /var/lib/mysql /bin/ bash |
37 |
Time taken: 2.742 seconds |
可以在HDFS上查询Hive对应的数据存储位置信息:
示例如下所示:
1 |
[shirdrn@m1 hive-0.11-shark-0.9.0]$ hadoop fs -lsr /hive |
2 |
drwxr-xr-x - shirdrn supergroup 0 2014-03-16 06:06 /hive/user_db.db |
3 |
drwxr-xr-x - shirdrn supergroup 0 2014-03-16 06:07 /hive/user_db.db/ users |
4 |
-rw-r--r-- 3 shirdrn supergroup 1567 2014-03-16 06:07 /hive/user_db.db/ users / passwd |