实际开发中,80%的操作都不会由MapReduce程序直接完成,而是由Hive来完成。Hive是基于hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类sql查询功能,本质是把sql转换为map-reduce。
可以通过CLI、HWI(Hive网络界面)以及Thrift Server提供的JDBC和ODBC的方式访问Hive,最常见的是Hive命令行接口。用户通过以上方式向Hive提交查询命令,而命令将会进入Driver模块,通过该模块对命令进行解释和编译,对需求的计算进行优化,然后按照生成的执行计划执行。执行计划会将查询分解为若干个MapReduce作业。
Hive通过与JobTracker通信来初始化MapReduce作业,所以Hive并不需要部署 JobTracker节点,通常在大型的生产环境集群,Hive被独立部署在集群之外的节点。
Metastore是Hive的元数据集中存放地,保存了Hive的元数据信息,如表名、列名、字段名等,它对于Hive是一个非常重要的组成。它包含:元数据服务和元数据存储。有了元数据存储方案,Hive不再只是一个数据查询工具,而是一个可以管理海量数据的系统。Hive将HDFS上的结构化的数据通过元数据映射为一张张表。
元数据通常放在关系型数据库里,如Mysql、PostgreSQL、Oracle等。
Metastore有3种安装方式,对应Hive也有3种安装模式
- 内嵌模式:元数据服务和Hive服务运行在同一个JVM,使用内嵌Derby数据库
- 本地模式:元数据服务和Hive服务运行在同一个JVM,使用外置MySQL
- 完全远程模式:元数据服务和Hive服务运行在不同进程内。
Hive不支持
- 行级别的更新
- 插入或删除操作
- 不支持事务
- 延迟比较严重
默认使用Derby数据库安装方式,即元数据存储在Derby数据库中。
也可以使用mysql数据库安装方式。
hive -e "select * from mytable limit 1;"
参考:
http://www.aboutyun.com/thread-10937-1-1.html
sudo vi /etc/hosts
192.168.40.8 c22d... hadoop
sudo service mysql status
sudo service mysql start
## mysql账号及密码 root/root
mysql -uroot -proot
mysql>set password=password('root');
mysql>create user 'hive' identified by 'hive'; ## 用户已经创建
mysql>grant all on *.* TO 'hive'@'%' identified by 'hive' with grant option;
mysql>grant all on *.* TO 'hive'@'localhost' identified by 'hive' with grant option;
mysql>flush privileges;
mysql>quit;
mysql -uhive -phive -h hadoop
mysql>create database hive;
mysql>show databases; //数据库及表已经创建
mysql>quit;
cd /home/shiyanlou/install-pack
tar -xzf hive-0.12.0-bin.tar.gz
mv hive-0.12.0-bin /app/hive-0.12.0
cd /home/shiyanlou/install-pack
cp mysql-connector-java-5.1.22-bin.jar /app/hive-0.12.0/lib
sudo vi /etc/profile
添加内容
export HIVE_HOME=/app/hive-0.12.0
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=$CLASSPATH:$HIVE_HOME/bin
source /etc/profile
echo $PATH
cd /app/hive-0.12.0/conf
cp hive-env.sh.template hive-env.sh
sudo vi hive-env.sh
设置内容
export HADOOP_HOME=/app/hadoop-1.1.2
export HIVE_CONF_DIR=/app/hive-0.12.0/conf
cd /app/hive-0.12.0/conf
cp hive-default.xml.template hive-site.xml
sudo vi hive-site.xml
<property>
<name>hive.metastore.urisname>
<value>thrift://hadoop:9083value>
property>
<property>
<name>javax.jdo.option.ConnectionURLname>
<value>jdbc:mysql://hadoop:3306/hive?=createDatabaseIfNotExist=truevalue>
<description>JDBC connect string for a JDBC metastoredescription>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>hivevalue>
<description>username to use against metastore databasedescription>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>hivevalue>
<description>password to use against metastore databasedescription>
property>
hive.server2.thrift.sas1.qop
auth
...
hive.metastore.schema.verification
false
...
启动
hive --service metastore &
hive --service hiveserver &
基本操作
hive
hive>create table test(a string, b int);
hive>show tables;
hive>desc test;