2.3 Hive 内部介绍: P44
$HIVE_HOME/lib 下的 jar 文件是具体的功能部分;(CLI模块)
其它组件,Thrift 服务,可以远程访问其他进程功能;也有使用 JDBC 和 ODBC 访问 Hive 的功能;
所有Hive 客户端都需要一个 metastoreservice(元数据服务),Hive 用这个服务来存储表模式信息和其他元数据信息;默认会使用内置的 Derby SQL服务器提供有限的单进程的存储服务;
HWI Hive 网页界面,提供了远程访问Hive 的服务;
conf 目录下存放了Hive 的配置文件
2.4 启动 Hive 进入 CLI 模式
$HIVE_HOME/bin/hive 会显示用户所执行的命令和查询日志数据所存放在的本地文件系统中的位置,还有OK 及查询所消耗的时间等信息;
注意:Hive 中的关键字是不区分大小写的;
如果使用 Derby 数据库作为元数据存储的话,那么会在用户使用的当前的目录是建立一个 metastore_db 的目录,此目录是在启动Hive会话的时候由 Derby 建立的,如果用户切换其它目录来执行启动Hive ,它会在其他目录新建立这个 目录 ,并忘记以前的目录会造成数据丢失,所以要把元数据存储配置成一个永久的路径最好;
hive.metastore.warehouse.dir 用于指定 Hive 表存储所在的位置 在 Hadoop中默认的值是
/usr/hive/warehouse 这个为属性指定不同的值可以允许每个用户定义其自己的数据仓库目录,这样可以避免影响其他系统用户,如:set
hive.metastore.warehouse.dir=/user/myname/hive/warehouse; 为了不让每次启动Hive时指定这样的一个脚本比较麻烦,可以把它放在
$HIVE_HOME/.hiverc 文件中,每次启动Hive 文件都会执行这个文件;
2.5 使用 JDBC 连接元数据
Hive所提供的组件中没有元数据存储组件的,这个是Hadoop所没有的,需要外部提供;元数据存储中赶集了表的模式和分区信息等元数据信息,用户在执行操作(create tablse 、alter talbe)的时候会指定这些信息,因为多用户系统可能并发这些元数据存储,所以默认的内置数据库并不适用于生产环境;
设置MySQL 来作业元数据存储:假设在 db1.mydomain.pvt 服务器的 3306 端口上运行着 MySQL,且数据库名为 hive_db
设置 hive-siet.xml 中的元数据存储数据库配置
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://db1.mydomain.pvt:3306/hive_db?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>911</value>
<description>password to use against metastore database</description>
</property>
<property>
为了使 Hive 能够连接上 MySql,需要将 JDBC 驱动放置在类路径下: MySQL JDBC (Jconnector 下载地址:http://www.mysql.com/downloads/connecotr/j/)下载完后可放置在 Hive 库路径下,$HOME_HIVE/lib 下;配置信息完毕后 Hive 就会把元数据存储到 MySql 中;
2.6 Hive 命令
$HOME_HIVE/bin/hive 进入 CLI 的 Hive e服务通道
bin/hive --helfp 查看hive 命令的帮助
Service List 里面的内容提供的服务,包括我们常使用的CLI,可以通过 --service name 服务名称来启用某个服务;
Hive 的服务:
cli 命令行界面;用户定义表,执行查询等
hiveserver Hive Server 监听来自于其他进程的 Thrift 连接的一个守护进程
hwi HiveWeb 界面;是一个可以执行查询语句和其他命令的简单的 web界面,可以不用登录到集群中的机器上使用 CLI 来进行查询
jar hadoop jar 命令的一个扩展,这样可以执行需要 Hive 环境的应用
metastore 启动一个扩展的 Hive 元数据服务,可以供多客户端使用
rcfilecat 一个可以打印出 RCFile 格式文件内容的工具;
--auxpath 选项允许用户指定一个以冒号分割的 附属的 Java 包 这些文件中包含用户可能需要的自定义的扩展;
--config 文件目录 这个命令允许用户覆盖 $HIVE_HOME/conf 中默认的属性配置,而指向一个新的配置文件目录;
2.7 命令行界面
$hive --help --service cli 显示 CLI 所提供的选项列表
usage: hive
-d,--define <key=value> Variable subsitution to apply to hive
commands. e.g. -d A=B or --define A=B
--database <databasename> Specify the database to use
-e <quoted-query-string> SQL from command line
-f <filename> SQL from files
-h <hostname> connecting to Hive Server on remote host
-H,--help Print help information
--hiveconf <property=value> Use value for given property
--hivevar <key=value> Variable subsitution to apply to hive commands. e.g. --hivevar A=B
-i <filename> Initialization SQL file
-p <port> connecting to Hive Server on port number
-S,--silent Silent mode in interactive shell
-v,--verbose Verbose mode (echo executed SQL to the console)
变量和属性:
--fefine key=value 和 --hivevar key=value 是等价的,二者都可以让用户在命令行定义用户自定义变量以便在 Hive 脚本中引用,来满足不同情况的执行;0.8.0以后的版本才有;并会将这些键值对放到 hivevar 命名空间,以便与其他3种内置命令空间(hiveconf、system、env)进行区分 ;
Hive 中变量和属性命名空间
hivevar 读/写 用户自定义变量
hiveconf 读/写 Hive 相关配置
system 读/写 Java 定义的配置属性
env 读 Shell 环境定义的环境变量
Hive 变量内部是以 Java 字符串的方式存储的,用户可以在查询中引用变量,Hive会先使用变量值替换掉查询的变量引用,然后才会将语句提交给查询处理器;
CLI 中可使用 SET 显示或修改变量值;
set evn:HOME 显示当前执行hive的目录;
set 输出更多目录
hvie -v; 如果不加 -v 则会打印出所以的变更内容;如果使用 -v 则还会打印 hadoop 中所定义的所有的属性,
set --define foo=bar 定义变量
set foo 显示变量 foo=bar;
set hivevar:foo; 显示 变量 foo 显示内容 hivevar:foo=bar
set hivevar:foo=bar2; 设置变量;
set foo; 显示 foo=bar2
从以上可以看出 hivevar: 是可选的;
在CLI 中查询语句中的变量引用会先被替换掉然后才会提交给查询处理器。
create table tossl(i int,${hivevar:foo} string);
describe tossl; 显示 ${hivevar:foo} 变量的值;
set hive.cli.print.current.db 查看此设置的值; 默认为 false ; 设置为 true 可以在CLI 提示符打印当前所在的数据库名;默认的数据名为 default ;
hive> set system:user.name; 显示 system:user.name=root;
hive>set env:HOME; 显示 env:HOME=/root
注意:用户必须使用 system: 或者 env: 前缀来指定系统属性和环境变量;
Hive 中 “一次使用”的命令可以这样:
$hive -e "select * from mytable limit 3"; 可以执行一次命令后就会退出;
$ hive -S -e
"select * from mytable limit 3" > /tmp/myquery ; -S 选项可以开启静默模式,结果里就不显示 OK ,Timetaken 等;并将结果存入 /tmp/myquery 文件 而不是HDFS 中;
$hive -S -e "set" | grep warehouse 如果记不清楚某个属性名时,可以使用此命令来查询属性;
从文件中执行 Hive 查询,Hive中可以使用 -f 文件名试执行指定文件中的一个或者多个查询语句;一般把这些 Hive 查询文件保存为.q 或 .hql 后缀的文件;
$hive -f /path/to/file/withqueryies.hql
hive> source /path/to/file/withqueries.hql; 在 CLI 中 执行 文件中的 Hive 语句 ;
$hive -e "LOAD DATA LOCAL INPATH '/tmp/myfile' INTO TALBE src";
2.7.5 hiverc 文件
$hive -i '/tmp/myfile' 允许用户指定一个文件,当 CLI 启动时会在提示符出现之前先执行这个文件。也可以在 Hive 的 HOME 目录下寻找
.hiverc 的文件,而且会自动执行这个文件中的命令;
对于用户需要和和频繁执行的命令,可以使用此文件,如设置系统属性和变量等;例如:
ADD JAR /path/to/costom_hive_extensions.jar 向分布式内存中半圆一个 jar 文件
set hive.cli.print.current.db=true; 显示CLI提示符前显示当前所在的工作数据库
set hive.exec.mode.local.auto=true; 鼓励 Hive 如果可以使用本地模式执行的话就在本地执行,这样可以加快小数据集的数据查询速度
注意:每行后面的 ; 一定要记得加上
2.7.6 更多的 Hive CLI 介绍
1)自动补全功能:在输入命令过程中 按 Tab 制表键,CLI 会自动 补全可能的关键字;
2)查看操作命令历史:可以用上下箭头来查看之前 的命令,它被记录在 $HOME_HIVE/.hivehistory 中,能保存 10000条
2.7.8 执行 shell 命令
用户不需要退出 Hive CLI就可以执行简单的 bash shell 命令,只要在命令前加上 !并且以 ; 结尾就可以
hive> ! /bin/echo "what up dog";
hive>! pwd;
注意:不能使用 shell 的管道功能 和文件名称自动实例功能;
2.7.9 在 Hive 内使用 Hadoop 的dfs 命令[在hvie中使用 hadoop命令比在 bash shell 中使用要快因为它会在hive的同一个进程中执行这些命令]
hive> dfs -sl /; 只要将 hadoop 命令中的 hadoop 关键字去掉,并且以分号结尾即可
hive> dfs -help ; 查盾 dfs 所提供的所有功能选项列表
2.7.10 Hive 脚本中的注释
在保存 HiveQuery 的文件里可以以--来注释 语句,但不能在 CLI 中这样注释;
在保存 HiveQuery 的文件里可以以--来注释 语句,但不能在 CLI 中这样注释;
2.7.11 显示字段名称
set hive.cli.print.header=true; 来显示字段名称