Hadoop2.7.2 + Spark 2.4.3 + Hive 2.3.3 集群部署

249 阅读9分钟

1. 前置条件说明

  • 3 台服务器(或者虚拟机)
  • 操作系统 ubuntu 24.04

部署规划:

  • master 假设IP地址 192.168.3.10
  • slave1 假设IP地址 192.168.3.11
  • slave2 假设IP地址 192.168.3.12

2.设置host和hosts

给每台服务器配置host,后续可以使用hostname进行访问。 hostname文件配置本机的名字,hosts文件配置所有服务器的IP地址和服务器名的映射关系。

#例如master服务器,打开hostname文件,将原来的名字改成master
#同理,给另外两台服务器分别配置名字为slave1和slave2
sudo vim /etc/hostname

#添加本地ip和代瑞的ip到我的host文件和她的host文件里
sudo vim /etc/hosts
#配置文件内容如下
127.0.0.1	localhost
# 127.0.0.1    master  # 需要注意的是你的服务器可能存在这么一条记录,需要注释掉,因为下面配置了master 映射为 192.168.3.10,与当前这条重复了。
# 如果是slave节点上,同样要注视掉类似的内容。否则后续Hadoop集群启动的时候,会找不到datanode节点。

192.168.3.10    master
192.168.3.11    slave01
192.168.3.12    slave02

3.创建用户

在master、slave1、slave2上创建相同的用户方便对这个分布式系统进行管理。

#创建用户hadoop,不带参数的key m表示创建用户目录,带参数的key s加上后面的value表示用户的使用的shell
sudo useradd -m hadoop -s /bin/bash

#设置hadoop用户的密码
sudo passwd hadoop

#将hadoop用户加入到sudo用户组
sudo adduser hadoop sudo

4. ssh配置无密码访问

这里配置ssh无密码访问,最终实现的效果是,从master服务器上,可以不用输入密码直接登陆slave1 和slave2服务器。

#在master、slave1、slave2上分别执行
ssh-keygen -t rsa  # 生成密钥
cd ~/.ssh/ 
cat ./id_rsa.pub >> ./authorized_keys #将本地的公钥加入到authorized_keys

#在master上执行
scp ~/.ssh/id_rsa.pub hadoop@slave1:/home/hadoop
scp ~/.ssh/id_rsa.pub hadoop@slave2:/home/hadoop

#在slave1上执行
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys #将master的公钥加入到slave1的authoried_keys里

#在master上执行,远程登录slave1、slave2,验证不需要使用密钥即可登录
ssh slave1
# 或者
ssh slave2

5.安装jdk

在安装的时候注意设置JAVA_HOME指到java的安装目录,如果不知道java的安装目录,可以通过which java 查看有那些可执行的文件名叫java,如果显示了/usr/bin/java,继续查看ll /usr/bin/java找到其指向,一直找到最后的java实际安装位置。

这里最好使用oracle 官网的jdk,自己配置java的PATH、JAVA_HOME等信息

6.安装与配置hadoop

6.1安装hadoop

hadoop在master、slave1、slave2上都要安装,先在master节点上安装配置完成,然后复制到slave1、slave2节点上。

#解压缩到/usr/local目录下
sudo tar -zxvf ~/下载/hadoop-2.7.2.tar.gz -C /usr/local

#改名
sudo mv /usr/local/hadoop-2.7.2  /usr/local/hadoop

#使hadoop成为hadoop文件夹下所有文件的所有者,-R表示递归地进行,类似于rm -rf里的r
sudo chown -R hadoop /usr/local/hadoop

#添加hadoop到.bashrc文件,~表示当前用户的家目录,.bashrc文件前面有一个点表示这个文件在文件夹中不显示,除非使用ll
sudo vim ~/.bashrc

# .bashrc 文件的末尾添加如下内容
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:%HADOOP_HOME/sbin

# 使配置生效
source ~/.bashrc

6.2配置hadoop

hadoop的所有的配置文件都在/usr/local/hadoop/etc/hadoop下

  1. 配置slaves文件,顾名思义slaves文件就是制定谁是这个hadoop系统里的slave节点,当再次增加slave节点的时候,还需要在所有节点的这个文件里添加新的slave名称
  • 【二选一】如果是master只作为namenode节点,不存储数据,那在slaves文件中写入
slave1
slave2
  • 【二选一】如果是master不止作为namenode节点,也存储数据,那在slaves文件中写入
master
slave1
slave2

2. 配置core-site.xml文件

这里是配置Hadoop的临时文件目录,以及hdfs的API接口

  <configuration>
      <property>
          <name>hadoop.tmp.dir</name>
          <value>file:/usr/local/hadoop/tmp</value>
          <description>Abase for other temporary directories.</description>
      </property>
      <property>
          <name>fs.defaultFS</name>
          <value>hdfs://master:9000</value>
      </property>
  </configuration>

3. 配置hdfs-site.xml文件

该文件主要是和分布式文件系统相关的配置。

dfs.replication表示文件的备份数量。按照hadoop分布式配置教程配置的时候,只配置里dfs.replication,在配置完成格式化name-node的时候报错“hadoop格式化namenode时报异常: URI has an authority component。后来参考里单机版和伪分布式的配置和《hadoop格式化namenode时报异常: URI has an authority component》这篇博客,加了dfs.namenode.name.dir和dfs.datanode.data.dir两个属性 。

  <configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
    </configuration>

4. 配置mapred-site.xml文件

这里是配置mapreduce 相关的内容,设置使用yarn做资源调度。

  <configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
  </configuration>

5. 配置yarn-site.xml文件

<configuration>
  <!-- Site specific YARN configuration properties -->
      <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
      </property>
      <property>
          <name>yarn.resourcemanager.hostname</name>
          <value>master</value>
      </property>
  </configuration>

6. 配置 hadoop-env.sh

在hadoop-env.sh文件中,配置JAVA_HOME。如果不配置,后续启动集群的时候,可能报错“Error: JAVA_HOME is not set and could not be found”.

我配置的样子如下所示

# The java implementation to use.
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/opt/jdk1.8  # 这个是我的java home 路径,需要根据你自己服务器的情况配置

7. 配置 yarn-env.sh

同上面类似,配置JAVA_HOME

export JAVA_HOME=/opt/jdk1.8

6.3 拷贝hadoop文件

复制hadoop从master到slave1和slave2节点。

#在master节点上
cd /usr/local
tar -zcf ~/hadoop.master.tar.gz ./hadoop
cd ~
scp hadoop.master.tar.gz hadoop@slave1:/home/hadoop
scp hadoop.master.tar.gz hadoop@slave2:/home/hadoop

#在slave1节点上
sudo rm -rf /usr/local/hadoop
sudo tar -zxf hadoop.master.tar.gz -C /usr/local/
sudo chown -R hadoop /usr/local/hadoop

#在slave2节点上
sudo rm -rf /usr/local/hadoop
sudo tar -zxf hadoop.master.tar.gz -C /usr/local/
sudo chown -R hadoop /usr/local/hadoop

6.4 运行hadoop

#在master节点上
cd /usr/local/hadoop

#格式化namenode节点,只需要一次
bin/hdfs namenode -format

#运行hadoop
sbin/start-all.sh

报错: 如果格式化报错说“Error: JAVA_HOME is not set and could not be found” 需要在/usr/local/hadoop/etc/hadoop/hadoop-env.sh修改“export JAVA_HOME=${JAVA_HOME} ”为“export JAVA_HOME*=实际安装地址* ”。

在安装spark的时候也可能遇到spark work节点上启动不了,提示“JAVA_HOME is not set”,类似hadoop,参考这篇博客《spark work节点上启动不了 提示JAVA_HOME is not set

#在master、slave1、slave2上运行jps查看是否启动成功
jps

jps命令在slave1上运行没有问题,但是我的master节点上运行jps的时候,shell提醒我“程序 'jps' 已包含在下列软件包中”。应该是因为我的master节点上安装过好几次java。《在Ubuntu 14.04 LTS上安装部署Hadoop 2.7.1(伪分布式)》参考里这篇博客里的解答,手动设置默认的JDK,问题解决。

至此,分布式hadoop安装成功!

重新格式化name node

如果想要重新格式化namenode节点,就需要停止集群,然后删掉Hadoop创建的文件夹。

# master 节点上
cd /usr/local/hadoop
sbin/stop-all.sh

# 所有节点上
cd /usr/local/hadoop
rm -rf tmp
rm -rf logs

6.5 hadoop 测试

打开页面 http://192.168.3.10:50070/

image.png

打开yarn 页面 http://192.168.3.10:8088/

image.png

7.安装与配置spark

7.1安装spark

下载spark-2.3.0-bin-hadoop2.7.tgz到服务器。

注意 这里选择spark-2.3.0-bin-hadoop2.7.tg,不要使用spark-2.3.0-bin-without-hadoop2.7.tgz,因为后续启动spark时候可能报错。具体的原因我没有深究。

# 在master节点上
sudo tar -zxf spark-2.3.0-bin-hadoop2.7.tgz -C /usr/local/
sudo mv /usr/local/spark-2.3.0-bin-hadoop2.7 /usr/local/spark
sudo chown -R hadoop ./spark

#配置.bashrc,在文件末尾添加下面两行
export SPARK_HOME=/usr/local/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin

7.2配置spark

spark的配置文件在/usr/local/spark/conf下

  1. 配置slaves文件

复制slaves.template 为slaves,在slaves中添加如下内容

slave1
slave2

2. 配置spark-env.sh文件

复制spark-env.sh.template为spark-env.sh,在spark-env.sh中添加如下内容,其中SPARK_MASTER_IP为spark集群master节点的ip

export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
export SPARK_MASTER_IP=192.168.3.10

7.3 拷贝安装文件

复制master节点下/usr/local/spark到slave1、slave2

#在master节点上
tar -zcf ~/spark.master.tar.gz /usr/local/spark
cd ~
scp ./spark.master.tar.gz hadoop@slave1:/home/hadoop
scp ./spark.master.tar.gz hadoop@slave2:/home/hadoop

#在slave1节点上
sudo rm -rf /usr/local/spark
sudo tar -zxf ~/spark.master.tar.gz -C /usr/local/
sudo chown -R hadoop /usr/local/spark

#在slave2节点上
sudo rm -rf /usr/local/spark
sudo tar -zxf ~/spark.master.tar.gz -C /usr/local/
sudo chown -R hadoop /usr/local/spark

7.4启动spark

  1. 启动hadoop集群
# 在master节点上
cd /usr/local/hadoop
sbin/start-all.sh
  1. 启动spark集群
# 在master节点上
cd /usr/local/spark/
#启动master节点
sbin/start-master.sh
#启动slaves节点
sbin/start-slaves.sh
  1. 通过jps查看
# 在master、salve1、slave2节点上
jps
  1. 打开页面 http://192.168.3.10:8080/

image.png

7.5 关闭spark (如果需要)

  1. 关闭master节点
# master节点上
sbin/stop-master.sh

2. 关闭slaves节点

# master节点上
sbin/stop-slaves.sh

3. 关闭hadoop集群

# master节点上
cd /usr/local/hadoop/
sbin/stop-all.sh

8. 部署hive

8.1 部署mysql5.7

我这里使用的是docker-compose部署的,因为很方便,当然不借助docker, 直接安装到物理机上也可以。

我查询到的hive这个版本是跟mysql5.x匹配的,不知道支不支持mysql8.x。

找一台服务器,安装好docker、docker-compose。这里不再赘述这两个的安装过程。

  1. 创建文件夹
sudo mkdir /work # 我习惯把docker-compose的所有项目放到这个目录,你可以根据自己习惯放置
sudo chmod 777 /work # 我偷懒赋予了所有权限,哈哈

# 创建mysql文件放置到文件夹
mkdir -p /work/bigdata/mysql/conf
mkdir -p /work/bigdata/mysql/data
  1. 配置mysql
# 配置mysql
vim /work/bigdata/mysql/conf/my.cnf

my.cnf 配置内容如下:

[mysql]
#mysql客户端默认字符集
default-character-set=utf8
[mysqld]
# 设置3306端口
port = 3306
# 允许最大连接数
max_connections=1000
# 设置mysql服务端默认字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 缓存大小
sort_buffer_size=256MB

3. 编写docker-compose.yml

vim /work/bigdata/docker-compose.yml

docker-compose.yml 内容

version: '3'
services:
  mysql:
    image: mysql:5.7
    container_name: mysql
    ports:
      - 3306:3306
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/conf/my.cnf:/etc/mysql/my.cnf
    environment:
      # 配置了root密码
      MYSQL_ROOT_PASSWORD: "root"
    restart: always
    privileged: true

4. 启动mysql

cd /work/bigdata
docker-compose up -d

这样mysql 就启动了

  1. 配置mysql中hive信息 进入mysql后输入:
create database metastore;
grant all on metastore.* to hive@'%'  identified by 'hive';
grant all on metastore.* to hive@'localhost'  identified by 'hive';
flush privileges;

8.2 安装hive

下载hive

# 在master节点上
sudo tar -zxf apache-hive-2.3.3-bin.tar.gz -C /usr/local/
sudo mv /usr/local/apache-hive-2.3.3-bin /usr/local/hive
sudo chown -R hadoop ./hive

#配置.bashrc,在文件末尾添加下面两行
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin

# 使配置生效
source ~/.bashrc

8.3 修改Hadoop配置

需要修改Hadoop的 core-site.xml配置

cd /usr/local/hadoop/etc/hadoop
vim core-site.xml

core-site.xml添加如下配置

<property>
 <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>

重启Hadoop

cd /usr/local/hadoop/
sbin/stop-all.sh
sbin/start-all.sh

8.3 配置hive

cd /usr/local/hive/conf
vim hive-site.xml  # 这里是新建一个文件。
  1. hive-site.xml 内容
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
    <name>hive.exec.scratchdir</name>
    <value>/usr/local/hive/tmp</value>
</property>
<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/usr/local/hive/warehouse</value>
</property>
<property>
    <name>hive.querylog.location</name>
    <value>/usr/local/hive/log</value>
</property>
 
<!-- 配置 MySQL 数据库连接信息 -->
<!-- 这里需要根据你自己的情况配置mysql的IP、端口、db、密码等信息 -->
<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true&characterEncoding=UTF-8&useSSL=false</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hive</value>
  </property>
</configuration>
  1. 配置hive_env.sh文件

加入JAVA_HOME和HADOOP_HOME方法和上文类似不赘述

如果在系统环境变量中配置了也可以进行此步

8.4 提供jdbc jar包

下载驱动 mysql-connector-java-5.xx,解压后将jar包拷贝到HIVE目录下的lib文件夹中

mv mysql-connector-java-5.1.48.jar $HIVE_HOME/lib

8.5 初始化hive

./schematool -dbType mysql -initSchema hive hive

8.6 测试hive

master 节点上输入命令。

hive -e "show databases;"

image.png

参考资料