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下
- 配置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/
打开yarn 页面 http://192.168.3.10:8088/
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下
- 配置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
- 启动hadoop集群
# 在master节点上
cd /usr/local/hadoop
sbin/start-all.sh
- 启动spark集群
# 在master节点上
cd /usr/local/spark/
#启动master节点
sbin/start-master.sh
#启动slaves节点
sbin/start-slaves.sh
- 通过jps查看
# 在master、salve1、slave2节点上
jps
7.5 关闭spark (如果需要)
- 关闭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。这里不再赘述这两个的安装过程。
- 创建文件夹
sudo mkdir /work # 我习惯把docker-compose的所有项目放到这个目录,你可以根据自己习惯放置
sudo chmod 777 /work # 我偷懒赋予了所有权限,哈哈
# 创建mysql文件放置到文件夹
mkdir -p /work/bigdata/mysql/conf
mkdir -p /work/bigdata/mysql/data
- 配置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 就启动了
- 配置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 # 这里是新建一个文件。
- 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>
- 配置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;"