Hive 2. 本地模式,分布式配置

来源:互联网 发布:linux网卡怎么激活 编辑:程序博客网 时间:2024/06/07 00:10

这里假设你已经配置好了 Hadoop 分布模式

本地模式的配置

如果Hadoop在本地模式下,所有的文件都会存储在本地文件系统中,而不是分布式文件系统中。用户的 job 都在同一个JVM实例中执行所有的任务。

如果用户经常使用本地模式,那么就必要为 Derdy metastore_db 配置一个标准的位置。

如果用户可以指定一个不同的目录来存储表数据。本地模式下,默认的路径是:

file:///user/hive/warehouse

而 Hadoop 其他模式中,Hive 数据默认的存储路径是在 HDFS:

hdfs://namenode_server/user/hive/warehouse

hive 的配置文件在 conf/hive-site.xml,没有就自己新建一个便可,有一个 hive-default.xml.remplate 里面存放的是 Hive 的默认配置,无需多管。
本地模式下的配置如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration>        <property>                <name>hive.metastore.warehouse.dir</name>                <value>/usr/hive-data/warehouse</value>        </property>        <property>                <name>hive.metastore.local</name>                <value>true</value>        </property>        <property>                <name>javax.jdo.option.ConnectionURL</name>                <value>jdbc:derdy:;databaseName=/usr/hive-data/metastore_db;create=true</value>        </property></configuration

解释一下:

hive.metastore.warehouse.dir

告诉 Hive 在本地文件系统中使用哪个路径来存放 Hive 表的数据。

hive.metastore.local

他的默认属性就是 true,这个属性控制这是否连接到一个远程 metastore server 或者是否作为 Hive Client JVM 的构成部分重新打开一个新的 metastore server。

  • 设置为true,所以就使用 JDBC 直接和一个关系性数据库通信。

  • 设置为false,Hive 将会通过一个 matestore server 来进行通信。”
    这里可能不知道其说的什么,之后会讲。

javax.jdo.option.ConnectionURL

这个属性是告诉 Hive 如何连接 metaserver。 默认情况下,databaseName= 的值是使用的相对路径”databaseName=metastore_db”,所以默认情况下 Derby 的元数据会存放在你执行 hive 时的目录(注意,是本地目录)下:即:

  1. 如果我们在home下面进入hive,那么我们的metastore_db,就会产生在home目录下。

  2. 如果我们在/usr目录下进入hive,那么我们的metastore_db,就会产生在usr目录下。

很麻烦,所以这里我们修改了一下,这样在每次开启一个 Hive 会话时,就创建在一个固定的目录中,Hive 就无法自动删除当前目录下的 metastore_db 目录了。而且现在,我么不管在哪个目录下敲命令行都可以访问到所有的元数据。

注意:这里有个问题,有时候你会发现配置之后 hive 命令运行抛出异常。提示为无法创建目录,这是因为权限不足。
像上面的配置,由于 /usr 目录的所有者是 root, 你的普通用户执行 hive 时就无法创建目录,所以这时可以提前在 /usr 中创建 hive-data 目录,并把他的所有者改为当前普通用户。 chown 用户名:用户组 /usr/hive-data

伪分布模式与全分布模式。

当然这里假定你已经配置好了 Hadoop 的全分布或伪分布模式。

主要是配置 hive.metastore.warehouse.dir ,默认值是 /user/hive/warehouse. 当然这里的路径指的是 HDFS 中的路径。

这个值允许用户定义自己的数据仓库目录,这样就能避免影响其他系统用户,所以可以在启动 hive 命令行时执行下面的语句来设置自己的路径:

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

因为现在我们是自己一个人玩,所以先可以在 hive-site.xml 中直接设置:

        <property>                <name>hive.metastore.warehouse.dir</name>                <value>/user/yourName/hive/warehouse</value>        </property>

使用JDBC连接存放元数据的数据库

Hive 所需要的组件中只有一个外部组件是 Hadoop 中没有的,那就是存放表元数据用的 metastore 组件(真实的数据是在文件中),一般指的就是数据库,除了其内置的 Derby 之外,一般使用 mysql 来存储。而其中 Derby 不支持多用户并发访问,所以他并不适合实际的生产环境。

如题目,只要数据库能够用 JDBC 建立连接,就可以被征用成 metastore 组件。这里用 mysql。所以要连接数据库,就要知道他的服务所在的地址与端口。我们假定:

  • 服务器主机名: db1.mydomain.pvt
  • 端口:mysql的端口, 3306
  • 数据库名: hive_db

hive-site.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration>        <property>                <name>hive.metastore.warehouse.dir</name>                <value>/user/yourName/hive/warehouse</value>        </property>        <property>                <name>javax.jdo.option.ConnectionURL</name>                <value>jdbc:mysql://db1.mydomain.pvt/hive_db?createDatabaseIfNotExist=true</value>        </property>        <property>                <name>javax.jdo.option.ConnectionDriverName</name>                <value>com.mysql.jdbcDriver</value>        </property>        <property>                <name>javax.jdo.option.ConnectionUserName</name>                <value>userName</value>        </property>        <property>                <name>javax.jdo.option.ConnectionPassword</name>                <value>password</value>        </property></configuration>    

这里不解释。关于驱动,就直接放在 Hive目录下的 bin 目录下就行。

配置好配置文件之后,打开 hive 命令行工具。创建一个表:

create table x (id int, name string);

创建成功后,可以在 /user/yourName/hive/warehouse/ 目录下,可以找到一个名为x的目录,即为代表该x表的目录。

End!! 感谢阅读。

0 0
原创粉丝点击