CDH5.10.0 手动安装 hive-1.1.0-cdh5.10.0

当时我在搭 Hadoop 集群的时候使用的是 CDH 的包,详情可以参考 CentOS7 搭建 Hadoop 2.6.0 集群,所以现在要支持 Hive,就直接用 CDH 对应版本的 hive 包来安装,兼容性有保障。

CDH Hive 1.1.0 包下载地址:http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.10.0.tar.gz

说到 Hive 可能就会有人提 HBase,HBase 是一种分布式、面向列的 NoSQL 数据库,基于 HDFS 存储,以表的形式存储数据,表由行和列组成,列划分到列族中。HBase 不提供类 SQL 查询语言,要想像 SQL 这样查询数据,可以使用 Phonix,让 SQL 查询转换成 HBase 的扫描和对应的操作,也可以使用现在说讲 Hive 仓库工具,让 HBase 作为 Hive 存储。

Hive 是运行在 Hadoop 之上的数据仓库,将结构化的数据文件映射为一张数据库表,提供简单类 SQL 查询语言,称为 HQL,并将 SQL 语句转换成 MapReduce 任务运算。有利于利用 SQL 语言查询、分析数据,适于处理不频繁变动的数据。Hive 底层可以是 HBase 或者 HDFS 存储的文件。

两者都是基于 Hadoop 上不同的技术,相互结合使用,可处理企业中不同类型的业务,利用 Hive 处理非结构化离线分析统计,利用 HBase 处理在线查询。

MySQL 安装配置

因为 Hive 需要存储 MetaStore 元数据信息,所以需要一个外部数据库,内嵌独立的 Hive 环境使用内嵌的 Derby 数据库存储,但是 Derby 存在一个严重的缺陷,一次只能打开一个会话。所以在生产环境下,我们需要安装一个 MySQL,Hadoop 其它组件有很多也是需要如此的。

一般来说,集群上的 MySQL 都是安装在 NameNode 节点的,Hive 也是安装在 NameNode 和 Secondary NameNode 上的。

延续上次的集群环境,我们把 MySQL 和 Hive 安装在 hd-node1 节点。

安装 MySQL 之前最好确认一下 Linux 发行版上是否预置了 MySQL 或者 MariaDB,如果有的话需要先卸载删除。具体安装、配置操作可以参考 Linux 中使用压缩包方式安装 MySQL 数据库

如果不想使用压缩包方式安装,直接使用源安装:

# 安装
yum -y install mysql-server mysql mysql-devel

# 启动
service mysqld start

# 登录,源安装 mysql 账号为 root 密码默认为空
mysql -uroot -p

登录MySQL,为 Hive 创建一个 MySQL 用户,用户名和密码都是 hive,并且赋予权限。

create user 'hive'@'%' identified by 'hive';
grant all on *.* to 'hive'@'%' identified by 'hive';
flush privileges;

解压 Hive 包

下载好 hive-1.1.0-cdh5.10.0.tar.gz 包后,解压到 /opt/ 目录,然后添加环境变量。

[root@hd-node1 downloads]# tar -zxvf hive-1.1.0-cdh5.10.0.tar.gz -C /opt/

[root@hd-node1 opt]# vim /etc/profile

#添加如下配置
export HIVE_HOME=/opt/hive-1.1.0-cdh5.10.0
export PATH=$PATH:$HIVE_HOME/bin

[root@hd-node1 opt]# source /etc/profile

配置 Hive

在这之前我们先创建一个文件夹,主要是给 Hive 运行的时候存储临时文件的。

[root@hd-node1 opt]# mkdir -p /opt/data/hive/

hive-site.xml

编辑 hive-site.xml 文件。

[root@hd-node1 conf]# vim /opt/hive-1.1.0-cdh5.10.0/conf/hive-site.xml

添加配置:

<configuration>
    <!--  MySQL 连接配置  -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://hd-node1: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</value>
        <description>username to use against metastore database</description>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>hive</value>
        <description>password to use against metastore database</description>
    </property>

    <!--  hwi,WEB 端  -->
    <property>
        <name>hive.hwi.war.file</name>
        <value>lib/hive-hwi-1.1.0-cdh5.10.0.jar</value>
        <description>This sets the path to the HWI war file, relative to ${HIVE_HOME}. </description>
    </property>
    <property>
        <name>hive.hwi.listen.host</name>
        <value>0.0.0.0</value>
        <description>This is the host address the Hive Web Interface will listen on</description>
    </property>
    <property>
        <name>hive.hwi.listen.port</name>
        <value>9999</value>
        <description>This is the port the Hive Web Interface will listen on</description>
    </property>
    <!--  Hive 临时文件存储地址  -->
    <property>
        <name>hive.exec.scratchdir</name>
        <value>/opt/data/hive/hive-${user.name}</value>
        <description>Scratch space for Hive jobs</description>
    </property>
    <property>
        <name>hive.exec.local.scratchdir</name>
        <value>/opt/data/hive/${user.name}</value>
        <description>Local scratch space for Hive jobs</description>
    </property>
</configuration>

MySQL 驱动

上传 MySQL JDBC 的 jar 到 Hive 的 lib 目录下。

[root@hd-node1 lib]# ll | grep mysql
-rw-r--r--   1 root root  1004838 Sep 21 11:53 mysql-connector-java-5.1.46.jar

hive-env.xml

修改 hive-env.xml,先将 hive-env.sh.template 复制一份为 hive-env.sh

[root@hd-node1 opt]# cd /opt/hive-1.1.0-cdh5.10.0/conf
[root@hd-node1 conf]# cp hive-env.sh.template hive-env.sh

修改如下内容:

# Set HADOOP_HOME to point to a specific hadoop install directory
# HADOOP_HOME=${bin}/../../hadoop
HADOOP_HOME=/opt/hadoop-2.6.0-cdh5.10.0

# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/opt/hive-1.1.0-cdh5.10.0/conf

# Folder containing extra ibraries required for hive compilation/execution can be controlled by:
export HIVE_AUX_JARS_PATH=/opt/hive-1.1.0-cdh5.10.0/lib

启动 Hive

Hive 其实就是 Hadoop 平台上的一个工具,它把前端的 HQL 解析、分解成 MapReduce 任务,提交执行。

所以一般使用 Hive 有两种方式,CLI 和 Server。

可以在服务器上直接使用 hive 命令(记得上面配置了环境变量),打开一个交互式的 CLI 命令窗口,可以直接使用,但是离开窗口后,会话即结束,比较方便测试和调试使用。

[root@hd-node1 opt]# hive
which: no hbase in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/jdk1.8.0_112/bin:/opt/mysql/bin:/opt/hadoop-2.6.0-cdh5.10.0/bin:/opt/hive-1.1.0-cdh5.10.0/bin:/opt/sqoop-1.4.7/bin:/root/bin)
WARNING: Hive CLI is deprecated and migration to Beeline is recommended.
hive>

作为一个服务,在生产环境上需要常驻内存,使用 nohup hive --service hiveserver2 & 来使 Hive 作为后台进程运行,并且向外部提供 Thrift 、JDBC 服务。

[root@hd-node1 opt]# nohup hive --service hiveserver2 &
[root@hd-node1 opt]# ps -ef | grep hive
root      92329      1  0 Sep26 ?        00:01:31 /opt/jdk1.8.0_112/bin/java -Xmx256m -Djava.net.preferIPv4Stack=true ....
root     114259 113392  0 18:41 pts/0    00:00:00 grep --color=auto hive

问题

这里是用 CDH 的组件包来安装集群的,如果使用 Apache 原生的包来安装 Hadoop 和 Hive,在启动 Hive 的时候可能会遇到两个问题。

Exception in thread “main” java.lang.RuntimeException: java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:444)
at

处理办法:在配置文件 hive-site.xml 里找到所有 ${system:java.io.tmpdir},把他们都换成绝对路径如:/opt/apache-hive-1.1.0-bin/tmp

[ERROR] Terminal initialization failed; falling back to unsupported
java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected

原因:Hadoop 目录下存在老版本 jline

[root@hd-node1 lib]# ll
/opt/hadoop-2.6.0/share/hadoop/yarn/lib/:
-rw-r–r– 1 root root 87325 Mar 10 18:10 jline-0.9.94.jar

解决办法:

cp /opt/apache-hive-1.1.0-bin/lib/jline-2.12.jar /opt/hadoop-2.6.0/share/hadoop/yarn/lib/

简单使用

Hive 在操作语句使用上和 MySQL 非常类似。

hive> 
    > show databases;
OK
book
default
test
test_data_100w
Time taken: 0.014 seconds, Fetched: 4 row(s)

先创建一个测试库。

hive> create database hive;
OK
Time taken: 0.318 seconds
hive> use hive;
OK
Time taken: 0.011 seconds

创建 user 表,并指定字段分隔符为 tab 键(否则会插入 NULL)。

hive> create table user(id int, username string, password string) row format delimited fields terminated by '\t';
OK
Time taken: 0.193 seconds
hive> desc user;
OK
id                      int                                         
username                string                                      
password                string                                      
Time taken: 0.092 seconds, Fetched: 3 row(s)

如果想再创建一个表,而且表结构和 user 一样,可以这样:

hive> create table tbl like user;

插入表数据:

hive> insert into user values (1, 'hive', 'hive');
Query ID = root_20180927185454_18c77878-ab49-48ed-8358-7d0e00b9fb12
Total jobs = 3
Launching Job 1 out of 3
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1537502204300_0048, Tracking URL = http://hd-node1:8088/proxy/application_1537502204300_0048/
Kill Command = /opt/hadoop-2.6.0-cdh5.10.0/bin/hadoop job  -kill job_1537502204300_0048
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0
2018-09-27 18:54:56,371 Stage-1 map = 0%,  reduce = 0%
2018-09-27 18:55:01,549 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 2.34 sec
MapReduce Total cumulative CPU time: 2 seconds 340 msec
Ended Job = job_1537502204300_0048
Stage-4 is selected by condition resolver.
Stage-3 is filtered out by condition resolver.
Stage-5 is filtered out by condition resolver.
Moving data to: hdfs://hd-node1:8020/user/hive/warehouse/hive.db/user/.hive-staging_hive_2018-09-27_18-54-35_502_1921460975380974032-1/-ext-10000
Loading data to table hive.user
Table hive.user stats: [numFiles=1, numRows=1, totalSize=12, rawDataSize=11]
MapReduce Jobs Launched: 
Stage-Stage-1: Map: 1   Cumulative CPU: 2.34 sec   HDFS Read: 3496 HDFS Write: 77 SUCCESS
Total MapReduce CPU Time Spent: 2 seconds 340 msec
OK
Time taken: 28.395 seconds

可以看到 Hive 将插入 SQL 语句解析为 Job 任务提交给 MapReduce 执行,写入数据到 HDFS 存储上。

查询表数据:

hive> select * from user;
OK
1    hive    hive
Time taken: 0.044 seconds, Fetched: 1 row(s)

从本地文件中导入数据到 Hive 表

先创建数据文件,键值要以 tab 键空格:

# cat seasons.txt
1    spring
2    summer
3    autumn
4    winter

再导入数据:

hive> create table tb1(id int,name string) row format delimited fields terminated by '\t';
hive> load data local inpath '/root/seasons.txt' overwrite into table tb1;

查询是否导入成功

hive> select * from tb1;
OK
1    spring
2    summer
3    autumn
4    winter

从 HDFS 中导入数据到 Hive 表

列出 hdfs 文件系统根目录下的目录:

hadoop dfs -ls /

创建 test 根目录

hadoop dfs -mkdir /test

然后用 put 命令向 /test 目录写入文件为 siji.txt

hadoop dfs -put /root/seasons.txt /test/siji.txt

查看 siji.txt 文件内容

# hadoop fs -cat /test/siji.txt
18/09/27 17:03:34 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
1    spring
2    summer
3    autumn
4    winte

导入数据到 Hive。

hive> load data inpath '/test/siji.txt' overwrite into table table2;
Loading data to table test.table2
Table test.table2 stats: [numFiles=1, numRows=0, totalSize=36, rawDataSize=0]
OK
Time taken: 0.336 seconds
如果觉得这对你有用,请随意赞赏,给与作者支持
评论 0
最新评论