作业任务:安装Hive,有条件的同学可考虑用mysql作为元数据库安装(有一定难度,可以获得老师极度赞赏),安装完成后做简单SQL操作测试。将安装过程和最后测试成功的界面抓图提交 .
已有的当前虚拟机:
总共三台虚拟机,使用CentOS。一台是NameNode,另两台为DataNode,由于搭载虚拟机的内存不是很足,所以不打算再新增一台虚拟机来另外安装mysql,所以选择其中一台datanode虚拟机来安装mysql,由于很早时候已经安装布署了hadoop,所以不再累述hadoop如何安装使用:
主机名 | 作用 | 将要布置的工作 |
bogon | hadoop的NameNode节点 | 安装hive client |
DataNode1 | hadoop的DataNode节点 | 安装mysql,安装hive metastore server |
DataNode2 | hadoop的DataNode节点 | |
安装的系统或软件版本:
CentOs 6.3 32位,
jdk 1.7_u45,
hadoop 1.2.1,
hive 0.12.0,
mysql 5.7.3 Linux 32位 社区版
第一步:下载安装mysql:
由于我要安装的是mysql是linux版本,为保证软件最新和官方性,所以我都是从官方网站下载。这里我要吐嘈一下,不知为何现在的官方网站只提供window版的安装包,对于其他版本的安装包和源码都没有明显的下载链接,不知是Oracle以后为了不开源而作准备了,我在官网查了半天,才在说明书上查找到了下载的镜像站点列表: http://dev.mysql.com/downloads/mirrors.html,
随便找一个镜像链接,点击FTP就可以查看到最新的下载安装包
这里我下载使用的是linux版二进制包文件,下载并放置在DataNode1主机内:
注意:用二进制包手动安装会比较繁琐,而且如果稍有不注意都会有各种问题发生,我因为解决各种问题而在安装mysql方面花费了不少时间。如果你觉得麻烦,还是建议你用rpm安装包更简单些。
解压二进制包:
建立mysql专用的帐号和群组,并更改mysql安装目录为的所属人和群组为新建立的帐号和群组:
建议:从这一步开始到mysql启动,应该转换成root帐号来操作了,否则在往后的mysql操作当中,会有很多因权限不足导致安装设置失败的问题。如果你的mysql仅仅用来学习测试,且虚拟机并非商用无入侵风险,可以忽略此步骤。
运行初始化脚本,建立mysql原始数据库,在安装目录下执行:scripts/mysql_install_db –-user=mysql --datadir=/var/lib/mysql
注意:如果你已经跳过之前的第3步,那么这里的—user改为用root;另外datadir参数是可选参数,指定核心数据库文件的安装位置,虽然这是可选参数,但我在忽略后执行过程发现会默认安装到安装目录下的一个子目录(好像是data子目录),这与mysql配置文件中指定的目录位置不一样(配置文件指定的位置是/var/lib/mysql),所以在执行时最好带上这个选项,否则在启动mysql时会因找不到核心数据库而启动不成功。这也是很多情况下,手动安装mysql时出现各种问题的诸多原因,要么是权限问题、要么是缺少某些文件或者配置又不对……
执行时可能会出现以下这样的错误:
这是缺少的libaio软件的错误提示,用yum安装:
以下是初始化原始数据库成功的提示:
将mysql安装目录设为root权限,其子目录为mysql权限:
提示:如果你的mysql仅仅用来学习测试,且虚拟机并非商用无入侵风险,可以忽略此步骤。
将子目录plugin的可写权限去除(防止select…into dumpfile语句将执行代码写入文件):
提示:如果你的mysql仅仅用来学习测试,且虚拟机并非商用无入侵风险,可以忽略此步骤。
在mysql安装目录下运行:bin/mysqld_safe --user=mysql &,并测试mysql是否运行正常:
提示:如果你在之前跳过了第3和第5步,那么这里的参数user就直接使用root。
在启动过程中,如果提示找不到/tmp/mysql.sock,查找了tmp目录,确实没有这个文件。查看下/etc/my.cnf配置文件:
发现该文件在/var/lib/mysql目录下。这样我做个文件链接:
再kill掉mysqld_safe进程,重启一次mysql:
再次检测运行情况:
OK,正常返回数据库的信息!
总结:我是纯折腾自己才手动安装mysql,实际上可以下载rpm包安装的,但我只是想体验下手动安装过程。虽然在上面写的貌似有些简单,但实际上这个过程中对于我这个从没用linux安装过mysql的初学者来说是相当折磨人的。
第二步、下载安装hive:
1、在NameNode节点下解压安装Hive:
解压后:
注意:如果解压后所属用户和群组都是root,如果你不是用root操作,建议将所属用户和群组改为你的常用帐号和群组。
2、添加和编辑环境变量:
此步骤在安装了mysql的DataNode1的主机也执行一次。
3、重新登录一次使上面设置的环境变量生效,然后启动hadoop。在HDFS中建立/tmp目录和/user/hive/warehouse目录,设置两目录的所属群组有写入权限:
注意:这里设置的目录是hive存放缓存和数据库文件,用的是默认目录。
4、在hive目录的conf目录下,将hive-default.xml.template和hive-env.sh.template两个配置模板文件复制一份,并更名为以下:
这段时间为了能成功设置hive,一开始犯个了低级错误,我以为只是将.template后缀去除即可,谁知道这其中的hive-default.xml.template并非如此,不仅去掉.template后缀,还要改为hive-site.xml……,导致了我的后期的设置从过年前一直弄到年后都不成功!我还以为我的mysql出了什么问题,查阅了相当多的资料也不知怎么回事……!真想去官网吐嘈一下!
编辑hive-env.sh:
编辑hive-site.xml:
(1)设置metaStore存在指定的mysql,该值模式:
jdbc:mysql://<hostname>/<database name>?createDatabaseIfNotExist=true
(2)设置连接mysql的驱动为jdbc:
(3)设置连接mysql使用的帐号和密码,为了简便这里都用hive为帐号和密码:
(4)设置hive的表数据存放路径:(这里默认不修改,因为与刚才在hdfs建立的路径一致)
(5)设置Thrift metastore Server,格式thrift://<host_name>:<port>,host_name就是DataNode1主机,端口号使用默认的9083:
7、在mysql官方网下载最新的mysql连接器,存放在hive安装目录下的lib目录:
8、将安装配置好的hive安装目录复制一份到DataNode1主机的相同目录内,这里用了scp命令:
9、回到DataNode1主机,在mysql目录下执行mysql客户端:
10、创建hive数据库,并创建hive帐号并赋予权限:
11、在namenode主机下,启动hadoop:(如果在这之前已经启动,此步骤请忽略)
12、在DataNode1主机下,启动hive metastore服务:
13、然后回到namenode下,启动hive客户端:
14、测试下:
以下是遇到的hive错误:
- 配置文件格式的错误:
这是hive的0.12.0 release发行版的专有错误,错在hive-site.xml配置文件格式有误。将此文件中的2000行处的</auth>结尾处更正过来即可(真不明白发行版是怎么出来的,这种明显的错误也会在发行时显现):
2、version information not found in metastore(版本信息找不到):
看过网上的解决方案是在配置文件中将hive-site.xml 里面 hive.metastore.schema.verification 的值改为 false后不会出现问题。
根据错误检查了下ObjectStore.java源代码,该异常会在检查metastore的版本号时,如果从metastore数据源中没有返回版本号,则会根据上面所说的schema.verification来确定是否招抛出这个异常:
由于第一次启动metastore服务时,mysql作为数据源的hive数据库内没有生成任何表和数据,所以会出现返回的版本号为空的情况。我们可以暂时在hive.metastore.schema.verification里设置成false,在第一次启动自动生成了数据后,那么就可以将这个配置值再改回true,往后也相关无事了。在我看来,其实是hive在配置远端metastore的一个小bug。
3、MetaException:specified key was too long……
与数据库的编码格式有关,将数据库的编码改为: