这里假设你已经配置好了 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 时的目录(注意,是本地目录)下:即:
如果我们在home下面进入hive,那么我们的metastore_db,就会产生在home目录下。
如果我们在/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!! 感谢阅读。