Hive
一Hive的介绍和下载安装
1.1 Hive的三种模式
1.1.1嵌入模式
----- 元数据信息被存储在hive自带的Derby数据库中
----- 只允许创建一个连接
----- 多用于Demo
[endif]
Hive
[if !mso]
[endif][if !mso]
[endif]
Derby
[if !mso]
[endif]1.1.2本地模式
----- 元数据信息被存储在Mysql数据库中
----- MySQL数据库与Hive运行在同一台物理机器上
----- 多用于开发和测试
1.1.3远程模式(用于生产环境)
---- 元数据信息被存储在Mysql数据库中
----- MySQL数据库与Hive运行在不同一台物理机器上
[endif]
HIVE
[if !mso]
[endif][if !mso]
[endif]
Mysql
[if !mso]
[endif] [if !mso]
[endif]
元信息
[if !mso]
[endif][if !mso]
[endif]
运行在不同的操作系统当中
[if !mso]
[endif]1.2 安装环境
本机系统:win10 16GB内存
虚拟机系统:CentOS6.8 64位
虚拟机软件:VMWare14.1.1
JDK版本:JDK1.8.0.92
Hadoop版本:2.6.5
Zookeeper版本:3.4.10
MySQL版本:mysql-5.7.22-linux-glibc2.12-x86_64
Hive 版本:apache-hive-1.2.1-bin
1.3 Hive的安装
确保hadoop集群已经启动
tar -zxvf apache-hive-1.2.1-bin.tar.gz -C/home/hadoop/app/
mv hive-env.sh.template hive-env.sh
vi hive-env.sh
# Set HADOOP_HOME to point to a specifichadoop install directory
HADOOP_HOME=/home/hadoop/app/hadoop-2.6.5
# Hive Configuration Directory can becontrolled by:
exportHIVE_CONF_DIR=/home/hadoop/app/hive/conf
这样就配置完成了!(嵌入模式)
1.3 Hive的启动(嵌入模式)
1.3.1首先启动hdfs和yarn
start-dfs.sh
start-yarn.sh
1.3.2在HDFS上创建/tmp和/user/hive/warehouse两个目录并修改他们的同组权限可写
hadoopfs -chmod 777 /user/hive/warehouse
hadoopfs -chmod 777 /tmp
配置环境变量
source /etc/profile
1.3.3测试嵌入模式
如果执行hive 就自动执行了嵌入模式,自动创建了一个Derby数据库
cd/home/hadoop/app/hive/
metastore_db就是Derby
show databases; 显示所有数据库
use default; 使用默认的数据库
show tables; 显示所有的表
create table students(id int,name string) ;创建一个表名为student 有ID和name
desc students; 查看这张表的结构
insert into students values(001,'ouyang'); 插入一条数据
select * from students; 查看表中的内容
quit;
exit; 退出命令
1.5将本地文件导入HIVE的案例
需求:将本地/home/hadoop/Documents/ 这个目录下的数据导入到hive的students(id
int,name string)表中。
[root@hadoop01 Documents]# pwd
/home/hadoop/Documents
[root@hadoop01 Documents]# mkdir datas
[root@hadoop01 Documents]# ll
total 4
drwxr-xr-x 2 root root 4096 Jul 11 03:50datas
[root@hadoop01 Documents]# cd datas/
[root@hadoop01 datas]# touch student.txt
[root@hadoop01 datas]# vi student.txt
1001 zhangshan
1002 lishi
1003 zhaoliu
中间为tab键
loaddata local inpath '/home/hadoop/Documents/datas/student.txt' into tabledefault.students; 加载本地数据到hive中的表上
出问题了,你会发现全部为空,这是为什么呢?
因为创建表时,没有设置分隔符
create table students2(id int,name string) rowformat delimited fields terminated by '\t'; 创建一个表名为student 有ID和name 并且ID和name之间设置间隔符\t
desc students2;
这是我们在导入加载数据到这张表
load data local inpath'/home/hadoop/Documents/datas/student.txt' into table default.students2;
select * from students2;
如果在加一个命令行,连接hive,就会报错
因为嵌入模式,元数据信息被存储在Hive自带的Derdy数据库中,derdy在执行的目录中,只允许创建一个连接,当另一个命令在同一目录连接hive,该目录derdy就已被使用,所有报错。
二MySql安装(安装在另一台主机上)
详细安装请见文档《海工所_Linux下安装Mysql5.7_郑智》
1,使用service 启动、关闭MySQL服务
service mysqld start
service mysqld stop
service mysqld restart
运行上面命令,其实是service命令去找/etc/init.d下的相关的mysql脚本去执行启动、关闭动作。
2,使用/etc/init.d/mysql启动、关闭MySQL服务,
[root@DB-Server bin]# /etc/init.d/mysqld start
Starting MySQL....[ OK ]
[root@DB-Server bin]# /etc/init.d/mysqld stop
Shutting down MySQL..[ OK ]
[root@DB-Server bin]#
1、将服务文件拷贝到init.d下,并重命名为mysql
cp /app/mysql-5.7.22/support-files/mysql.server
/etc/init.d/mysqld
2、赋予可执行权限
chmod +x
/etc/init.d/mysqld
3、添加服务
chkconfig --add
mysqld
4、显示服务列表
chkconfig
--list
如果看到mysql的服务,并且3,4,5都是on的话则成功,如果是off,则键入
chkconfig
--level 345 mysqld on
5、重启电脑
reboot
三 Mysql中user表中主机配置(让所有主机都可以访问mysql)
首先进入安装有mysql的另一台主机,登陆mysql
然后刷新一下
下面所有主机都可以访问mysql了
四Hive元数据配置到MySql (远程模式)
4.1 驱动拷贝
mysql-connector-java-5.1.28-bin.jar到/home/hadoop/app/hive/lib/
[root@hadoop102 mysql-connector-java-5.1.27]#cp mysql-connector-java-5.1.28-bin.jar /home/hadoop/app/hive/lib/
4.2 配置Metastore到MySql
1)在/home/hadoop/app/hive/conf目录下创建一个hive-site.xml
[root@hadoop102 conf]# touch hive-site.xml
在hive-site.xml文件中输入任意字符后保存(保证编码)
2)从hive-default.xml.template拷贝信息到hive-site.xml文件
[root@hadoop102 conf]# vi hive-site.xml
3)根据官方文档配置参数
https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin
javax.jdo.option.ConnectionURL
jdbc:mysql://HA02:3306/metastore?createDatabaseIfNotExist=true
JDBC connect string for a JDBC metastore
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
Driver class name for a JDBC metastore
javax.jdo.option.ConnectionUserName
root
username to use against metastore database
javax.jdo.option.ConnectionPassword
root123
password to use against metastore database
4)配置完毕后,如果启动hive异常,可以重新启动虚拟机(reboot)。(重启后,别忘了启动hadoop集群start-all.sh)
4.3 多窗口启动Hive测试
1)先启动MySQL
[root@ hadoop01 mysql-libs]$ mysql -uroot –proot123
查看有几个数据库
mysql>show
databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
2)再次打开多个窗口,分别启动hive
[root @hadoop01 hive]$
bin/hive
3)启动hive后,回到MySQL窗口查看数据库,显示增加了metastore数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
|metastore |
| mysql |
| performance_schema |
| test |
+--------------------+
现在我们就把元数据信息都存到了远程mysql的这张表里面了!~~
五Hive常用交互命令
[atguigu@hadoop102 hive]$ bin/hive -help
usage: hive
-d,--define Variable subsitution to apply to hive
commands. e.g. -d A=B or --define A=B
--database Specify thedatabase to use
-e SQLfrom command line
-f SQL from files
-H,--help Print help information
--hiveconf Use value forgiven property
--hivevar Variablesubsitution to apply to hive
commands. e.g. --hivevar A=B
-i Initialization SQL file
-S,--silent Silent mode ininteractive shell
-v,--verbose Verbose mode (echoexecuted SQL to the console)
创建一个表
use default;
create table student(id int,name string);
insert into student values(100,'xmg');
比较慢~0~,说明hive处理小数据没有任何优势,hive适合处理的是大量数据。
1)“-e”不进入hive的交互窗口执行sql语句
[hadoop@HA01 hive]$ bin/hive -e "select *from student;"
2)“-f”执行脚本中sql语句
(1)在/opt/module/datas目录下创建hivef.sql文件
[hadoop@HA01 hive]$ touch hsql.sql
[hadoop@HA01 hive]$ vi hsql.sql
文件中写入正确的sql语句
select * fromstudent;
(2)执行文件中的sql语句
[hadoop@HA01 hive]$ bin/hive -f ./hsql.sql
(3)执行文件中的sql语句并将结果写入文件中
[atguigu@hadoop102 hive]$ bin/hive -f/opt/module/datas/hivef.sql >/opt/module/datas/hive_result.txt
六 Hive其他命令操作
1)退出hive窗口:
hive(default)>exit;
hive(default)>quit;
在新版的oracle中没区别了,在以前的版本是有的:
exit:先隐性提交数据,再退出;
quit:不提交数据,退出;
2)在hive cli命令窗口中如何查看hdfs文件系统
hive(default)>dfs-ls /;
3)在hive cli命令窗口中如何查看hdfs本地系统
hive(default)>!ls /home/hadoop/app;
4)查看在hive中输入的所有历史命令
(1)进入到当前用户的根目录/root或/home/atguigu
(2)查看.
hivehistory文件
[hadoop@HA01 ~]$ cat .hivehistory
七 Hive常见属性配置
7.1 Hive数据仓库位置配置
(1)Default数据仓库的最原始位置是在hdfs上的:/user/hive/warehouse路径下
(2)在仓库目录下,没有对默认的数据库default创建文件夹。如果某张表属于default数据库,直接在数据仓库目录下创建一个文件夹。
(3)修改default数据仓库原始位置(将hive-default.xml.template如下配置信息拷贝到hive-site.xml文件中)
hive.metastore.warehouse.dir
/user/hive/warehouse
location of default database for the warehouse
配置同组用户有执行权限
bin/hdfs dfs -chmod g+w/user/hive/warehouse
7.2 Hive运行日志信息配置
1)Hive的log默认存放在/tmp/hadoop/hive.log目录下(当前用户名下)。
2)修改hive的log存放日志到/home/hadoop/app/hive/logs
(1)修改/home/hadoop/app/hive/conf/hive-log4j.properties.template文件名称为
hive-log4j.properties
[hadoop@HA01 conf] $pwd
/opt/hadoop/hive/logs
[hadoop@HA01 conf] $ mvhive-log4j.properties.template hive-log4j.properties
vihive-log4j.properties
(2)在hive-log4j.properties文件中修改log存放位置
hive.log.dir=/home/hadoop/app/hive/logs
7.3 显示当前数据库,以及查询表的头信息配置
1)在hive-site.xml文件中添加如下配置信息,就可以实现显示当前数据库,以及查询表的头信息配置。
[hadoop@HA01 conf]$ vi hive-site.xml
hive.cli.print.header
true
hive.cli.print.current.db
true
2)重新启动hive,对比配置前后差异
[hadoop@HA01conf]$ cd ..
[hadoop@HA01hive]$ bin/hive
(1)配置前
(2)配置后
7.4 参数配置方式
1)查看当前所有的配置信息
hive>set;
2)参数的配置三种方式
(1)配置文件方式
默认配置文件:hive-default.xml
用户自定义配置文件:hive-site.xml
注意:用户自定义配置会覆盖默认配置。另外,Hive也会读入Hadoop的配置,因为Hive是作为Hadoop的客户端启动的,Hive的配置会覆盖Hadoop的配置。配置文件的设定对本机启动的所有Hive进程都有效。
(2)命令行参数方式
启动Hive时,可以在命令行添加-hiveconf param=value来设定参数。
例如:
[hadoop@HA01hive]$ bin/hive -hiveconf mapred.reduce.tasks=10;
注意:仅对本次hive启动有效
查看参数设置:
hive(default)> set mapred.reduce.tasks;
(3)参数声明方式
可以在HQL中使用SET关键字设定参数
例如:
hive(default)> set mapred.reduce.tasks=100;
注意:仅对本次hive启动有效。
查看参数设置
hive(default)> set mapred.reduce.tasks;
上述三种设定方式的优先级依次递增。即参数声明覆盖命令行参数,命令行参数覆盖配置文件设定。注意某些系统级的参数,例如log4j相关的设定,必须用前两种方式设定,因为那些参数的读取在会话建立以前已经完成了。
五 遇到问题
5.1 Hive1.2.1安装报错解决方法
5.1.1报错为:Terminal initialization failed; falling back to unsupported具体错误为:
[ERROR] Terminalinitialization failed; falling back to unsupported
java.lang.IncompatibleClassChangeError:Found class jline.Terminal, but interface was expected
atjline.TerminalFactory.create(TerminalFactory.java:101)
atjline.TerminalFactory.get(TerminalFactory.java:158)
atjline.console.ConsoleReader.(ConsoleReader.java:229)
atjline.console.ConsoleReader.(ConsoleReader.java:221)
atjline.console.ConsoleReader.(ConsoleReader.java:209)
atorg.apache.hadoop.hive.cli.CliDriver.getConsoleReader(CliDriver.java:773)
atorg.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:715)
atorg.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:675)
atorg.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:615)
atsun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
atjava.lang.reflect.Method.invoke(Method.java:606)
atorg.apache.hadoop.util.RunJar.run(RunJar.java:221)
atorg.apache.hadoop.util.RunJar.main(RunJar.java:136)
Exception inthread "main" java.lang.IncompatibleClassChangeError: Found classjline.Terminal, but interface was expected
atjline.console.ConsoleReader.(ConsoleReader.java:230)
atjline.console.ConsoleReader.(ConsoleReader.java:221)
atjline.console.ConsoleReader.(ConsoleReader.java:209)
atorg.apache.hadoop.hive.cli.CliDriver.getConsoleReader(CliDriver.java:773)
atorg.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:715)
atorg.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:675)
atorg.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:615)
atsun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
atjava.lang.reflect.Method.invoke(Method.java:606)
atorg.apache.hadoop.util.RunJar.run(RunJar.java:221)
atorg.apache.hadoop.util.RunJar.main(RunJar.java:136)
解决方法:
删除位于$HADOOP_HOME/share/hadoop/yarn/lib/jline-0.9.94.jar 的 jline-0.9.94.jar 文件,重新启动hadooop,hive即可
2
5.1.2报错为:Relative path in absoluteURI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
具体报错为:
java.lang.IllegalArgumentException:java.net.URISyntaxException:Relative path in absoluteURI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
atorg.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:444)
atorg.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:672)
atorg.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:616)
atsun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
atjava.lang.reflect.Method.invoke(Method.java:606)
atorg.apache.hadoop.util.RunJar.main(RunJar.java:160)
Caused by:java.lang.IllegalArgumentException:java.net.URISyntaxException: Relative pathin absolute URI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
atorg.apache.hadoop.fs.Path.initialize(Path.java:148)
atorg.apache.hadoop.fs.Path.(Path.java:126)
atorg.apache.hadoop.hive.ql.session.SessionState.createSessionDirs(SessionState.java:487)
atorg.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:430)
... 7more
Caused by:java.net.URISyntaxException:Relative path in absoluteURI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
atjava.net.URI.checkPath(URI.java:1804)
atjava.net.URI.(URI.java:752)
atorg.apache.hadoop.fs.Path.initialize(Path.java:145)
... 10more
解决方法:
解决方案如下:
1、新建文件夹:/home/hadoop/App/hive/temp;
2、.查看hive-site.xml配置,会看到配置值含有"system:java.io.tmpdir"的配置项,将含有"system:java.io.tmpdir"的配置项的值修改为如上地址,重新启动hive即可