基于Docker搭建Hadoop+Hive

1,021 阅读7分钟

本文档参考:zhuanlan.zhihu.com/p/242658224…

hadoop部分

一、拉取镜像

docker pull registry.cn-hangzhou.aliyuncs.com/hadoop_test/hadoop_base

二、运行容器

进入容器看worker里面有三台机子,分别是Master、Slave1、Slave2

#随意建立个容器查看配置情况
docker run -it --name hadopp-test registry.cn-hangzhou.aliyuncs.com/hadoop_test/hadoop_base
#查看系统变量路径
vim etc/profile
#查看worker情况
vim /usr/local/hadoop/etc/hadoop/workers
  • 建立hadoop用的内部网络
#指定固定ip号段
docker network create --driver=bridge --subnet=172.19.0.0/16  hadoop
  • 建立Master容器,映射端口

10000端口为hiveserver2端口,后面本地客户端要通过beeline连接hive使用,有其他组件要安装的话可以提前把端口都映射出来,毕竟后面容器运行后再添加端口还是有点麻烦的

docker run -it --network hadoop -h Master --name Master -p 9870:9870 -p 8088:8088 -p 10000:10000 registry.cn-hangzhou.aliyuncs.com/hadoop_test/hadoop_base bash
  • 创建Slave1容器
docker run -it --network hadoop -h Slave1 --name Slave1 registry.cn-hangzhou.aliyuncs.com/hadoop_test/hadoop_base bash
  • 创建Slave2容器
docker run -it --network hadoop -h Slave2 --name Slave2 registry.cn-hangzhou.aliyuncs.com/hadoop_test/hadoop_base bash
  • 三台机器,都修改host vim /etc/hosts
172.20.0.4	Master
172.20.0.3	Slave1
172.20.0.2	Slave2

三、启动hadoop

虽然容器里面已经把hadoop路径配置在系统变量里面,但每次进入需要运行source /etc/profile才能生效使用

  • 进入master,启动hadoop,先格式化hdfs
#进入Master容器
docker exec -it Master bash
#进入后格式化hdfs
root@Master:/# hadoop namenode -format

注意:上述的shell脚本若无法执行需要先执行环境变量:soure /etc/profile

  • 启动全部,包含hdfs和yarn
root@Master:/usr/local/hadoop/sbin# ./start-all.sh

可以通过ip加8088和ip加9870进行验证

ScreenClip.png 上述是采用了虚拟安装,虚拟机的地址是192.168.75.100 查看分布式文件系统状态

root@Master:/usr/local/hadoop/sbin# hdfs dfsadmin -report

Hive部分

一、解压安装包

# 拷贝安装包进Master容器
docker cp apache-hive-3.1.3-bin.tar.gz Master:/usr/local
# 进入容器
docker exec -it Master bash
cd /usr/local/
# 解压安装包
tar xvf apache-hive-3.1.3-bin.tar.gz

二、修改配置文件

root@Master:/usr/local/apache-hive-3.1.2-bin/conf# cp hive-default.xml.template hive-site.xml
root@Master:/usr/local/apache-hive-3.1.2-bin/conf# vim hive-site.xml

在最前面添加下面配置:

<property>
    <name>system:java.io.tmpdir</name>
    <value>/tmp/hive/java</value>
</property>
<property>
    <name>system:user.name</name>
    <value>${user.name}</value>
</property>
<property>
     <name>hive.metastore.stringstore.encoding</name>
     <value>UTF-8</value>
 </property>

三、配置Hive相关环境变量

vim /etc/profile

#文本最后添加
export HIVE_HOME="/usr/local/apache-hive-3.1.2-bin"
export PATH=$PATH:$HIVE_HOME/bin 

配置后执行source /etc/profile 生效

source /etc/profile

四、配置mysql作为元数据库

  • 拉取Mysql镜像并生产容器
#拉取镜像
docker pull mysql:5.6

#建立容器,注意这里的mysql是用来存放hive的元数据的,所以和hadoop安装的必须在同一网络;还需制定配置文件,解决编码问题
docker run --name mysql_hive -p 3306:3306 --net hadoop --ip 172.19.0.5 -v /root/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.6 -v /mydata/mysql/conf:/etc/mysql

#进入容器
docker exec -it mysql_hive bash


mysql -uroot -p
#密码上面建立容器时候已经设置root
#建立hive数据库
create database hive DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
#修改远程连接权限
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

  • 回去Master容器,修改关联数据库的配置
docker exec -it Master bash
vim /usr/local/apache-hive-3.1.2-bin/conf/hive-site.xml

修改数据库连接信息

#还请注意hive配置文件里面使用&amp;作为分隔,高版本myssql需要SSL验证,在这里设置关闭
  <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>root</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://172.19.0.5:3306/hive?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <property>
        <name>hive.metastore.schema.verification</name>
    <value>false</value>
    <property>
  • mysql驱动上传到hive的lib下
#前面已经跟hive安装包一起上传到容器/usr/local目录
root@Master:/usr/local# cp mysql-connector-java-5.1.49.jar /usr/local/apache-hive-3.1.2-bin/lib
  • jar包配置修改 对hive的lib文件夹下的部分文件做修改,不然初始化数据库的时候会报错
#slf4j这个包hadoop及hive两边只能有一个,这里删掉hive这边
root@Master:/usr/local/apache-hive-3.1.2-bin/lib# rm log4j-slf4j-impl-2.10.0.jar

#guava这个包hadoop及hive两边只删掉版本低的那个,把版本高的复制过去,这里删掉hive,复制hadoop的过去
root@Master:/usr/local/hadoop/share/hadoop/common/lib# cp guava-27.0-jre.jar /usr/local/apache-hive-3.1.2-bin/lib
root@Master:/usr/local/hadoop/share/hadoop/common/lib# rm /usr/local/apache-hive-3.1.2-bin/lib/guava-19.0.jar

#把文件hive-site.xml第3225行的特殊字符删除
root@Master: vim /usr/local/apache-hive-3.1.2-bin/conf/hive-site.xml

五、初始化元数据库

初始化前需要修改元数据库的编码配置 若配置了镜像映射的映射文件,则在外部添加如下内容

[client]
default-character-set=utf8
[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci
[mysql]
default-character-set=utf8

若未配置镜像文件的映射,则需要如下修改

首先查找mysql的配置文件
root@c5ead33bc196:/etc/mysql# cat /etc/mysql/mysql.cnf
查看上述文件,其配置文件为:
root@c5ead33bc196:/etc/mysql/conf.d# cat /etc/mysql/conf.d/mysql.cnf 
使用cat命令添加内容
cat >> mysql.cnf << EOF
[client]
default-character-set=utf8
[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci
[mysql]
default-character-set=utf8

初始化元数据

root@Master:/usr/local/apache-hive-3.1.2-bin/bin# schematool -initSchema -dbType mysql
  • 进入hive界面
root@Master:/usr/local/hadoop# hive
Hive Session ID = 89b62344-4234-47ad-8019-ee37898df6ad

Logging initialized using configuration in jar:file:/usr/local/apache-hive-3.1.3-bin/lib/hive-common-3.1.3.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Hive Session ID = 371e9629-c986-4d8b-b413-e21d3b586dae
hive> show databases;
OK
default
Time taken: 1.846 seconds, Fetched: 1 row(s)
hive> 

启动 Hiveserver2

一、修改hadoop的一些权限配置

root@Master:/usr/local# vim /usr/local/hadoop/etc/hadoop/core-site.xml
  • 加入以下配置 这里添加的是hive的访问权限
<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>
  • 重启hdfs:
root@Master:/usr/local/hadoop/sbin# ./stop-dfs.sh
Stopping namenodes on [Master]
Stopping datanodes
Stopping secondary namenodes [Master]
root@Master:/usr/local/hadoop/sbin# ./start-dfs.sh
Starting namenodes on [Master]
Starting datanodes
Starting secondary namenodes [Master]

二、后台启动hiveserver2

root@Master:/usr/local/hadoop/sbin#  nohup hiveserver2 >/dev/null 2>/dev/null &

三、验证

root@Master:/usr/local/hadoop# beeline
Beeline version 3.1.3 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000/default
Connecting to jdbc:hive2://localhost:10000/default
Enter username for jdbc:hive2://localhost:10000/default: root
Enter password for jdbc:hive2://localhost:10000/default: 
Connected to: Apache Hive (version 3.1.3)
Driver: Hive JDBC (version 3.1.3)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10000/default> show databases;
INFO  : Compiling command(queryId=root_20231228091154_69a51c57-a7e6-434e-b1c4-6b06561b5e37): show databases
INFO  : Concurrency mode is disabled, not creating a lock manager
INFO  : Semantic Analysis Completed (retrial = false)
INFO  : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:database_name, type:string, comment:from deserializer)], properties:null)
INFO  : Completed compiling command(queryId=root_20231228091154_69a51c57-a7e6-434e-b1c4-6b06561b5e37); Time taken: 0.02 seconds
INFO  : Concurrency mode is disabled, not creating a lock manager
INFO  : Executing command(queryId=root_20231228091154_69a51c57-a7e6-434e-b1c4-6b06561b5e37): show databases
INFO  : Starting task [Stage-0:DDL] in serial mode
INFO  : Completed executing command(queryId=root_20231228091154_69a51c57-a7e6-434e-b1c4-6b06561b5e37); Time taken: 0.021 seconds
INFO  : OK
INFO  : Concurrency mode is disabled, not creating a lock manager
+----------------+
| database_name  |
+----------------+
| default        |
+----------------+
1 row selected (0.14 seconds)

重新设置表级、字段级注释

(1)字段注释
mysql> alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8; (2)表注释
mysql> alter table TABLE_PARAMS modify column PARAM_VALUE mediumtext character set utf8;

(3)修改分区表参数,以支持分区键能够用中文表示

mysql>alter table PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;

mysql>alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;

上述修改完成一定需要去表中查看是修改成功。

其他

# 修改hdfs目录权限
hdfs dfs -setfacl -R -m user:root:rwx /user 

# 查看端口
root@Master:/usr/local/hadoop/sbin# netstat -ntulp |grep 10000