Hadoop集群搭建及ZooKeeper、Hbase、Hive配置

Hadoop集群搭建及ZooKeeper、Hbase、Hive配置

Hadoop集群搭建

主机名ipNameNodeDataNodeYarnZKJournalNode
node02172.29.66.129×
node03172.29.66.130×
node04172.29.66.131×

NadeNode和SecondaryNameNode不能放在一起,Yarn的ResourceManager不能和NameNode、SecondaryNameNode放在一起,因为这三个都会占用大量资源,放在一起容易崩溃。

所有资源都可在百度网盘下载

链接: https://pan.baidu.com/s/1SkUfCurICy-RtxuOuiaZ-Q 提取码: dtga

1.模板虚拟机环境准备

将虚拟机IP设为静态,并进行配置

[root@node01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

修改为如下

TYPE="Ethernet"

PROXY_METHOD="none"

BROWSER_ONLY="no"

BOOTPROTO="static"

DEFROUTE="yes"

IPV4_FAILURE_FATAL="no"

IPV6INIT="yes"

IPV6_AUTOCONF="yes"

IPV6_DEFROUTE="yes"

IPV6_FAILURE_FATAL="no"

IPV6_ADDR_GEN_MODE="stable-privacy"

NAME="ens33"

UUID="e59bb0ad-2918-4de6-93fa-46bd94c0a474"

DEVICE="ens33"

ONBOOT="yes"

IPADDR=172.29.66.128

GATEWAY=172.29.66.2

DNS1=172.29.66.2 

配置模板虚拟机主机名称映射hosts文件

[root@node01 ~]# vim /etc/hosts

在末尾添加内容:

172.29.66.128 node01

172.29.66.129 node02

172.29.66.130 node03

172.29.66.131 node04

重启虚拟机

[root@node01 ~]# reboot

在Windows中打开C:\Windows\System32\drivers\etc路径,在hosts文件中添加如下内容:

172.29.66.128 node01

172.29.66.129 node02

172.29.66.130 node03

172.29.66.131 node04

安装epel-release

[root@node01 ~]# yum install -y epel-release

关闭防火墙,关闭防火墙开机自启

[root@node01 ~]# systemctl stop firewalld

[root@node01 ~]# systemctl disable firewalld.service

配置hadoop用户具有root权限

[root@node01 ~]# vim /etc/sudoers

hadoop配置如下:

## Allows people in group wheel to run all commands

%wheel ALL=(ALL)    ALL

hadoop  ALL=(ALL)    NOPASSWD:ALL

在/opt/下创建2个目录,并修改所有者和所在组

[hadoop@node01 opt]# mkdir module/ software/

[hadoop@node01 opt]# chown hadoop:hadoop module/ software/

卸载虚拟机自带JDK

[root@node01 ~]# rpm -qa | grep -i java | xargs -n1 rpm -e –nodeps

重启虚拟机

[root@node01 ~]# reboot

模板虚拟机Node01的配置完成

2. 克隆虚拟机并配置网络

以Node01为模板虚拟机,克隆三台虚拟机,分别为:

Node02

Node03

Node04

每台虚拟机配置4G内存,4核处理器,20G硬盘

image-20230416163912970

配置Node02的IP

[root@node02 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

修改:

IPADDR=192.168.10.102

修改Node02的主机名称

[root@node02 ~]# vim /etc/hostname

由node01改为:

node02

重启虚拟机

[root@node02 ~]# reboot

Node03、Node04操作步骤同上

完成操作后,使用xshell远程连接node02、node03、node04

3. JDK、Hadoop安装

使用xftp上传Hadoop和JDK至node02

解压JDK并指定目录

[hadoop@node02 ~]$ cd /opt/software/

[hadoop@node02 software]$ tar -zxvf jdk-8u321-linux-x64.tar.gz -C /opt/module/

配置JDK环境变量

[hadoop@node02 ~]$ sudo vim /etc/profile.d/my_env.sh

添加

#JAVA_HOME

export JAVA_HOME=/opt/module/jdk1.8.0_321
export PATH=$PATH:$JAVA_HOME/bin

使修改后的文件生效

[hadoop@node02 ~]$ source /etc/profile

测试JDK是否安装成功

[hadoop@node02 ~]$ java -version

image-20230416164220494

解压Hadoop并指定目录

[hadoop@node02 ~]$ cd /opt/software/

[hadoop@node02 software]$ tar -zxvf hadoop-3.2.2.tar.gz -C /opt/module/

配置Hadoop环境变量

[hadoop@node02 ~]$ sudo vim /etc/profile.d/my_env.sh

在末尾添加

#HADOOP_HOME

export HADOOP_HOME=/opt/module/hadoop-3.2.2

export PATH=$PATH:$HADOOP_HOME/bin

export PATH=$PATH:$HADOOP_HOME/sbin

使修改后的文件生效

[hadoop@node02 ~]$ source /etc/profile

测试Hadoop是否安装成功

[hadoop@node02 ~]$ hadoop version

显示如下,安装成功:

Hadoop 3.2.2
Source code repository Unknown -r 7a3bc90b05f257c8ace2f76d74264906f0f7a932
Compiled by hexiaoqiao on 2021-01-03T09:26Z
Compiled with protoc 2.5.0
From source with checksum 5a8f564f46624254b27f6a33126ff4
This command was run using /opt/module/hadoop-3.2.2/share/hadoop/common/hadoop-common-3.2.2.jar

4. Hadoop完全分布式配置

在node02把node02的/opt/module/jdk1.8.0_321目录拷贝到node03

[hadoop@node02 opt]$ scp -r /opt/module/jdk1.8.0_321 hadoop@node03:/opt/module

在node03把node02的/opt/module/hadoop-3.2.2目录拷贝到node03

[hadoop@node03 ~]$ scp -r hadoop@node02:/opt/module/hadoop-3.2.2 /opt/module/

在node03把node02的/opt/module目录下的所有目录拷贝到node04

[hadoop@node03 ~]$ scp -r hadoop@node02:/opt/module/* hadoop@node04:/opt/module

编写集群分发脚本xsync

在node02的/home/hadoop下新建目录bin

[hadoop@node02 ~]$ mkdir /home/hadoop/bin

创建xsync脚本

[hadoop@node02 ~]$ vim /home/hadoop/bin/xsync

写入如下内容

#!/bin/bash

 

#1. 判断参数个数

if [ $# -lt 1 ]

then

  echo Not Enough Arguement!

  exit;

fi

#2. 遍历集群所有机器

for host in node02 node03 node04

do

  echo -e "\n==================== $host ===================="

  #3. 遍历所有目录,逐个发送

  for file in $@

  do

    #4. 判断文件是否存在

    if [ -e $file ]

      then

        #5. 获取父目录

        pdir=$(cd -P $(dirname $file); pwd)

        #6. 获取当前文件的名称

        fname=$(basename $file)

        ssh $host "mkdir -p $pdir"

        rsync -av $pdir/$fname $host:$pdir

      else

        echo $file does not exist!

    fi

  done

done

echo -e "\n"

使脚本 xsync 具有执行权限

[hadoop@node02 ~]$ cd bin/

[hadoop@node02 bin]$ chmod +x xsync

同步分发/home/hadoop/bin至node03、node04

[hadoop@node02 bin]$ cd

[hadoop@node02 ~]$ xsync bin/

可以在node03、node04上查看运行结果

[hadoop@node03 ~]$ ll bin/

[hadoop@node04 ~]$ ll bin/

分发环境变量

[hadoop@node02 ~]$ sudo ./bin/xsync /etc/profile.d/my_env.sh

在node03、node04上分别使修改后的文件生效

[hadoop@node03 ~]$ source /etc/profile

[hadoop@node04 ~]$ source /etc/profile

5.SSH免密登录配置

在node02上生成私钥和公钥

[hadoop@node02 ~]$ ssh-keygen -t rsa

在node02上将公钥拷贝到要免密登录的目标机器

[hadoop@node02 ~]$ ssh-copy-id node02

[hadoop@node02 ~]$ ssh-copy-id node03

[hadoop@node02 ~]$ ssh-copy-id node04

在node03、node04上同样进行以上步骤

在node02上切换至root用户

[hadoop@node02 ~]$ su

用root用户在node02上生成私钥和公钥

[root@node02 ~]# ssh-keygen -t rsa

用root用户在node02上将公钥拷贝到要免密登录的目标机器

[root@node02 ~]# ssh-copy-id node02

[root@node02 ~]# ssh-copy-id node03

[root@node02 ~]# ssh-copy-id node04

在node03、node04上同样进行以上步骤

6.集群配置

进入hadoop目录

[hadoop@node02 ~]$ cd /opt/module/hadoop-3.2.2/etc/hadoop/

配置core-site.xml

[hadoop@node02 ~]$ vim core-site.xml

在与之间添加内容:

 <!-- 指定NameNode的地址 -->

  <property>

    <name>fs.defaultFS</name>

    <value>hdfs://node02:8020</value>

  </property>

 

 <!-- 指定hadoop数据的存储目录 -->

  <property>

    <name>hadoop.tmp.dir</name>

    <value>/opt/module/hadoop-3.2.2/data</value>

  </property>

 

 <!-- 配置HDFS网页登录使用的静态用户为hadoop -->

  <property>

    <name>hadoop.http.staticuser.user</name>

    <value>hadoop</value>

</property>

配置hdfs-site.xml

[hadoop@node02 hadoop]$ vim hdfs-site.xml
 <!-- nn web端访问地址-->

 <property>

    <name>dfs.namenode.http-address</name>

    <value>node02:9870</value>

  </property>

 <!-- 2nn web端访问地址-->

  <property>

    <name>dfs.namenode.secondary.http-address</name>

    <value>node04:9868</value>

  </property>

配置yarn-site.xml

[hadoop@node02 hadoop]$ vim yarn-site.xml
 <!-- 指定MR走shuffle -->

  <property>

    <name>yarn.nodemanager.aux-services</name>

    <value>mapreduce_shuffle</value>

  </property>

 

 <!-- 指定ResourceManager的地址-->

  <property>

    <name>yarn.resourcemanager.hostname</name>

    <value>node03</value>

  </property>

 

 <!-- 环境变量的继承 -->

  <property>

    <name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>

  </property>

 

 <!-- 开启日志聚集功能 -->

  <property>

    <name>yarn.log-aggregation-enable</name>

    <value>true</value>

  </property>

 

 <!-- 设置日志聚集服务器地址 -->

  <property> 

    <name>yarn.log.server.url</name> 

    <value>http://node02:19888/jobhistory/logs</value>

  </property>

 

 <!-- 设置日志保留时间为14天 -->

  <property>

    <name>yarn.log-aggregation.retain-seconds</name>

    <value>1209600</value>

  </property>

配置mapred-site.xml

[hadoop@node02 hadoop]$ vim mapred-site.xml
 <!-- 指定MapReduce程序运行在Yarn上 -->

  <property>

    <name>mapreduce.framework.name</name>

    <value>yarn</value>

  </property>

 <!-- 历史服务器端地址 -->

  <property>

    <name>mapreduce.jobhistory.address</name>

    <value>node02:10020</value>

  </property>

 <!-- 历史服务器web端地址 -->

  <property>

    <name>mapreduce.jobhistory.webapp.address</name>

    <value>node02:19888</value>

</property>

分发配置文件

[hadoop@node02 hadoop]$ cd ..

[hadoop@node02 etc]$ xsync hadoop/

同步所有节点配置文件

[hadoop@node02 ~]$ xsync /opt/module/hadoop-3.2.2/etc

7.编写Hadoop集群脚本

编写Hadoop集群启停脚本(包含HDFS,Yarn,Historyserver):myhadoop.sh

先转到hadoop的bin目录下:

[hadoop@node02 ~]$ cd /home/hadoop/bin/
[hadoop@node02 bin]$ vim myhadoop.sh
#!/bin/bash

 

if [ $# -lt 1 ]

then

  echo "No Args Input!"

  exit;

fi

 

case $1 in

"start")

    echo -e "\n================= 启动 hadoop集群 ================="

    echo " ------------------- 启动 hdfs --------------------"

    ssh node02 "/opt/module/hadoop-3.2.2/sbin/start-dfs.sh"

    echo " ------------------- 启动 yarn --------------------"

    ssh node03 "/opt/module/hadoop-3.2.2/sbin/start-yarn.sh"

    echo " --------------- 启动 historyserver ---------------"

    ssh node02 "/opt/module/hadoop-3.2.2/bin/mapred --daemon start historyserver"

  echo -e "\n"

;;

"stop")

    echo -e "\n================= 关闭 hadoop集群 ================="

    echo " --------------- 关闭 historyserver ---------------"

    ssh node02 "/opt/module/hadoop-3.2.2/bin/mapred --daemon stop historyserver"

    echo " ------------------- 关闭 yarn --------------------"

    ssh node03 "/opt/module/hadoop-3.2.2/sbin/stop-yarn.sh"

    echo " ------------------- 关闭 hdfs --------------------"

    ssh node02 "/opt/module/hadoop-3.2.2/sbin/stop-dfs.sh"

  echo -e "\n"

;;

*)

  echo "Input Args Error!"

;;

esac

编写查看三台服务器Java进程脚本:jpsall

[hadoop@node02 bin]$ vim jpsall
#!/bin/bash

 

for host in node02 node03 node04

do

    echo -e "\n=============== $host ==============="

    ssh $host jps 

done

echo -e "\n"

使脚本具有执行权限

[hadoop@node02 bin]$ chmod +x myhadoop.sh jpsall

分发脚本

[hadoop@node02 bin]$ cd ..

[hadoop@node02 ~]$ xsync bin/

配置workers

[hadoop@node02 ~]$ vim /opt/module/hadoop-3.2.2/etc/hadoop/workers

清除原有内容,写入:

node02

node03

node04

同步所有节点配置文件

[hadoop@node02 ~]$ xsync /opt/module/hadoop-3.2.2/etc

8.启动集群

集群第一次启动前,需要在node02节点格式化NameNode

[hadoop@node02 ~]$ hdfs namenode -format

启动集群(三台虚拟机任意一台都可以运行)

[hadoop@node02 ~]$ myhadoop.sh start

查看三台服务器Java进程

[hadoop@node02 ~]$ jpsall

停止集群

[hadoop@node02 ~]$ myhadoop.sh stop

ZooKeeper安装

zookeeper安装

上传apache-zookeeper-3.5.7-bin.tar.gz至node02

[hadoop@node02 ~]$ cd /opt/software/

解压

[hadoop@node02 software]$ tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module/

修改文件夹名称

[hadoop@node02 ~]$ cd /opt/module/

[hadoop@node02 module]$ mv apache-zookeeper-3.5.7-bin/ zookeeper-3.5.7

修改配置

[hadoop@node02 module]$ cd zookeeper-3.5.7/conf/

[hadoop@node02 conf]$ mv zoo_sample.cfg zoo.cfg

[hadoop@node02 conf]$ vim zoo.cfg

修改dataDir(数据存储路径)

dataDir=/opt/module/zookeeper-3.5.7/zkData

在末尾添加

server.2=node02:2888:3888

server.3=node03:2888:3888

server.4=node04:2888:3888

创建文件夹

[hadoop@node02 conf]$ cd ..

[hadoop@node02 zookeeper-3.5.7]$ mkdir zkData

在zkData下创建myid文件(文件名不可更换)

[hadoop@node02 zookeeper-3.5.7]$ cd zkData/

[hadoop@node02 zkData]$ vim myid

文件中仅写入以下内容:(不可含有空行和空格,只能有数字2)

2

将zookeeper分发至node03、node04

[hadoop@node02 zookeeper-3.5.7]$ xsync /opt/module/zookeeper-3.5.7/

xsync同步脚本见上文内容,没有的可以用以下命令:

[hadoop@node02 zookeeper-3.5.7]$ scp -r /opt/module/zookeeper-3.5.7/ hadoop@node03:/opt/module

[hadoop@node02 zookeeper-3.5.7]$ scp -r /opt/module/zookeeper-3.5.7/ hadoop@node04:/opt/module

修改node03、node04的myid文件内容

[hadoop@node03 ~]$ vim /opt/module/zookeeper-3.5.7/zkData/myid

将数字2分别改为

3
4

编写脚本(与上文hadoop脚本过程一致):zk.sh

zk.sh(zookeeper启动、关闭、查看状态)

#!/bin/bash

if [ $# -lt 1 ]
then
    echo "Input No Args!"
    exit;
fi

case $1 in
"start")
	for i in node02 node03 node04
	do
		echo -e "\n------------ zookeeper $i 启动 ------------"
		ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh start"
	done
	echo -e "\n"
;;
"stop")
	for i in node02 node03 node04
	do
		echo -e "\n------------ zookeeper $i 停止 ------------"
		ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop"
	done
	echo -e "\n"
;;
"status")
	for i in node02 node03 node04
	do
		echo -e "\n------------ zookeeper $i 状态 ------------"
		ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh status"
	done
	echo -e "\n"
;;
*)
    echo "Input Args Error!"
;;
esac

脚本用法:

在任意一台机器的任意位置,输入:

zk.sh start 启动zookeeper

zk.sh stop 关闭zookeeper

zk.sh status 查看zookeeper状态

给脚本赋予可执行权限,分发脚本至node03、node04

[hadoop@node02 bin]$ chmod 777 zk.sh 

[hadoop@node02 bin]$ xsync zk.sh 

zookeeper安装结束

脚本用法:

在任意一台机器的任意位置,输入:

zk.sh start 启动zookeeper

zk.sh stop 关闭zookeeper

zk.sh status 查看zookeeper状态

hbs.sh start 启动hbase

hbs.sh stop 关闭hbase

all.sh start 启动hadoop集群、启动zookeeper、启动hbase、显示进程

all.sh stop 关闭hbase、关闭zookeeper、关闭hadoop集群、显示进程

hbase安装

启动hadoop集群

脚本见hadoop集群搭建,也可自行手动启动集群

[hadoop@node02 ~]$ myhadoop.sh start

启动zookeeper

脚本见本文档zookeeper安装

[hadoop@node02 ~]$ zk.sh start

上传hbase-2.0.5-bin.tar.gz至node02

[hadoop@node02 ~]$ cd /opt/software/

解压

[hadoop@node02 software]$ tar -zxvf hbase-2.0.5-bin.tar.gz -C /opt/module/

配置hbase环境变量

[hadoop@node02 ~]$ sudo vim /etc/profile.d/my_env.sh

添加内容:

#HBASE_HOME

export HBASE_HOME=/opt/module/hbase-2.0.5

export PATH=$PATH:$HBASE_HOME/bin

修改hbase-env.sh

[hadoop@node02 ~]$ cd /opt/module/hbase-2.0.5/conf/

[hadoop@node02 conf]$ vim hbase-env.sh

写入,或去掉#并改为:

export HBASE_MANAGES_ZK=false

修改hbase-site.xml

[hadoop@node02 conf]$ vim hbase-site.xml

修改为

注意更改主机名、目录名,注意hdfs端口号(hadoop集群与我相同无需更改端口号)

<configuration>

  <property>

    <name>hbase.rootdir</name>

    <value>hdfs://node02:8020/hbase</value>

  </property>

  <property>

    <name>hbase.cluster.distributed</name>

    <value>true</value>

  </property>

  <property>

    <name>hbase.zookeeper.quorum</name>

    <value>node02,node03,node04</value>

  </property>

  <property>

    <name>hbase.zookeeper.property.dataDir</name>

    <value>/opt/module/zookeeper-3.5.7/zkData</value>

  </property>

</configuration>

修改regionservers

[hadoop@node02 conf]$ vim regionservers

改为你对应的主机名

node02
node03
node04

分别在node02、node03、node04上删除如下jar包

[hadoop@node02 ~]$ rm -rf /opt/module/hbase-2.0.5/lib/slf4j-log4j12-1.7.25.jar

配置高可用

[hadoop@node02 ~]$ cd /opt/module/hbase-2.0.5/conf/

[hadoop@node02 conf]$ vim backup-masters

写入

node03

将hbase分发至node03、node04

[hadoop@node02 hbase-2.0.5]$ xsync /opt/module/hbase-2.0.5/

编写脚本(与上文hadoop脚本过程一致):hbs.sh all.sh

hbs.sh

#!/bin/bash

if [ $# -lt 1 ]
then
    echo "Input No Args!"
    exit;
fi

case $1 in
"start")
        echo -e "\n================= 启动 hbase ================="
        ssh node02 "/opt/module/hbase-2.0.5/bin/start-hbase.sh"
	echo -e "\n"
;;
"stop")
        echo -e "\n================= 关闭 hbase ================="
        ssh node02 "/opt/module/hbase-2.0.5/bin/stop-hbase.sh"
	echo -e "\n"
;;
*)
    echo "Input Args Error!"
;;
esac

all.sh

#!/bin/bash

if [ $# -lt 1 ]
then
    echo "Input No Args!"
    exit;
fi

case $1 in
"start")
    echo -e "\n\n================= 1. 启动 hadoop集群 ================="
    echo " ------------------- 启动 hdfs --------------------"
    ssh node02 "/opt/module/hadoop-3.2.2/sbin/start-dfs.sh"
    echo " ------------------- 启动 yarn --------------------"
    ssh node03 "/opt/module/hadoop-3.2.2/sbin/start-yarn.sh"
    echo " --------------- 启动 historyserver ---------------"
    ssh node02 "/opt/module/hadoop-3.2.2/bin/mapred --daemon start historyserver"
	sleep 1
	echo -e "\n\n================= 2. 启动 zookeeper ================="
	sleep 1
	for i in node02 node03 node04
	do
		echo -e "\n------------ zookeeper $i 启动 ------------"
		ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh start"
	done
	echo -e "\n\n=================== 3. 启动 hbase ===================="
	sleep 1
    ssh node02 "/opt/module/hbase-2.0.5/bin/start-hbase.sh"
	echo -e "\n"
	for host in node02 node03 node04
	do
        echo -e "\n=============== $host ==============="
        ssh $host jps 
	done
echo -e "\n"
;;
"stop")
	echo -e "\n\n=================== 1. 关闭 hbase ===================="
	ssh node02 "/opt/module/hbase-2.0.5/bin/stop-hbase.sh"
	echo -e "\n\n================= 2. 关闭 zookeeper ================="
	for i in node02 node03 node04
	do
		echo -e "\n------------ zookeeper $i 停止 ------------"
		ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop"
	done
    echo -e "\n\n================= 3. 关闭 hadoop集群 ================="
    echo " --------------- 关闭 historyserver ---------------"
    ssh node02 "/opt/module/hadoop-3.2.2/bin/mapred --daemon stop historyserver"
    echo " ------------------- 关闭 yarn --------------------"
    ssh node03 "/opt/module/hadoop-3.2.2/sbin/stop-yarn.sh"
    echo " ------------------- 关闭 hdfs --------------------"
    ssh node02 "/opt/module/hadoop-3.2.2/sbin/stop-dfs.sh"
	echo -e "\n"
	for host in node02 node03 node04
	do
        echo -e "\n=============== $host ==============="
        ssh $host jps 
	done
echo -e "\n"
;;
*)
    echo "Input Args Error!"
;;
esac

启动hbase(需要先启动zookeeper)

脚本用法:

在任意一台机器的任意位置,输入:

hbs.sh start 启动hbase

hbs.sh stop 关闭hbase

all.sh start 启动hadoop集群、启动zookeeper、启动hbase、显示进程

all.sh stop 关闭hbase、关闭zookeeper、关闭hadoop集群、显示进程

查看hbase网页端,启动后可以在浏览器里输入node03:16010

hdfs网页端为node02:9870

yarn网页端为node03:8088

Hive安装

1. Hive安装与配置

进入/opt/software/目录

[hadoop@node02 ~]$ cd /opt/software/

上传apache-hive-3.1.2-bin.tar.gz

上传mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar

上传mysql-connector-java-5.1.37.jar

解压apache-hive-3.1.2-bin.tar.gz

[hadoop@node02 software]$ tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/module/

修改目录名称

[hadoop@node02 software]$ mv /opt/module/apache-hive-3.1.2-bin/ /opt/module/hive-3.1.2

配置hive环境变量

[hadoop@node02 software]$ sudo vim /etc/profile.d/my_env.sh

在末尾添加内容

#HIVE_HOME

export HIVE_HOME=/opt/module/hive-3.1.2

export PATH=$PATH:$HIVE_HOME/bin

使环境变量的修改生效

[hadoop@node02 software]$ source /etc/profile

删除冲突jar包

[hadoop@node02 software]$ rm /opt/module/hive-3.1.2/lib/log4j-slf4j-impl-2.10.0.jar

使用脚本启动hadoop集群

[hadoop@node02 software]$ myhadoop.sh start

初始化元数据库

[hadoop@node02 software]$ cd ../module/hive-3.1.2/bin/

[hadoop@node02 bin]$ schematool -dbType derby -initSchema

启动hive

[hadoop@node02 bin]$ hive

退出hive

hive> exit;

2. MySQL安装与配置

(MySQL文件已上传)

查看是否已安装MySQL

[hadoop@node02 ~]$ rpm -qa|grep mariadb

若已安装,需要卸载MySQL

[hadoop@node02 ~]$ sudo rpm -e --nodeps mariadb-libs

进入/opt/software/目录

[hadoop@node02 ~]$ cd /opt/software/

解压mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar

[hadoop@node02 software]$ tar -xf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar

执行命令

[hadoop@node02 software]$ sudo yum install -y libaio

如果安装成功,或者显示以下内容,即可继续安装步骤:

软件包 libaio-0.3.109-13.el7.x86_64 已安装并且是最新版本

无须任何处理

安装,依次输入以下5条命令

sudo rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm

sudo rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm

sudo rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm

sudo rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm

sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm

初始化数据库

[hadoop@node02 software]$ sudo mysqld --initialize --user=mysql

查看临时密码

[hadoop@node02 software]$ sudo cat /var/log/mysqld.log                               

将临时密码复制,或者暂时存到某处(一定要保存好)

启动MySQL

[hadoop@node02 software]$ sudo systemctl start mysqld

登录

[hadoop@node02 software]$ mysql -uroot -p

输入临时密码

Enter password: 临时密码

登陆成功后,修改密码为000000

mysql> set password = password("000000");

使root允许任意ip连接

mysql> update mysql.user set host='%' where user='root';
mysql> flush privileges;

退出MySQL

mysql> exit;

拷贝MySQL的JDBC驱动至hive-3.1.2下的lib/

[hadoop@node02 software]$ cp /opt/software/mysql-connector-java-5.1.37.jar /opt/module/hive-3.1.2/lib/

编写配置文件hive-site.xml

[hadoop@node02 software]$ cd /opt/module/hive-3.1.2/conf/

[hadoop@node02 conf]$ vim hive-site.xml

输入前,注意修改主机名

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

  <!-- jdbc连接的URL -->

  <property>

    <name>javax.jdo.option.ConnectionURL</name>

    <value>jdbc:mysql://node02:3306/metastore?useSSL=false</value>

  </property>

  <!-- jdbc连接的Driver -->

  <property>

    <name>javax.jdo.option.ConnectionDriverName</name>

    <value>com.mysql.jdbc.Driver</value>

  </property>

  <!-- jdbc连接的username -->

  <property>

    <name>javax.jdo.option.ConnectionUserName</name>

    <value>root</value>

  </property>

  <!-- jdbc连接的password -->

  <property>

    <name>javax.jdo.option.ConnectionPassword</name>

    <value>000000</value>

  </property>

  <!-- Hive元数据存储版本的验证 -->

  <property>

    <name>hive.metastore.schema.verification</name>

    <value>false</value>

  </property>

  <!-- 元数据存储授权 -->

  <property>

     <name>hive.metastore.event.db.notification.api.auth</name>

    <value>false</value>

    </property>

  <!-- Hive默认在HDFS的工作目录 -->

  <property>

    <name>hive.metastore.warehouse.dir</name>

    <value>/user/hive/warehouse</value>

  </property>

  <!-- 指定存储元数据要连接的地址 -->

  <property>

    <name>hive.metastore.uris</name>

    <value>thrift://node02:9083</value>

</property>

  <!-- 指定hiveserver2连接的主机名 -->

  <property>

    <name>hive.server2.thrift.bind.host</name>

    <value>node02</value>

  </property>

  <!-- 指定hiveserver2连接的端口号 -->

  <property>

    <name>hive.server2.thrift.port</name>

    <value>10000</value>

</property>

</configuration>

登录MySQL,输入密码

[hadoop@node02 ~]$ mysql -uroot -p

新建hive元数据库

mysql> create database metastore;

mysql> exit;

初始化hive元数据库

[hadoop@node02 ~]$ schematool -initSchema -dbType mysql -verbose

启动hive

[hadoop@node02 ~]$ hive

退出hive

hive> exit;

3. hive服务启动脚本

进入home目录下的bin目录

[hadoop@node02 ~]$ cd bin/

[hadoop@node02 ~]$ vim hvservice.sh

#!/bin/bash

if [ $# -lt 1 ]
then
    echo "Input No Args!"
    echo "请输入 $(basename $0) start/stop/restart/status"
    exit;
fi

HIVE_LOG_DIR=$HIVE_HOME/logs
if [ ! -d $HIVE_LOG_DIR ]
then
    mkdir -p $HIVE_LOG_DIR
fi

function check_process()
{
    pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')
    ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
    echo $pid
    [[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
}

function hive_start()
{
    metapid=$(check_process HiveMetastore 9083)
    cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
    [ -z "$metapid" ] && eval $cmd || echo "Metastroe服务已启动"
    server2pid=$(check_process HiveServer2 10000)
    cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &"
    [ -z "$server2pid" ] && eval $cmd || echo "HiveServer2服务已启动"
}

function hive_stop()
{
    metapid=$(check_process HiveMetastore 9083)
    [ "$metapid" ] && kill $metapid || echo "Metastore服务未启动"
    server2pid=$(check_process HiveServer2 10000)
    [ "$server2pid" ] && kill $server2pid || echo "HiveServer2服务未启动"
}

case $1 in
"start")
    hive_start
    ;;
"stop")
    hive_stop
    ;;
"restart")
    hive_stop
    sleep 3
    hive_start
    ;;
"status")
    check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常"
    check_process HiveServer2 10000 >/dev/null && echo "HiveServer2 服务运行正常" || echo "HiveServer2服务运行异常"
    ;;
*)
    echo "Input Args Error!"
    echo "请输入 $(basename $0) start/stop/restart/status"
    ;;
esac

修改权限

[hadoop@node02 bin]$ chmod 777 hvservice.sh

脚本使用方法:

hvservice.sh start或stop或restart(重启)或status(查看状态)

启动后需要等待一段时间才可以查看状态

踩过的坑

1.Hadoop-2.x和Hadoop-3.x的命令格式不一样。

2.ResourceManager不要和NameNode、SecondaryNameNode装在一起,因为三者都需要占用大量的资源。

3.对于Hadoop里面的配置信息,不同的版本有不同的修改要求,要根据自己虚拟机的具体配置来改写hdfs-site.xml、yarn-site.xml、core-site.xml、mapred-site.xml的信息,不然开启Hadoop时,会出现不同程度的错误,如:NameNode没有开启或者整个yarn都没有开启。

4.分发文件命令最好不用 scp,用rsync -av 比较好,有条件可以参考尚硅谷的视频,编写一个xsync脚本,这样就不需要重复使用scp命令。

心路历程

花了三天时间,前前后后搭建了5、6次,yarn始终启动不起来,根据csdn上面的文章来修改Hadoop的配置信息,结果出了更多的错误,连NameNode和SecondaryNameNode都没了。没办法,查看了日志文件,还是没找出来问题在哪,最后都是直接删掉整个Hadoop文件,重新配置Hadoop环境。(绷不住了~~)

经过不懈努力终于搭建成功啦(~哈哈哈哈)

​ Hadoop-Web页面:node02:9870

image-20230307113051096

image-20230307113121517

​ yarn-Web页面:node03:8088

image-20230307113309461

​ mapreduce-example运行成功

image-20230307114459409image-20230307114522251

​ hbase-Web页面:node03:16010

image-20230307113412953

Hive搭建(踩坑)

对hive进习初始化时,报错了:Exception in thread “main“ java.lang.NoSuchMethodError: com.google.common.base.

原因:hadoop和hive的两个guava.jar版本不一致

解决方案:删除掉hive的guava.jar,然后复制Hadoop的guava.jar到hive的lib目录下

image-20230308211526344

最终成功进入hive!!!
tart
;;
“stop”)
hive_stop
;;
“restart”)
hive_stop
sleep 3
hive_start
;;
“status”)
check_process HiveMetastore 9083 >/dev/null && echo “Metastore服务运行正常” || echo “Metastore服务运行异常”
check_process HiveServer2 10000 >/dev/null && echo “HiveServer2 服务运行正常” || echo “HiveServer2服务运行异常”
;;
*)
echo “Input Args Error!”
echo “请输入 $(basename $0) start/stop/restart/status”
;;
esac


修改权限

```shell
[hadoop@node02 bin]$ chmod 777 hvservice.sh

脚本使用方法:

hvservice.sh start或stop或restart(重启)或status(查看状态)

启动后需要等待一段时间才可以查看状态

踩过的坑

1.Hadoop-2.x和Hadoop-3.x的命令格式不一样。

2.ResourceManager不要和NameNode、SecondaryNameNode装在一起,因为三者都需要占用大量的资源。

3.对于Hadoop里面的配置信息,不同的版本有不同的修改要求,要根据自己虚拟机的具体配置来改写hdfs-site.xml、yarn-site.xml、core-site.xml、mapred-site.xml的信息,不然开启Hadoop时,会出现不同程度的错误,如:NameNode没有开启或者整个yarn都没有开启。

4.分发文件命令最好不用 scp,用rsync -av 比较好,有条件可以参考尚硅谷的视频,编写一个xsync脚本,这样就不需要重复使用scp命令。

心路历程

花了三天时间,前前后后搭建了5、6次,yarn始终启动不起来,根据csdn上面的文章来修改Hadoop的配置信息,结果出了更多的错误,连NameNode和SecondaryNameNode都没了。没办法,查看了日志文件,还是没找出来问题在哪,最后都是直接删掉整个Hadoop文件,重新配置Hadoop环境。(绷不住了~~)

经过不懈努力终于搭建成功啦(~哈哈哈哈)

​ Hadoop-Web页面:node02:9870

[外链图片转存中…(img-SUKQrL2s-1681640446718)]

[外链图片转存中…(img-zl6oJZwi-1681640446719)]

​ yarn-Web页面:node03:8088

[外链图片转存中…(img-TsgIaa3p-1681640446719)]

​ mapreduce-example运行成功

[外链图片转存中…(img-vZRusthZ-1681640446719)][外链图片转存中…(img-qowyGENU-1681640446720)]

​ hbase-Web页面:node03:16010

[外链图片转存中…(img-g0f3uWv3-1681640446720)]

Hive搭建(踩坑)

对hive进习初始化时,报错了:Exception in thread “main“ java.lang.NoSuchMethodError: com.google.common.base.

原因:hadoop和hive的两个guava.jar版本不一致

解决方案:删除掉hive的guava.jar,然后复制Hadoop的guava.jar到hive的lib目录下

[外链图片转存中…(img-UdsCRoWd-1681640446720)]

最终成功进入hive!!!

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值