hive是什么
hive是hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张表,并且提供sql查询功能。本质是将HQL转化为MapReduce程序,适合离线计算处理。
Hive处理的数据存储在HDFS上的
分析数据底层的实现是MapReduce进行计算的 执行的程序运行在yarn上的
hive架构
- client
CLI(hive shell) jdbc/odbc webui(浏览器访问) - 元数据 包括表名,表所属的数据库,表的拥有者,表的类型 列分区字段,表的数据所在目录。
- hadoop 数据存储在HDFS上的,并且使用MapReduce进行计算的。
- driver 包括解析器,编译器,优化器,执行器
- 解析器 将sql转化为抽象的语法树AST,即对sql字符串进行解析。
- 编译器 将AST编译生成逻辑执行计划。
- 优化器 对逻辑执行计划进行优化。
- 执行器 把逻辑执行计划转化为可运行的物理计划。
hive的优点和使用场景
- 数据的离线处理
- hive的执行延迟比较高,因此适合用于数据分析,对实时性要求不高的场合。
- hive的优势在于处理大数据,对于处理小数据没有优势,因为hive的执行延迟比较高。
安装hive
mv hive-env.sh.template hive-env.sh
vi hive-env.sh.template hive-env.sh
# Set HADOOP_HOME to point to a specific hadoop install directory
HADOOP_HOME=/opt/modules/hadoop-2.5.0
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/opt/modules/hive-0.13.1/conf
vi /etc/profile
export HIVE_HOME=/opt/modules/hive-0.13.1
export PATH=$PATH:$HIVE_HOME/bin
source /etc/profile
在Hadoop目录下进行操作
bin/hdfs dfs -mkdir /tmp
bin/hdfs dfs -mkdir /tmp
bin/hdfs dfs -mkdir -p /user/hive/warehouse
bin/hdfs dfs -chmod g+x /tmp
bin/hdfs dfs -chmod g+W /user/hive/warehouse
Logging initialized using configuration in jar:file:/opt/modules/hive-0.13.1/lib/hive-common-0.13.1.jar!/hive-log4j.properties
hive>
到此hive的准备工作已经完成,出现上面表示成功。
hive结合mysql存储元数据
mysql安装
rpm -qa|grep mysql
rpm -e --nodeps mysql-libs-5.1.66-2.el6_3.x86_64(卸载centos自带的版本)
rpm -ivh MySQL-server-5.6.24-1.el6.x86_64.rpm(安装mysql)
rpm -ivh MySQL-client-5.6.24-1.el6.x86_64.rpm(安装mysql客户端)
service mysql start(启动mysql)
cat /root/.mysql_secret(初始安装查看mysql设置的密码)
mysql -u root -p(登录mysql)
set password=password("missandlove");(修改root用户密码)
mysql> use mysql;
select user ,host,password from user;
mysql> select user ,host,password from user;
+------+--------------------+-------------------------------------------+
| user | host | password |
+------+--------------------+-------------------------------------------+
| root | localhost | *3EF0681227C5B146C25FC6C7C8D0535C637C21DC |
| root | hadoop.jianxin.com | *2BD3CFCD8EAFBFC4CD49B7C7AE7A823791649975 |
| root | 127.0.0.1 | *2BD3CFCD8EAFBFC4CD49B7C7AE7A823791649975 |
| root | ::1 | *2BD3CFCD8EAFBFC4CD49B7C7AE7A823791649975 |
+------+--------------------+-------------------------------------------+
#设置任何一个用户可以连接
update user set host='%' where user='root' and host='localhost';
#把其他用户删除掉
delete from user where host='::1';
...
flush privileges;(修改了用户权限以后在不重启mysql服务的情况下直接刷新,mysql权限将会起作用)
至此mysql的安装已经完成
hive配置mysql存储元数据
touch hive-site.xml(如果用了远程连接修改xml,一定要先随便打一些东西,防止notepad编辑的时候Windows和Linux编码出现不一致)
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop.jianxin.com:3306/metastore?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>missandlove</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
<description>Whether to print the names of the columns in query output.</description>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
<description>Whether to include the current database in the Hive prompt.</description>
</property>
</configuration>
记住一定要报mysql的连接驱动考入到hive的lib目录下
cp mysql-connector-java-5.1.27-bin.jar /opt/modules/hive-0.13.1/lib/
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| metastore |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql 中多出了metastore 存储hive的元数据,因此hive可以支持多个客户端进行连接。
hive建表
导入大量数据最方便的方式
create table student(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|';
load data local inpath '/opt/datas/student.txt'into table student
hive显示函数功能实列
show functions ;
desc function upper ;
desc function extended upper ;
hive (default)> desc function extended upper ;
OK
tab_name
upper(str) - Returns str with all characters changed to uppercase
Synonyms: ucase
Example:
> SELECT upper('Facebook') FROM src LIMIT 1;
'FACEBOOK'
Time taken: 0.058 seconds, Fetched: 5 row(s)
hive数据仓库的配置
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
设置执行权限
$ $HADOOP_HOME/bin/hadoop fs -mkdir /tmp $ $HADOOP_HOME/bin/hadoop fs -mkdir /user/hive/warehouse $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /user/hive/warehouse
Hive运行日志信息位置
$HIVE_HOME/conf/hive-log4j.properties
hive.log.dir=/opt/modules/hive-0.13.1/logs
hive.log.file=hive.log
在cli命令行上显示当前数据库,以及查询表的行头信息
$HIVE_HOME/conf/hive-site.xml
<property>
<name>hive.cli.print.header</name>
<value>true</value>
<description>Whether to print the names of the columns in query output.</description>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
<description>Whether to include the current database in the Hive prompt.</description>
</property>
在启动hive时设置配置属性信息
$ bin/hive --hiveconf <property=value>
查看当前所有的配置信息
hive > set ;
hive (db_hive)> set system:user.name ;
system:user.name=jianxin
hive (db_hive)> set system:user.name=jianxin ;
这种方式设置属性的值,仅仅在当前会话session生效
hive常用的交互式命令
我这里使用hive是因为设置了软连接
[root@hadoop hadoop-2.5.0]# hive -help
-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,--help Print help information
-h <hostname> connecting to Hive Server on remote host
--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
交互式快捷查询
hive -e <quoted-query-string>
hive -e "select * from my_hive.student ;"
#my_hive表示数据库
#student表示数据库下面的表
Logging initialized using configuration in file:/opt/modules/hive-0.13.1/conf/hive-log4j.properties
OK
student.id student.name
Time taken: 2.22 seconds
从客户端文件执行hive查询
bin/hive -f <filename>
[root@hadoop modules]# hive -f hello.sql
Logging initialized using configuration in file:/opt/modules/hive-0.13.1/conf/hive-log4j.properties
OK
student.id student.name
Time taken: 1.794 seconds
结果保存到文件中
[root@hadoop modules]# hive -f hello.sql > /opt/modules/hellores.txt
[root@hadoop modules]# cat hellores.txt
student.id student.name
在hive cli命令窗口中如何查看hdfs文件系统
hive (my_hive)> dfs -ls /;
Found 2 items
drwxrwx--- - root supergroup 0 2018-04-09 13:05 /tmp
drwxr-xr-x - root supergroup 0 2018-04-03 18:05 /user
在hive cli命令窗口中如何查看本地文件系统
hive (default)> !ls /opt/datas ;