致读者: 博主是一名数据科学与大数据专业大三的学生,一个互联网新人,写博客一方面是为了记录自己的学习过程中遇到的问题和思考,一方面是希望能够帮助到很多和自己一样处于困惑的读者。
由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!之后会写大数据专业的文章哦。
GitHub链接https://github.com/wfy-belief尽管现在我的水平可能还不太及格,但我会尽我自己所能,做到最好☺
——天地有正气,杂然赋流形。下则为河岳,上则为日星。


需求: 因为最近准备学习hive,但是仅仅为了hive使用VM搭建一个集群,感觉挺难受的,于是想到了使用docker搭建一下环境Hive环境,并进行记录。

docker镜像拉取和使用

镜像地址

最新版 增加自启动 和 DBeaver 连接

操作地址

本地 hive 版本

数据库root账号密码root

hive用户账号密码 hive

仅配置 hive-site.xml

可自定义

注:由于 jdk11 位置 bug,改用jdk8

其它皆是自定义

docker pull wfybelief/centos:hive

docker run -itd -p 50022:22 -p 9870:9870 -p 8088:8088 -p 3306:3306 --privileged --name centos-hadoop-hive wfybelief/centos:hive /usr/sbin/init

hadoop-mysql 版本

增加 mysql 默认端口 3306

自启动服务

docker pull wfybelief/centos:hadoop-mysql

docker run -itd -p 50022:22 -p 9870:9870 -p 8088:8088 -p 3306:3306 --privileged --name centos-hadoop-mysql wfybelief/centos:hadoop-mysql /usr/sbin/init

hadoop 版本

可以直接拉取

集群自启动,端口映射自定义。

start-all.sh stop-all.sh 等脚本环境变量以配置

docker pull wfybelief/centos:hadoop

docker run -itd -p 50022:22 -p 9870:9870 -p 8088:8088 --privileged --name centos-hadoop wfybelief/centos:hadoop /usr/sbin/init

ssh版本

可以直接拉取

远程访问 使用

docker pull wfybelief/centos:ssh

docker run -itd -p 50022:22 --privileged --name centos-ssh wfybelief/centos:ssh /usr/sbin/init

端口说明(向下兼容 上面为最新)

集群映射端口(本机 -> 容器)

版本

备注

hive

默认配置

3306:3306

hadoop-mysql

MySQL

9870:9870

hadoop

hdfs

8088:8088

hadoop

yarn

50022:22

ssh

远程访问

准备 centos7.9 镜像

这里使用的是centos7.9
直接使用 docker pull centos:7.9.2009 拉取镜像即可

docker hiv docker hive搭建_hadoop

配置ssh远程访问

因为想要使用xshell远程访问。
所以在最初的镜像上面配置一下ssh,制作一个ssh版本的本地镜像 值得一提的是,作者使用的是 windows 环境。不过大致过程都是相同的。

docker run -itd -p 50022:22 --privileged --name centos-ssh centos:7.9.2009 /usr/sbin/init
  • –privileged: 可以使container内的root拥有真正的root权限
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • –name="centos-ssh": 为容器指定一个名称,如果不写,会自动生成一个名字,如modest_bouman;
  • /usr/sbin/init:因为后面会使用systemctl启动sshd服务,所以添加该项,否则会报错Failed to get D-Bus connection: Operation not permitted,因为覆盖了默认的 /bin/bash,所以不能使用docker attach进入容器了,需要使用以下方式进入。

运行成功截图

docker hiv docker hive搭建_docker_02

进入容器

docker exec -it centos-ssh bash

运行成功截图

docker hiv docker hive搭建_centos_03

安装 sshd

// 安装网络工具,可以使用ifconfig查看网卡ip信息
yum -y install net-tools
// 安装ssh服务
yum -y install openssh-server
// 需要的话,安装ssh客户端
yum -y install openssh-clients
// 需要的话,安装passwd,修改root用户密码,这里就不细说了
yum -y install passwd

此处安装 openssh-serverpasswd 即可。
当然安装 net-tools 使用 ifconfig可以查看ip。

安装截图

docker hiv docker hive搭建_大数据_04


需要的话可以使用vi或vim修改sshconfig 【vi /etc/ssh/sshd_config

比如是否允许root登陆,端口号等,默认可以root远程登陆

安装和语言错误解决方法

启动 ssh 服务

systemctl start sshd

设置密码

设置密码的目的是为了远程访问

passwd

使用xshell进行连接

此时应该注意宿主机IP 我用的宿主机IP为 localhost

运行成功截图

docker hiv docker hive搭建_docker hiv_05


docker hiv docker hive搭建_docker_06

制作ssh 本地镜像

docker commit -m "create a centos image with ssh" 54593e30ec73 centos:ssh

之后使用一下命令就可以使用 ssh

docker run -itd -p 50022:22 --privileged --name centos-ssh centos:ssh /usr/sbin/init

至此ssh的centos本地镜像制作完成


配置Hadoop

  • 端口1 9870 hdfs
  • 端口2 8088 yarn

启动ssh镜像 并配置端口映射

docker run -itd -p 50022:22 -p 9870:9870 -p 8088:8088 --privileged --name centos-hadoop centos:ssh /usr/sbin/init

然后远程访问

docker hiv docker hive搭建_docker hiv_07

使用xftp传输jdk和Hadoop安装包

docker hiv docker hive搭建_docker_08


接下来配置jdk和Hadoop环境

Jdk

export JAVA_HOME=/root/softwares/java
export JAVA_BIN=$JAVA_HOME/bin
export JAVA_LIB=$JAVA_HOME/lib
export CLASSPATH=.:$JAVA_LIB/tools.jar:$JAVA_LIB/dt.jar
export PATH=$JAVA_HOME/bin:$PATH

Hadoop

#设置HADOOP_HOME为Hadoop的安装路径/usr/local/hadoop
export HADOOP_HOME=/root/softwares/hadoop
# 设置PATH
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
# 设置HADOOP的其他环境变量
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
# 链接库的相关设置
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH

docker hiv docker hive搭建_大数据_09

配置Hadoop

hadoop-env.sh

export JAVA_HOME=/root/softwares/java

core-site.xml

<property>
    <name>hadoop.tmp.dir</name>
    <value>file:/root/softwares/hadoop/tmp</value>
    <description>Abase for other temporary directories.</description>
</property>
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
</property>

hdfs-site.xml

<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>
<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/root/softwares/hadoop/tmp/dfs/name</value>
</property>
<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/root/softwares/hadoop/tmp/dfs/data</value>
</property>

vim yarn-site.xml

<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
<property>
    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
    <name>yarn.resourcemanager.address</name>
    <value>127.0.0.1:8032</value>
</property>
<property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>127.0.0.1:8030</value>
</property>
<property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>127.0.0.1:8031</value>
</property>

mapred-site.xml

cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>

Hadoop 版本改动附加

start-dfs.sh

HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

start-yarn.sh

YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

stop-dfs.sh

HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

stop-yarn.sh

YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

格式化与启动

格式化

hadoop namenode -format
# hdfs namenode -format

启动

start-all.sh

报告

hdfs dfsadmin -report

解决localhost.localdomain: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)

一、情况
在虚拟机搭建Hadoop环境时,出现localhost.localdomain: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)问题,这个问题是由于即使是本机使用SSH服务也是需要对自己进行公私钥授权的,所以在本机通过ssh-keygen创建好公私钥,然后将公钥复制到公私钥的认证文件中就可以了

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

docker commit -m "create a centos image with hadoop" ecd223de4c0b centos:hadoop

之后使用一下命令就可以使用 ssh

docker run -itd -p 50022:22 -p 9870:9870 -p 8088:8088 --privileged --name centos-hadoop centos:hadoop /usr/sbin/init

至此Hadoop的centos本地镜像制作完成

附加内容开机自启动

# Hadoop systemd service file
#表示基础信息
[Unit]
#描述
Description=Hadoop Community Server
#在哪个服务之后启动
After=network.target  #服务级别,低于network,也可以理解为network启动后再启动Hadoop
 
#安装相关信息
[Install]
#以哪种方式启动
#multi-user.target表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。
WantedBy=multi-user.target
 
#表示服务信息
[Service]
#以fork方式从父进程创建子进程
Type=forking
User=root
Group=root
#启动服务的命令(路径为实际hadoop的实际安装路径)
ExecStart=/root/softwares/hadoop/sbin/start-all.sh
#重新加载命令
# ExecReload=/root/softwares/hadoop/sbin/stop-all.sh;sleep 10; /root/softwares/hadoop/sbin/start-all.sh
#停止服务的命令
# ExecStop=/root/softwares/hadoop/sbin/stop-all.sh &

把停止服务命令注释,不然有bug,启动服务自动停止

镜像发布

docker tag 3990b34295e4 wfybelief/centos:hadoop
docker push wfybelief/centos

Mysql

打包镜像

docker commit -m "create a centos image with mysql" 59bbe9c4cf58 wfybelief/centos:hadoop-mysql

hive

配置环境变量

#hive
export HIVE_HOME=/root/softwares/hive
export PATH=$PATH:$HIVE_HOME/bin

hive-site.xml文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
    <description>JDBC connect string for a JDBC metastore</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
    <description>username to use against metastore database</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hive</value>
    <description>password to use against metastore database</description>
  </property>
</configuration>

创建数据库和用户

CREATE DATABASE hive;
create user 'hive'@'%' identified by 'hive';
grant all privileges on hive.* to 'hive'@'%';
flush privileges;

初始化数据库

一定要初始化 QAQ !!!

./bin/schematool -dbType mysql -initSchema

错误整理

更多错误

查看hadoop安装目录下share/hadoop/common/lib内guava.jar版本
查看hive安装目录下lib内guava.jar的版本 如果两者不一致,删除版本低的,并拷贝高版本的