致读者: 博主是一名数据科学与大数据专业大三的学生,一个互联网新人,写博客一方面是为了记录自己的学习过程中遇到的问题和思考,一方面是希望能够帮助到很多和自己一样处于困惑的读者。
由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!之后会写大数据专业的文章哦。
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
拉取镜像即可
配置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 exec -it centos-ssh bash
运行成功截图
安装 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-server
和 passwd
即可。
当然安装 net-tools
使用 ifconfig
可以查看ip。
安装截图
需要的话可以使用vi或vim修改sshconfig 【vi /etc/ssh/sshd_config
】
比如是否允许root登陆,端口号等,默认可以root远程登陆
安装和语言错误解决方法
启动 ssh 服务
systemctl start sshd
设置密码
设置密码的目的是为了远程访问
passwd
使用xshell进行连接
此时应该注意宿主机的
IP
我用的宿主机IP为localhost
运行成功截图
制作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
然后远程访问
使用xftp传输jdk和Hadoop安装包
接下来配置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
配置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的版本 如果两者不一致,删除版本低的,并拷贝高版本的