Hive

一Hive的介绍和下载安装

http://archive.apache.org/

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_郑智》

linux下mysql启动命令

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]#


【开机自启】Linux下设置MySql自动启动

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即可

 

你可能感兴趣的:(Hive)