第2章 Hive配置

 

内容提要

l Hive的安装

l Hive的配置文件详解

 

让我们来学习一下安装 Hadoop和Hive吧。这是学习和体验Hadoop的一个便捷的方式。之后我们将讨论如何配置Hive以了解如何在Hadoop集群上使用Hive。

如果用户已经在使用亚马逊网络服务(AWS)了,那么建立一个供学习Hive的最快速途径是在亚马逊弹性MapReduce系统(EMR)中提交一个Hive任务。我们在后面章节将会讨论这种方式。

如果用户已经会使用安装有Hive的Hadoop集群的话,那么我建议可以跳过本章的第一节,直接从第二节开始看。

 

2.1 安装Hive

虽然使用一个预先配置好的集群可能是使用Hive的一个便捷方式,但是自己安装Hadoop和Hive可以让用户更清楚地知道这些工具是如何工作的,特别是,如果用户是一个开发者的话,这个很重要。

下面所提供的指南描述的是在用户个人Linux工作站中安装Hadoop和Hive所必需的最少的步骤。对于生产环境下的安装过程,请查阅所使用的Hadoop分支推荐的安装流程。

 

2.1.1 安装Java

Hive依赖于Hadoop,而Hadoop依赖于Java。用户需要确认使用的操作系统中安装有v1.8.*版本的JVM(Java虚拟机)。尽管用户执行Hive只需要使用到JRE(Java运行时环境),但是本书中还是演示了如何使用Java编码对Hive进行扩展,因此用户还需要安装完整的JDK(Java开发工具集)来编译这些例子。但是,如果用户不是开发者,可以不进行此操作,本书所附带的源码分支版本中已经包含有编译过的例子了。安装完成后,用户需要确认Java已经存在于环境中,而且已经设置好了JAVA_HOME环境变量。

在Linux操作系统上,下面的指令是在/etc/profile目录下创建一个bash文件,其为所有的用户定义了一个JAVA_HOME环境变量,需要root访问权限才能够修改这个目录下的环境变量设置,而且修改将会影响到系统中所有用户。Oracle JVM安装程序通常会将软件安装在/usr/java/jdk-1.8.X目录下,而且会从/usr/java/default和/usr/java/latest路径建立软链接到安装路径下。

$ /usr/java/latest/bin/java –version

java version “1.8.0_189”

Java(TM) SE Runtime Environment (build 1.8.0_189)

Java HotSpot(TM) 64-Bit Server VM(build 19.0-b09,mixed mode)

$ sudo echo “export JAVA_HOME=/usr/java/latest” > /etc/profile/java.sh

$ sudo echo “PATH=$PATH:$JAVA_HOME/bin” >> /etc/profile/java.sh

$ ./etc/profile

$echo $JAVA_HOME

/usr/java/latest

注:如果之前是使用“特权账号”来执行某个命令,而不是在执行命令前使用sudo命令来执行的话(也就是需要执行的命令分为两部分:sudo 加上用户需要执行的命令),那么只需要按照提示要求输入密码即可。如果是个人计算机的话,用户账号通常就具有“sudo权限”。如果没有这个权限,可以联系管理员执行那些命令。

不过,如果用户不期望修改影响到系统里所有的用户,一个替代方案就是,将PATH和JAVA_HOME环境变量的定义加入到用户的$HOME/.bashrc文件中。

export JAVA_HOME=/usr/java/latest

export PATH=$PATH:$JAVA_HOME/bin

 

2.1.2 安装Hadoop

Hive运行在Hadoop之上。Hadoop是一个非常活跃的开源项目,其具有很多的发行版和分支。同时,很多的商业软件公司现在也在开发他们自己的Hadoop分支,有时会对某些组件进行个性化的增强或者替换。这种形式可以促进创新,但是同时也会产生潜在的混乱和兼容性问题。

保持使用最新版本的软件可以让用户使用最新的增强功能并且新版本通常会修复很多的BUG。随后,有时用户可能会发现新的BUG以及兼容性问题。本书中,我们将介绍如何安装Apache Hadoop v2.7发行版。这个版本不一定是最新稳定发行版,但是这个版本是性能和兼容性都可以依赖的一个标准版。

不过,用户应该能够毫无问题地选择一个不同版本、分支或者发行版来学习和使用Hive,也可以使用Cloudera的CDH或者MapR,以及Hortonworks分支版本。注意Cloudera,MapR以及Hortonworks分支版都包含有一个捆绑的Hive发行版。

不过,我们不建议安装新地阿尔法版的“下一代的”Hadoop v3.0版本,至少本书的目标不是这个版本。虽然这个发行版将给Hadoop生态圈带来重大的增强,但是对于我们来说太新了。

(1)下载到downloads下 

(2)tar开,放到/soft文件夹下: 

(3)创建符号链接: 

ln -s /soft/hadoop-2.7.3 /soft/hadoop 

(4)验证hadoop是否安装成功: 

cd /soft/hadoop/bin 

./hadoop version 

 

2.1.3 本地模式、伪分布式模式和分布式模式

在继续讲解之前,我们先阐明Hadoop的不同运行模式。我们前面提到默认的模式是本地模式,这种模式下使用的是本地文件系统。在本地模式下,当执行Hadoop job时(包含有大多数的Hive查询),Map task和Reduce task在同一个进程中执行。

真实的集群配置的都是分布式模式,其中所有没有完整URL指定的路径默认都是分布式文件系统(通常是HDFS)中的路径,而且由Yarn来管理job,不同的task在不同的进程中执行。

对于在个人计算机上工作的开发者来说,一个进退两难的实际问题是,本地模式并不能真实地反映真实集群的行为状况,这个是测试程序时需要记住的事情。为了解决这个需求,一台物理机可以配置成在伪分布式模式下执行。这种模式下执行的行为和在分布式模式下的行为是一致的。也就是说,引用的文件系统默认伪分布式文件系统,而且由Yarn服务来管理job,但是实际上只有一台物理机。因此,例如,HDFS文件块冗余数这时限制为一个备份。换句话说,行为类似于只有一个节点的“集群”。

因为Hive中大多数工作是使用Hadoop的job,所有Hive的行为可以反映出用户所使用的Hadoop运行模式。不过,即使在分布式模式下执行,Hive还是可以在提交查询前判断是否可以使用本地模式来执行这个查询。这时它会读取数据文件,然后自己管理MapReduce task,最终提供更快的执行方式。不过,对于Hadoop来说,不同模式之间的差异相对于部署方式更多地在于执行方式上。

本书中大部分情况下,不会关心用户使用的是哪种模式。我们将假定用户是以本地模式在个人计算机上工作的,而且我们将讨论这个模式所影响的情况。

 

注:当处理小数据集时,使用本地模式执行可以使Hive执行得更快些。设置如下这个属性sethive.exec.mode.local.auto=true;时,将会触发Hive更主动地使用这种模式,即使当前用户是在分布式模式或伪分布式模式下执行Hadoop的。如果想默认使用这个设置,可以将这个命令加到$HOME/.hiverc文件中。

 

2.1.4配置Hadoop及Hive环境

下面我们稍微深入地看看Hadoop的不同模式并讨论和Hive相关的更多配置问题。

如果用户正在一个已经存在的集群中使用Hadoop或者是使用一个虚拟机实例的话,那么可以跳过本节。如果你是一个开发者或者你是自己安装Hadoop和Hive的,你将会对本节后面的内容感兴趣。不过,我们不会提供一个完整的讨论。

上面介绍了直接解压Hadoop安装包来安装Hadoop的方式,这种方式虽然成功了,但是Hadoop使用的都是默认的配置,不会根据需要去获取想要的运行环境和运行架构,为了满足特定的需要,因此需要进行一些配置,关于Hadoop的配置(采用完全分布式架构)如下所示,

yarn-site.xml:

 

<configuration>

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

<!--开启日志-->

<property>

<name>yarn.log-aggregation-enable</name>

<value>true</value>

</property>

<!--日志删除时间(每7天)-->

<property>

<name> yarn.log-aggregation.retain-seconds</name>

<value>604800</value>

</property>

<!--修改日志目录-->

<property>

<name> yarn.nodemanager.remote-app-log-dir</name>

<value>/logs</value>

</property>

<!—Yarn的主机-->

<property>

<name> yarn.resoucemanager.hostname</name>

<value>hadoop0</value>

</property>

<!—Yarn的web端口-->

<property>

<name> yarn.resoucemanager.webapp.hostname</name>

<value>hadoop0:8088</value>

</property>

<!—Yarn的通信端口-->

<property>

<name> yarn.resoucemanager.address</name>

<value>hadoop0:8032</value>

</property>

<!—Yarn的代理服务器-->

<property>

<name> yarn.web-proxy.address</name>

<value>hadoop0:8888</value>

</property>

<!—Yarn的内存-->

<property>

<name> yarn.nodemanager.resource.memory-mb</name>

<value>8192</value>

</property>

<!—Yarn的cpu-->

<property>

<name> yarn.nodemanager.resource.cpu-vcores</name>

<value>8</value>

</property>

<!—决定数字节点能否连接到nn-->

<property>

<name> yarn.resourcemanager.nodes.include-path</name>

<value>/home/lqq/hadoop-2.7.3/etc/hadoop/nms.host</value>

</property>

<!—指定一个文件的完整路径,不可连接的节点名称-->

<property>

<name> yarn.resourcemanager.nodes.exclude-path</name>

<value>/home/lqq/hadoop-2.7.3/etc/hadoop/nms.exclude.host</value>

</property>

</configuration>

 

mapred-site.xml:

 

<configuration>

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

<!--开启Uber模式(针对小作业的优化)-->

<property>

<name>mapreduce.job.ubertask.enable</name>

<value>true</value>

</property>

<!--开启Uber模式的最大Map数-->

<property>

<name>mapreduce.job.ubertask.maxmaps</name>

<value>9</value>

</property>

<!--开启Uber模式的最大Reduce数-->

<property>

<name> mapreduce.job.ubertask.maxreduces</name>

<value>1</value>

</property>

<!—jobhistory web ui的端口-->

<property>

<name>mapreduce.jobhistory.webapp.address</name>

<value>hadoop0:19888</value>

</property>

<!—-jobhistory和mapreduce通信的端口-->

<property>

<name>mapreduce.jobhistory.address</name>

<value>hadoop0:10020 </value>

</property>

</configuration>

 

hdfs-site.xml:

 

<configuration>

<!—文件块的数据备份个数-->

<property>

<name>dfs.replication</name>

<value>3</value>

</property>

<!—-NameNode web ui端口-->

<property>

<name>dfs.namenode.http-address</name>

<value>hadoop0:50070</value>

</property>

<!—-浏览器访问secondaryNameNode的端口-->

<property>

<name>dfs.namenode.secondary.http-address</name>

<value>hadoop5:50090</value>

</property>

<!—-权限关闭(普通用户也可以操作)-->

<property>

<name>dfs.permissions.enabled</name>

<value>false</value>

</property>

<!—-决定数据节点能否连接到nn-->

<!—-指定一个文件的完整路径,没有指定,说明说有节点都可连接-->

<property>

<name>dfs.hosts</name>

<value>/home/lqq/hadoop-2.7.3/etc/hadoop/datanodes.host</value>

</property>

<!—-指定一个文件的完整路径,不可连接的节点名称-->

<property>

<name>dfs.hosts.exclude</name>

<value>/home/lqq/hadoop-2.7.3/etc/hadoop/datanodes.exclude.host</value>

</property>

</configuration>

 

core-site.xml:

 

<configuration>

<!—-集群中NameNode节点的URI(包括协议、主机名称、端口号)-->

<property>

<name>fs.defaultFS</name>

<value>hdfs://hadoop0:8020</value>

</property>

<!—-hadoop文件系统依赖的基础配置,很多路径都依赖它-->

<property>

<name>hadoop.tmp.dir</name>

<value>/home/hadoop/software/hadoop-2.7.3/data/tmp</value>

</property>

<!—-Web默认登陆用户-->

<property>

<name>hadoop.http.staticuser.user</name>

<value>hadoop</value>

</property>

<!—-删除文件保留7天-->

<property>

<name>fs.trash.interval</name>

<value>10080</value>

</property>

</configuration>

 

1) 本地模式设置

回想下,在本地模式下,所有提及的文件都存储在本地文件系统而不是分布式文件系统中。其中没有服务在运行。相反地,用户的job在同一个JVM实例中执行所有的任务。如果用户计划经常使用本地模式的话,那么非常邮必要为Derby metastore_db(这里Hive存储了用户的表等元数据信息)配置一个标准的位置。用户如果不想使用默认的路径,那么还可以配置一个不同的目录来存储表数据。对于本地模式,默认路径是file:///user/hive/warehouse,对于其他模式,默认存储路径是hdfs://namenode_server/hive/warehouse。首先,切换到$HIVE_HOME/conf目录下。好奇者可能会看到hive-default.xml.template这个大文件。这个文件中包含了Hive提供的配置属性以及默认的属性值。这些属性中的绝大多数,用户可以直接忽略不管。用户所做的配置修改只需要在hive-site.xml文件中进行就可以了。如果这个文件不存在,那么用户需要自己创建一个。

本地模式下的hive-site.xml配置文件,

 

<configuration>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/home/lqq/hive/warehouse</value>

<description>

Local or HDFS directory where Hive keeps table contents.

</description>

</property>

<property>

<name>hive.metastore.local</name>

<value>true</value>

<description>

Use false if a production metastore server is used.

</description>

</property>

<property>

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

<value>jdbc:derby:;databaseName=/home/lqq/hive/metastore_db;create=true</value>

<description>

The JDBC connection URL.

</description>

</property>

</configuration>

 

用户可以根据需要从配置文件中移除掉某些不需要改变的属性,也就是<property>…</property>标签包含的内容。

正如<description>标签内所表明的,属性hive.metastore.warehouse.dir告诉Hive在本地文件系统中使用哪个路径来存储Hive表中的数据。(这个值会追加到Hadoop配置文件中所配置的属性fs.default.name的值,其默认为file:///。)用户可以根据需要为这个属性指定任意的目录路径。

属性hive.metastore.local的默认值就是true,因此在配置文件中我们其实是没必要将这个属性加进去的。放在配置文件中更多的目的是提供文档信息。这个属性控制着是否连接到一个远程metastore server或者是否作为Hive Client JVM的构成部分重新打开一个新的metastore server。这个设置通常是设置成true的,然后使用JDBC直接和一个新的metastore server。这个设置通常是设置成true的,然后使用JDBC直接和一个关系型数据库通信。当设置成false时,Hive将会通过一个metastore server来进行通信,这个我们将在后面章节进行讨论。

属性javax.jdo.option.ConnectionURL的值对默认的值进行了简单的修改,这个属性告诉Hive如何连接metastore server。默认情况下,它使用当前的工作目录作为属性值字符串中的databaseName部分。

 

2) 分布式模式和伪分布式模式配置

在分布式模式下,集群中会启动多个服务。JobTracker管理着job,而HDFS则由NameNode管理着。每个工作节点上都有job task在执行,由每个节点上的TaskTracker服务管理着;而且每个节点上还存放有分布式文件系统中的文件数据块,由每个节点上的DataNode服务管理着。

用户可能需要配置的一个Hive属性是表存储所位于的顶级文件目录,其由属性hive.metastore.warehouse.dir指定。Apache Hadoop和MapR分支中这个属性的默认值是/user/hive/warehouse,当Hadoop配置的是分布式模式或者伪分布式模式时,这个路径被认为是分布式文件系统中的路径。为这个属性指定不同的值可以允许每个用户定义其自己的数据仓库目录,这样就可以避免影响其他系统用户。因此,用户可能需要使用如下语句来为其自己指定数据仓库目录:

 

set hive.metastore.warehouse.dir=/user/lqq/hive/warehouse

 

如果每次启动Hive-Cli或者在每个Hive脚本前都指定这行语句,那么显得过于冗长。当然,也更容易会忘记设置这个属性值。因此,最好将和这个命令类似的所有命令放置在$HOME/.hiverc文件中,每一次启动Hive都会执行这个文件。由此处开始我们将假定值是/user/hive/warehouse。

 

3) 使用JDBC连接元数据

Hive所需要的组件中只有一个外部组件是Hadoop没有的,那就是metastore(元数据存储)组件。元数据存储中存储了存储了如表的模式和分区信息等元数据信息。用户在执行如create table x…或者alter table y…等命令时会指定这些信息。因为多用户和系统可能需要并发访问元数据存储,所以默认的内置数据库并不适用于生产环境。

任何一个适用JDBC进行连接的数据库都可用作元数据存储。在实践中。大多数的Hive客户端会使用MySQL。我们也将讨论如何使用MySQL来进行元数据存储。执行过程对于其他适用于JDBC连接的数据库都是适用的。

 

注:像表的模式信息、分区信息等这些必须的元数据,其信息量时很小的,通常比存储在Hive中的数据的量要少的多。因此,用户其实无需为元数据存储提供一个强劲的专用数据库服务器。不过,因为这是一个单点问题(SPOF),所以强烈建议用户使用对于其他关系型数据库实例同样适用的标准技术来对这个数据库进行冗余存储和数据备份。这里我们不会探讨这些技术。

 

对于MySQL配置,我们需要知道指定服务运行在哪个服务器和端口。我们将假定是在db1.mydomain.pvt服务器的3306端口上,这个端口也是标准的MySQL端口。最后,我们假定存储数据库名为hive_db。以下定义了这些属性。

 

<configuration>

<property>

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

<value>jdbc:mysql://db1.mydomain.pvt/hive_db?createDatabaseIfNotExist=true</value>

<description>

Local or HDFS directory where Hive keeps table contents.

</description>

</property>

<property>

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

<value>com.mysql.jdbc.Driver</value>

</property>

<property>

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

<value>lvqianqian</value>

</property>

<property>

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

<value>19960913</value>

</property>

</configuration>

 

用户可能已经注意到ConnectionURL属性值前缀是jdbc:mysql。

为了使Hive能够连接上MySQL,我们需要将JDBC驱动放置在类路径下。MySQL JDBC驱动(Jconnector)可以从如下网址下载:http://www.mysql.com/downloads/connector/j/。这个驱动可以放置在Hive的库路径下,也就是$HIVE_HOME/lib目录下。有些团队会将所有这些支持类的库放置在Hadoop的库目录下。

驱动和配置设置正确后,Hive就会将元数据信息存储到MySQL。

以上就是关于Hive的安装以及配置的过程。

 

练 习

2.1 怎么安装并且配置Hive完全分布式环境?

2.2 Hive怎么使用外部数据库?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值