zoukankan      html  css  js  c++  java
  • Hive1.2.2的安装和配置

    Hadoop环境搭建笔记整理(四)——Hive1.2.2的安装和配置

    一、是什么和做什么

    1.什么是Hive?

    一个数据仓库工具

    Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成

    不可更改和添加数据

    Hive 并非为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操作。Hive 的最佳使用场合是大数据集的批处理作业

    上述的描述是从官方的角度。在学习过程中,对hadoop和hive关系的理解就是hadoop作为一个基本平台包含一些基本功能,hive取其中一个部分,数据从平台传入经过hdfs,由hadoop自带的mapreduce功能调用数据,使得数据进入hive得到处理。

    2.在伪分布式集群搭好,mysql环境运行不出问题的基础上安装hive

    二、安装过程

    1.在mysql端配置hive

    a.进入mysql命令行,创建hive用户并赋予所有权限:

    mysql -uroot -proot

    mysql>set password=password('root');

    mysql>create user 'hive' identified by 'hive';

    mysql>grant all on *.* TO 'hive'@'%' identified by 'hive' with grant option;

    mysql>grant all on *.* TO 'hive'@'localhost' identified by 'hive' with grant option;

    mysql>flush privileges;

    b.使用hive用户登录,创建hive数据库:

    mysql -uhive -phive -h hadoop

    mysql>create database hive;

    mysql>show databases;

    c.解压mysql驱动包(先行解压过hive包之后的操作)

    Download Connector/J

    解压该安装包并把该安装包复制到/hive-x.x.x/lib目录中

    例如:cp mysql-connector-java-5.1.22-bin.jar /app/hive-1.2.2/lib

    2.安装hive

    a.下载地址

    Downloads

    b.配置文件

    (1)使用如下命令打开/etc/profile文件:

    sudo vi /etc/profile

    设置如下参数:

    export HIVE_HOME=/.../hive-1.2.2

    export PATH=$PATH:$HIVE_HOME/bin

    export CLASSPATH=$CLASSPATH:$HIVE_HOME/bin

    使配置文件生效:

    source /etc/profile

    echo $PATH

    (2)

    设置hive-env.sh配置文件

    进入hive-1.2.2/conf目录,复制hive-env.sh.templaete为hive-env.sh:

    cd /.../hive-1.2.2/conf

    cp hive-env.sh.template hive-env.sh

    sudo vi hive-env.sh


    分别设置HADOOP_HOME和HIVE_CONF_DIR两个值:

    # Set HADOOP_HOME to point to a specific hadoop install directory

    export HADOOP_HOME=/.../hadoop-1.2.2

    # Hive Configuration Directory can be controlled by:

    export HIVE_CONF_DIR=/.../hive-1.2.2/conf

    (3)设置hive-site.xml配置文件

    复制hive-default.xml.templaete为hive-site.xml

    cd /.../hive-1.2.2/conf

    cp hive-default.xml.template hive-site.xml

    sudo vi hive-site.xml

    (4)修改 hive-site.xml

    <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/.../hive-1.2.2/warehouse</value>
    </property>
    <property>
    <name>hive.exec.scratchdir</name>
    <value>/.../hive-1.2.2/scratchdir</value>
    </property>
    <property>
    <name>hive.querylog.location</name>
    <value>/.../hive-1.2.2/logs</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value> jdbc:mysql://localhost:3306/hivedb?createDatabaseIfNotExist=true</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>*****(根据自己的用户名填)</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>*****(根据自己的密码填)</value>
    </property>

    (5)hive默认为derby数据库,需要把相关信息调整为mysql数据库

    <property>

    <name>hive.metastore.uris</name>

    <value>thrift://hadoop:9083</value>(注意修改)

    <description>Thrift URI for the remote metastore. ...</description>

    </property>

    <property>

    <name>javax.jdo.option.ConnectionURL</name>

    <value>jdbc:mysql://hadoop:3306/hive?=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>hive(根据自己设置的hive用户名填写)</value>

    <description>username to use against metastore database</description>

    </property>

    <property>

    <name>javax.jdo.option.ConnectionPassword</name>

    <value>hive(根据自己设置的hive密码填写)</value>

    <description>password to use against metastore database</description>

    </property>


    (由于hive版本不同可能会有个别配置文件的修改有不一样的地方)

    c.验证

    配置好Hive后,输入hive命令启动时会出现许多INFO和WARN信息。

    只要不报错就没什么问题,原因是新的hadoop环境废弃了某些参数。但是可以修改,网上教程我会贴在后面。

    d.启动

    在使用hive之前需要启动metastore和hiveserver服务,通过如下命令启用:

    hive --service metastore &

    hive --service hiveserver2 &(版本在centos6.8-6.9请执行hive --service hiveserver)

    启动用通过jps命令可以看到两个进行运行在后台


    e.操作验证

    登录hive,在hive创建表并查看该表,命令如下:

    hive

    hive>create table test(a string, b int);

    hive>show tables;

    hive>desc test;


    登录mysql,在TBLS表中查看新增test表:

    mysql -uhive -phive

    mysql>use hive;

    mysql>select TBL_ID, CREATE_TIME, DB_ID, OWNER, TBL_NAME,TBL_TYPE from TBLS;



    三、注意事项和bug

    a.执行hive命令出现INFO和WARN

    $HADOOP_HOME/etc/hadoop/log4j.properties中将log4j.logger.org.apache.hadoop.conf.Configuration.deprecation打开。如下:


    1. # Uncomment the following line to turn off configuration deprecation warnings.

    2. log4j.logger.org.apache.hadoop.conf.Configuration.deprecation=WARN

    无需重启Hadoop,只需要重新启动hive就会发现这些INFO都不见了。但是WARN还是会在。

    Warn的解决方法: 加入配置项

    (1)创建配置文件,直接copy默认配置文件再修改即可,用户自定义配置会覆盖默认配置
    cp $HIVE_HOME/conf/hive-default.xml.template $HIVE_HOME/conf/hive-site.xml
    cp $HIVE_HOME/conf/hive-env.sh.template $HIVE_HOME/conf/hive-env.sh
    cp $HIVE_HOME/conf/hive-exec-log4j.properties.template $HIVE_HOME/conf/hive-exec-log4j.properties
    cp $HIVE_HOME/conf/hive-log4j.properties.template $HIVE_HOME/conf/hive-log4j.properties

    (2)修改 hive-log4j.properties
    mkdir $HIVE_HOME/logs
    vi $HIVE_HOME/conf/hive-log4j.properties
    hive.log.dir=/opt/hive-1.2.1/logs

    b.在hive启动时遇到如下错误

    [grid@Hadoop4 hadoop-2.7.2]$ hive

    which: no HBase in(/home/grid/hadoop-2.7.2/bin:/usr/jdk1.8.0_91/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/grid/bin:/usr/local/apache-maven-3.3.9/bin:/home/grid/apache-ant-1.9.7/bin:/home/grid/apache-maven-3.3.9/bin:/home/grid/pig-0.16.0/bin:/home/grid/apache-hive-2.1.0-bin/bin)

    SLF4J: Class path contains multiple SLF4Jbindings.

    SLF4J: Found binding in[jar:file:/home/grid/apache-hive-2.1.0-bin/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]

    SLF4J: Found binding in[jar:file:/home/grid/hadoop-2.7.2/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]

    SLF4J: SeeSLF4J Error Codes for an explanation.

    SLF4J: Actual binding is of type[org.apache.logging.slf4j.Log4jLoggerFactory]

    Logging initialized using configuration injar:file:/home/grid/apache-hive-2.1.0-bin/lib/hive-common-2.1.0.jar!/hive-log4j2.propertiesAsync: true

    Exception in thread "main" Java.lang.IllegalArgumentException:java.net.URISyntaxException: Relative path in absolute URI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D


    解决方法:
    在hive-site.xml中添加

    <property>

    <name>system:java.io.tmpdir</name>

    <value>/home/grid/apache-hive-2.1.0-bin/tmpdir</value>

    </property>

    <property>

    <name>system:user.name</name>

    <value>hive</value>

    </property>

    c.执行 hive --service hiveserver 命令报错

    Exception in thread "main" java.lang.ClassNotFoundException: org.apache.hadoop.hive.service.HiveServer
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:274)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:205)

    解决办法: hive --service hiveserver2 使用hiveserver2

    (我说过我们使用的环境是centos7,网上会有其他版本的资料,这个问题的主因是语句更新的问题)

    d.use hive报错

    如图

    查自己数据库的表格,输入正确的名字

    e.启动hive时,出现CommandNeedRetryException异常

    Exception in thread "main" java.lang.NoClassDefFoundError:org/apache/hadoop/hive/ql/CommandNeedRetryException

    at java.lang.Class.forName0(Native Method)

    at java.lang.Class.forName(Class.java:270)

    at org.apache.hadoop.util.RunJar.main(RunJar.java:149)

    Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.ql.CommandNeedRetryException

    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)

    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)

    at java.security.AccessController.doPrivileged(Native Method)

    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)

    由于以前使用hadoop时,修改hadoop-env.sh的HADOOP_CLASSPATH配置项,由以前的:

    export HADOOP_CLASSPATH=/app/hadoop-x.x.x/myclass

    修改为:

    export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/app/hadoop-x.x.x/myclass

    五、思考

    hive在具体实践当中是什么角色?

    转载:https://zhuanlan.zhihu.com/p/27719499

  • 相关阅读:
    SQLServer多表连接查询
    SQLServer基本查询
    SQLServer索引
    SQLServer之数据类型
    设计模式小结
    SQL跨项目查询语法
    利用CountDownLatch和Semaphore测试案例
    JUC包下Semaphore学习笔记
    JUC包下CountDownLatch学习笔记
    JUC包下CyclicBarrier学习笔记
  • 原文地址:https://www.cnblogs.com/chengjunhao/p/9057976.html
Copyright © 2011-2022 走看看