在大数据生态圈里,Hive作为数据仓库工具已经服务了十几年。3.1.2版本是目前稳定分支中的较新版本,相比老版本优化了ACID事务支持,增强了LLAP引擎性能,特别适合需要SQL接口操作Hadoop集群的场景。而MariaDB作为MySQL的分支,完全兼容MySQL协议,在元数据管理方面比Derby更稳定可靠,社区支持也更活跃。
我选择这个组合主要基于三个实际考量:
建议准备至少4核CPU、8GB内存的服务器(虚拟机也可)。需要提前安装:
JAVA_HOME、HADOOP_HOME环境变量已配置重要提示:所有节点的时间必须同步!时区建议统一设置为UTC,避免后期分区表出现时间错乱问题。
在元数据存储节点执行:
bash复制# CentOS系统
sudo yum install mariadb-server mariadb
sudo systemctl start mariadb
sudo mysql_secure_installation
配置关键参数(/etc/my.cnf):
ini复制[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
transaction-isolation=READ-COMMITTED
创建专属数据库和用户:
sql复制CREATE DATABASE hive_metadata DEFAULT CHARACTER SET utf8;
CREATE USER 'hiveuser'@'%' IDENTIFIED BY 'yourpassword';
GRANT ALL ON hive_metadata.* TO 'hiveuser'@'%';
FLUSH PRIVILEGES;
下载apache-hive-3.1.2-bin.tar.gz后:
bash复制tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt
mv /opt/apache-hive-3.1.2-bin /opt/hive
配置环境变量(~/.bashrc):
bash复制export HIVE_HOME=/opt/hive
export PATH=$PATH:$HIVE_HOME/bin
创建hive-site.xml($HIVE_HOME/conf/):
xml复制<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://your_db_server:3306/hive_metadata?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.mariadb.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hiveuser</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
</property>
</configuration>
拷贝MariaDB JDBC驱动到lib目录:
bash复制cp mariadb-java-client-2.7.2.jar $HIVE_HOME/lib/
初始化元数据库:
bash复制schematool -dbType mysql -initSchema
后台运行模式:
bash复制nohup hive --service metastore > /var/log/hive/metastore.log 2>&1 &
验证服务:
bash复制netstat -tulnp | grep 9083
创建测试表:
sql复制CREATE TABLE test_hive (id INT, name STRING);
INSERT INTO test_hive VALUES (1, '安装验证');
SELECT * FROM test_hive;
检查HDFS目录:
bash复制hadoop fs -ls /user/hive/warehouse/test_hive
错误现象:
code复制Caused by: java.sql.SQLException: Access denied for user...
解决方案:
SHOW GRANTS FOR 'hiveuser'@'%'Hive 3.1.2与Hadoop 2.x可能存在兼容问题,建议搭配:
确保三处编码一致:
hive.resultset.use.unique.column.names=false定期备份命令:
bash复制mysqldump -u hiveuser -p hive_metadata > hive_metadata_$(date +%Y%m%d).sql
配置多个Metastore实例时:
xml复制<property>
<name>hive.metastore.uris</name>
<value>thrift://node1:9083,thrift://node2:9083</value>
</property>
在hive-env.sh中增加:
bash复制export HADOOP_HEAPSIZE=2048
export HIVE_METASTORE_HEAPSIZE=1024
我在实际生产环境中发现,当分区数超过5万时,需要特别调整metastore.server.max.message.size参数以避免RPC超时。另外建议定期执行ANALYZE TABLE更新统计信息,这对查询优化器非常重要