Hive

作者: 钟敏_1788 | 来源:发表于2018-12-09 16:04 被阅读0次

    一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

          本文链接:https://www.haomeiwen.com/subject/skckhqtx.html