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也能够执行正确地查询分析工作
export JAVA_HOME=/usr/java/jdk1.7.0_25/ export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=$JAVA_HOME/lib/*.jar:$JAVA_HOME/jre/lib/*.jar export SCALA_HOME=/usr/scala/scala-2.10.3 export PATH=$PATH:$SCALA_HOME/bin export MAVEN_HOME=/home/shirdrn/cloud/programs/apache-maven-3.2.1 export PATH=$PATH:$MAVEN_HOME/bin export HADOOP_HOME=/home/shirdrn/cloud/programs/hadoop-1.2.1 export PATH=$PATH:$HADOOP_HOME/bin export HADOOP_LOG_DIR=/home/shirdrn/cloud/storage/hadoop-1.2.1/logs export HIVE_HOME=/home/shirdrn/cloud/programs/hive-0.11-shark-0.9.0 export PATH=$PATH:$HIVE_HOME/bin export SPARK_HOME=/home/shirdrn/cloud/programs/spark-0.9.0-incubating-bin-hadoop1 export PATH=$PATH:$SPARK_HOME/bin export SHARK_HOME=/home/shirdrn/cloud/programs/shark-0.9.0 export PATH=$PATH:$SHARK_HOME/bin
Hive安装配置
这里,我们使用一个用来与Shark进行整合而开发的版本的Hive软件包,可以在这里https://github.com/amplab/hive/releases选择对应的版本。
例如,在主节点m1上准备Hive的软件包:
wget https://github.com/amplab/hive/archive/v0.11-shark-0.9.0.tar.gz mv v0.11-shark-0.9.0 hive-0.11-shark-0.9.0.tar.gz tar xvzf hive-0.11-shark-0.9.0.tar.gz
然后修改Hive的配置文件,指定在HDFS上的目录即可,如下所示:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/hive</value> <description>location of default database for the warehouse</description> </property> </configuration>
简单使用这样配置即可。
安装配置Shark
由于我之前先安装配置了Spark-0.9.0,没有找到对应版本的Shark(只找到了Shark-0.8.1的编译包),所以直接从github下载Shark-0.9.0分支的源码,使用sbt进行构建,执行如下命令行:
git clone https://github.com/amplab/shark.git -b branch-0.9.0 shark-0.9.0 cd shark-0.9.0 sbt/sbt package
上面最后一步使用sbt构建的过程可能需要下载很多依赖包,等待的时间比较长。构建成功之后,可以修改Shark的配置文件:
cd shark-0.9.0/conf mv shark-env.sh.template shark-env.sh mv log4j.properties.template log4j.properties
然后修改shark-env.sh,修改内容如下所示:
export SHARK_MASTER_MEM=512m export SPARK_MEM=512m export SCALA_HOME=/usr/scala/scala-2.10.3 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可以执行如下明命令:
bin/shark
这样就进入了Shark的Shell环境,类似于Hive。现在,我们可以通过如下一个简单的例子来验证Shark,如下所示:
CREATE DATABASE user_db; 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'; LOAD DATA LOCAL INPATH '/etc/passwd' INTO TABLE users;
对应于本地Unix系统的/etc/passwd文件,我们创建了一个数据库user_db,然后在该数据库中创建了一个users表,最后将本地/etc/passwd文件上传到HDFS,作为Hive表数据。
执行查询:
SELECT * FROM users;
验证结果示例如下:
shark> SELECT * FROM users; 223.128: [Full GC 99467K->25184K(506816K), 0.1482850 secs] OK root x 0 0 root /root /bin/bash bin x 1 1 bin /bin /sbin/nologin daemon x 2 2 daemon /sbin /sbin/nologin adm x 3 4 adm /var/adm /sbin/nologin lp x 4 7 lp /var/spool/lpd /sbin/nologin sync x 5 0 sync /sbin /bin/sync shutdown x 6 0 shutdown /sbin /sbin/shutdown halt x 7 0 halt /sbin /sbin/halt mail x 8 12 mail /var/spool/mail /sbin/nologin uucp x 10 14 uucp /var/spool/uucp /sbin/nologin operator x 11 0 operator /root /sbin/nologin games x 12 100 games /usr/games /sbin/nologin gopher x 13 30 gopher /var/gopher /sbin/nologin ftp x 14 50 FTP User /var/ftp /sbin/nologin nobody x 99 99 Nobody / /sbin/nologin dbus x 81 81 System message bus / /sbin/nologin usbmuxd x 113 113 usbmuxd user / /sbin/nologin avahi-autoipd x 170 170 Avahi IPv4LL Stack /var/lib/avahi-autoipd /sbin/nologin vcsa x 69 69 virtual console memory owner /dev /sbin/nologin rtkit x 499 497 RealtimeKit /proc /sbin/nologin abrt x 173 173 /etc/abrt /sbin/nologin haldaemon x 68 68 HAL daemon / /sbin/nologin saslauth x 498 76 "Saslauthd user" /var/empty/saslauth /sbin/nologin postfix x 89 89 /var/spool/postfix /sbin/nologin ntp x 38 38 /etc/ntp /sbin/nologin apache x 48 48 Apache /var/www /sbin/nologin avahi x 70 70 Avahi mDNS/DNS-SD Stack /var/run/avahi-daemon /sbin/nologin pulse x 497 496 PulseAudio System Daemon /var/run/pulse /sbin/nologin gdm x 42 42 /var/lib/gdm /sbin/nologin sshd x 74 74 Privilege-separated SSH /var/empty/sshd /sbin/nologin tcpdump x 72 72 / /sbin/nologin shirdrn x 500 500 Jeff Stone /home/shirdrn /bin/bash mysql x 27 27 MySQL Server /var/lib/mysql /bin/bash Time taken: 2.742 seconds
可以在HDFS上查询Hive对应的数据存储位置信息:
hadoop fs -lsr /hive
示例如下所示:
[shirdrn@m1 hive-0.11-shark-0.9.0]$ hadoop fs -lsr /hive drwxr-xr-x - shirdrn supergroup 0 2014-03-16 06:06 /hive/user_db.db drwxr-xr-x - shirdrn supergroup 0 2014-03-16 06:07 /hive/user_db.db/users -rw-r--r-- 3 shirdrn supergroup 1567 2014-03-16 06:07 /hive/user_db.db/users/passwd
参考链接
- http://shark.cs.berkeley.edu/
- https://github.com/amplab/shark
- https://github.com/amplab/shark/wiki
- https://github.com/amplab/shark/wiki/Shark-User-Guide
- https://github.com/amplab/shark/wiki/Building-Shark-from-Source-Code
本文基于署名-非商业性使用-相同方式共享 4.0许可协议发布,欢迎转载、使用、重新发布,但务必保留文章署名时延军(包含链接:http://shiyanjun.cn),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
请问下楼主:你这样好像没装mysql 那hive的metastore存储在哪呢? 你这能集群上运行吗?
你可以配置外部存储(如MySQL)来存储元数据,看来,你不是很熟悉Hive吧。这里,我只是为了演示Shark的功能,直接使用了Hive默认存储metastore的配置(derby)。