0


Hadoop与Spark的x86和ARM混合集群部署【环境搭建篇】


笔者在完成课程设计时,突然想到把大数据框架同时部署到PC端虚拟机以及ARM架构的Linux板上,这篇博客记录集群部署流程以及例程测试。

部署架构如下图:若下文与架构图冲突,则以架构图为准。
在这里插入图片描述
运行环境:
PC方面,使用两台Ubuntu 20.04 LTS Focal Fossa虚拟机
ARM板子则使用香橙派5(RK3588S),系统是香橙派官方适配的Ubuntu20.04
三台设备通过手机作为路由器在同一网段下。

本篇主要包括:

  • 配置虚拟机
  • Hadoop安装
  • spark安装
  • zookeeper安装
  • kafka安装
  • mongodb安装
  • Kafka和香橙派串口测试例程
  • spark streaming 例程
  • pyspark Structured Streaming kafka 例程
  • 最终测试部分代码

配置虚拟机

一、下载ubuntu

清华源下载Ubuntu20.04

二、VMware加载镜像

三、基础配置

1.配置ssh

$ sudo apt-get update                         # 更新源
$ sudo apt-get upgrade                        # 更新已安装包

$ sudo apt install openssh-server            # 安装ssh服务器
$ sudo apt install openssh-client            # 安装ssh客户机

$ sudo vi /etc/ssh/ssh_config                # 去掉PasswordAuthentication yes前面的"#"号

$ sudo vi /etc/ssh/sshd_config    
            
# 在PermitRootLogin prohibit-password这行行首加上"#"
# 在此行下面添加新一行
PermitRootLogin yes

重启ssh

sudo /etc/init.d/ssh restart
$ sudo passwd                                # 输入密码,并确认密码

$ sudo apt install net_tools                # 安装最新版本的net_tools                
$ ifconfig -a                                # inet <ip地址> 就是远程ssh的ip

2.换源

Ubuntu系统中,软件源文件地址为:/etc/apt/sources.list

1.备份原来的源,将以前的源备份一下,以防以后可以用的。

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

2.打开/etc/apt/sources.list文件,在前面添加如下条目,并保存。

sudo vi /etc/apt/sources.list(可将vi更换为自己熟悉的编辑器)

#添加阿里源
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
#添加清华源
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse multiverse

更新源

sudo apt-get update

更新软件:

sudo apt-get upgrade

3.下载vim

sudo apt-get install vim

修改vim配置:

vim /etc/vim/vimrc

在最后加上

set ai                          " 自动缩进,新行与前面的行保持—致的自动空格
set aw                          " 自动写,转入shell或使用:n编辑其他文件时,当前的缓冲区被写入
set flash                       " 在出错处闪烁但不呜叫(缺省)
set ic                          " 在查询及模式匹配时忽赂大小写
set nu        
set number                      " 屏幕左边显示行号
"set showmatch                   " 显示括号配对,当键入“]”“)”时,高亮度显示匹配的括号
set showmode                    " 处于文本输入方式时加亮按钮条中的模式指示器
set showcmd                     " 在状态栏显示目前所执行的指令,未完成的指令片段亦会显示出来
set wrap                        " 长行显示自动折行
"colorscheme evening            " 设定背景为夜间模式
filetype plugin on              " 自动识别文件类型,自动匹配对应的, “文件类型Plugin.vim”文件,使用缩进定义文件
set autoindent                  " 设置自动缩进:即每行的缩进值与上一行相等;使用 noautoindent 取消设置
set cindent                     " 以C/C++的模式缩进
set noignorecase                " 默认区分大小写
set ruler                       " 打开状态栏标尺
set scrolloff=5                 " 设定光标离窗口上下边界 5 行时窗口自动滚动
set shiftwidth=4                " 设定 << 和 >> 命令移动时的宽度为 4
set softtabstop=4               " 使得按退格键时可以一次删掉 4 个空格,不足 4 个时删掉所有剩下的空格)
set tabstop=4                   " 设定 tab 长度为 4
set wrap                        " 自动换行显示
syntax enable
syntax on                       " 自动语法高亮

4.设置静态ip

不多赘述,不要忘记设置DNS

二、Hadoop安装

这里主要借鉴了这篇博客,按照此博主流程一步一步来即可,这里不再赘述,同时为了各类框架的兼容,请读者使用笔者部署架构里列出的版本号。
【大数据】Hadoop-3.3.4完全分布式安装(包含VMware16和Ubuntu22的下载安装及配置)、搭建、配置教程,以及Hadoop基础简介_hadoop hadoop-3.3.4 jdk jdk1 jdk1.8.0_144-CSDN博客
在这里插入图片描述

三、spark安装

# 解压
tar -zxvf spark-3.1.2-bin-hadoop3.2.tgz -C ../program/
# 配置环境

配置Spark由如下5个环境变量需要设置

SPARK_HOME: 表示Spark安装路径在哪里

PYSPARK_PYTHON: 表示Spark想运行Python程序, 那么去哪里找python执行器

JAVA_HOME: 告知Spark Java在哪里

HADOOP_CONF_DIR: 告知Spark Hadoop的配置文件在哪里

HADOOP_HOME: 告知Spark Hadoop安装在哪里

这5个环境变量 都需要配置在: /etc/profile中

# JAVA_HOME
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_361
# HADOOP_HOME
export HADOOP_HOME=/usr/local/hadoop-3.3.5
# SPARK_HOME
export SPARK_HOME=/usr/local/spark-3.3.1-bin-hadoop3
# PYSPARK_PYTHON
export PYSPARK_PYTHON=python3
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.10.9.5-src.zip:$PYTHONPATH

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HDFS_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop

export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SPARK_HOME/bin:$PATH
PYSPARK_PYTHON

JAVA_HOME

需要同样配置在:

~/.bashrc

# JAVA_HOME
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_361
# PYSPARK_PYTHON
export PYSPARK_PYTHON=/usr/local/bin/python3
export PATH=$JAVA_HOME/bin:$PATH

生效

source /etc/profile
source ~/.bashrc
配置Spark配置文件
cd /usr/local/spark-/conf
cp spark-env.sh.template spark-env.sh

文件最后加入以下内容:

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_361
export PYSPARK_PYTHON=python3
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop-3.3.5/bin/hadoop classpath)

测试

# 进入样例 jar 包所在位置
cd ~/program/spark-3.1.2-bin-hadoop3.2/examples/jars
# 提交任务
spark-submit --master yarn --class org.apache.spark.examples.SparkPi spark-examples_2.12-3.1.2.jar 1000

在这里插入图片描述

修改yarn配置

cd /export/server/hadoop/etc/hadoop

vim /export/server/hadoop/etc/hadoop/yarn-site.xml
<configuration>

    <!-- 配置yarn主节点的位置 -->

    <property>

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

        <value>node1</value>

    </property>

    <property>

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

        <value>mapreduce_shuffle</value>

    </property>

    <!-- 设置yarn集群的内存分配方案 -->

    <property>

        <name>yarn.nodemanager.resource.memory-mb</name>

        <value>20480</value>

    </property>

    <property>

        <name>yarn.scheduler.minimum-allocation-mb</name>

        <value>2048</value>

    </property>

    <property>

        <name>yarn.nodemanager.vmem-pmem-ratio</name>

        <value>2.1</value>

    </property>

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

    <property>

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

        <value>true</value>

    </property>

    <!-- 设置聚合日志在hdfs上的保存时间 -->

    <property>

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

        <value>604800</value>

    </property>

    <!-- 设置yarn历史服务器地址 -->

    <property>

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

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

    </property>

    <!-- 关闭yarn内存检查 -->

    <property>

        <name>yarn.nodemanager.pmem-check-enabled</name>

        <value>false</value>

    </property>

    <property>

        <name>yarn.nodemanager.vmem-check-enabled</name>

        <value>false</value>

    </property>

</configuration>

四、zookeeper安装

一、清华源下载.bin.tar.gz

二、解压

/usr/local/zookeeper.tar.gz -C /usr/local

三、修改 conf 下配置

cd /../zookeeper/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
dataDir=/usr/local/apache-zookeeper-3.7.2-bin/data //配置datadir文件
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888

四、写入节点ID

在dataDir=/usr/local/apache-zookeeper-3.7.2-bin/下创建data

data下创建myid

写入conf下的ID:例如master就写1,slave2就写3

在这里插入图片描述

五、修改环境变量

/etc/profile中加入:

export ZK_HOME=/usr/local/apache-zookeeper-3.7.2-bin
export PATH=$PATH:$ZK_HOME/bin

使生效

source /etc/profile

六、启动

三台设备都要执行命令:

# 启动Zookeeper服务
zkServer.sh start
# 查看该节点的Zookeeper角色
zkServer.sh status

关闭也要三台设备都执行:

zkServer.sh stop

出现异常:

在这里插入图片描述

为文件夹添加权限

chmod 777 文件夹目录 -R

编写zookeeper启动脚本:myzookeeper.sh

#! /bin/bash

case $1 in
"start"){
        for i in master slave1 slave2
        do
                echo " -------- $i 正在启动 Zookeeper ......"
                # 用于KafkaManager监控
                ssh $i "source /etc/profile;zkServer.sh start "
        done
        echo " -------- Zookeeper 集群已启动完成!-------"
};;
"stop"){
        for i in master slave1 slave2
        do
                echo " -------- $1 正在停止Zookeeper -------"
                ssh $i "source /etc/profile;zkServer.sh stop"
        done
        echo " -------- Zookeeper 集群已全部停止!-------"
};;
esac

五、kafka安装

一、下载解压

/usr/local/kafka.tar -C /usr/local

二、修改环境变量

sudo vim /etc/profile
# 添加如下内容
export KAFKA_HOME=/usr/local/kafka_2.12-2.6.3
export PATH=$PATH:$KAFKA_HOME/bin

使生效

source /etc/profile

三.修改配置

在 Kafka 安装目录下创建kafka-logs文件夹(用来存储分区信息的 ,不要把它与存放错误日志的目录混淆了,日志目录是配置在 `log4j.properties文件 里的 )

[jiang@hadoop01 kafka-2.1.0]$ mkdir kafka-logs

进入安装目录的

config/

目录下,修改配置文件

server.properties

,找到对应数据进行修改:

# broker的全局唯一标识号,不能重复. 给集群中的每个broker配置一个不同的id
broker.id=1,2,3
# 分区数据的存储位置
log.dirs=/usr/local/kafka_2.12-2.6.3/kafka-logs
# 连接Zookeeper集群地址
zookeeper.connect=master:2181,slave1:2181,slave2:2181

四、编写启动关闭集群shell命令

kafka.sh

#! /bin/bash

case $1 in
"start"){
        for i in master slave1 slave2
        do
                echo " -------- $i 正在启动 Kafka ......"
                # 用于KafkaManager监控
                ssh $i "source /etc/profile; nohup  /usr/local/kafka_2.12-2.6.3/bin/kafka-server-start.sh -daemon /usr/local/kafka_2.12-2.6.3/config/server.properties "
        done
        echo " -------- Kafka 集群已启动完成!-------"
};;
"stop"){
        for i in master slave1 slave2
        do
                echo " -------- $1 正在停止Kafka -------"
                ssh $i "source /etc/profile; /usr/local/kafka_2.12-2.6.3/bin/kafka-server-stop.sh"
        done
        echo " -------- Kafka 集群已全部停止!-------"
};;
esac

报错

在这里插入图片描述

修改kafka-run-class.sh

删掉**-XX:+UseG1GC**

问题解决

六、mongodb安装

一、概念

副本集ReplicaSet部署方式
副本集概念和原理:

副本集是MongoDB中实现高可用性和数据备份的一种方式。副本集由一个主节点(Primary)和多个从节点(Secondary)组成。主节点负责处理读写请求,从节点复制主节点的数据。当主节点发生故障时,系统会自动选举一个从节点作为新的主节点,保证服务的持续可用性。

二、下载,解压

在这里插入图片描述

解压安装包

tar zxf mongodb-linux-x86_64-rhel70-5.0.23.tgz -C /usr/local

由于解压后的文件夹名称太长了,重命名一下

mv mongodb-linux-x86_64-rhel70-5.0.2 mongodb-5.0.23

配置

/usr/local/mongodb-5.0.23/ 目录下 创建目录 用于存放 配置文件,日志以及数据

mkdir-p  conf log data

在 conf 目录 新建 mnogodb.conf 配置文件

vi mongodb.conf
#端口号
port = 27017

bind_ip = 0.0.0.0
 
#数据目录
dbpath = /usr/local/mongodb-5.0.23/data
#日志目录
logpath = /usr/local/mongodb-5.0.23/log/mongodb.log
#设置后台运行
fork = true
#日志输出方式
logappend = true
#开启认证
auth = true

启动 MongoDB

bin/mongod -config ./conf/mongodb.conf

报错

bin/mongod: error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory

解决办法:安装依赖

sudo apt-get update
sudo apt-get install libcurl4-openssl-dev
sudo apt-get install curl

终端连接

 bin/mongo --port 27017

查看版本

db.version()

此时,如果 注释了 auth = true 远端已经可以连接 MongoDB了

创建 root 用户

先切换用户

use admin
db.createUser(
  {
    user: "root",
    pwd: "123456",
    roles: [ { role: "root", db: "admin" } ]
  }
)

此时就可以使用可视化工具远程连接数据库

关闭服务

 连接终端
 bin/mongo --port 27017

1.数据库内部命令关闭:

> use admin
> db.shutdownServer()

2.使用MongoDB命令关闭:

/usr/local/mongodb/bin/mongod  --shutdown  -f  /etc/mongodb_master.conf

3.使用kill命令关闭:(危险的很,我就是这样被锁的)

ps -ef | grep mongo
kill 18288

至此,单机安装成功,下面开始副本集ReplicaSet部署

mongodb.conf后面加上

systemLog:
 #MongoDB发送所有日志输出的目标指定为文件
 destination: file
 #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
 path: "/usr/local/mongodb-5.0.23/log/mongodb.log"
 #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
 logAppend: true
storage:
 #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
 dbPath: "/usr/local/mongodb-5.0.23/data"
 journal:
   #启用或禁用持久性日志以确保数据文件保持有效和可恢复。
   enabled: true
processManagement:
 #启用在后台运行mongos或mongod进程的守护进程模式。
 fork: true
 #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
 pidFilePath: "/usr/local/mongodb-5.0.23/run/mongod.pid"
net:
 #服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
 #bindIpAll: true
 #服务实例绑定的IP
 bindIp: 0.0.0.0
 #绑定的端口
 port: 27017
replication:
 #副本集的名称
 replSetName: rs

启动节点服务

/usr/local/mongodb-5.0.23/bin/mongod -f /usr/local/mongodb-5.0.23/conf/mongodb.conf

###报错:

在这里插入图片描述

添加权限

sudo chmod 777 -R *

问题解决

连接主节点

/usr/local/mongodb-5.0.23/bin/mongo --port 27017

使用默认的配置初始化副本集,启动副本集

rs.initiate()

查看副本集的配置内容

rs.conf()

查看副本集状态

rs.status()

说明:

1) “set” : “rs” :副本集的名字
2) “myState” : 1:说明状态正常
3) “members” :副本集成员数组,此时只有一个: “name” : “node1:27017” ,该成员的角色是 “stateStr” : “PRIMARY”, 该节点是健康的: “health” : 1

添加副本从节点

rs.add(host, arbiterOnly)
arbiterOnly    boolean    可选的。 仅在 值为字符串时适用。 如果为true,则添加的主机是仲裁者。
host    string or document    要添加到副本集的新成员。 指定为字符串或配置文档:1)如 果是一个字符串,则需要指定新成员的主机名和可选的端口 号;2)如果是一个文档,请指定在members数组中找到的副 本集成员配置文档。 您必须在成员配置文档中指定主机字段。 有关文档配置字段的说明,详见下方文档:“主机成员的配置文档”

rs.add("slave1:27017")
rs.add("slave2:27017")

ok : 1 说明添加成功 但并不代表指定的副本节点已经正常添加到副本集中

此时可以查看副本集状态

rs.status()

关闭副本

先关闭次要节点,最后关闭主节点

操作

1.数据库相关
查看所有数据库

show databases

选择数据库(如果数据库不存在,不会报错;会隐式创建:当后期该数据库有数据时自动创建)

use 数据库名

删除数据库(先选中数据库)

db.dropDatabase()

2.集合相关
查看所有集合

show collections

创建集合(插入数据会隐式创建)

db.createCollection(‘co’)

删除集合

db.集合名.drop()

3.插入文档

db ; //admin

//db表示当前当前数据库
db.stus.insert({name:"小男孩",age:18,gender:"男"}) 
db.stus.insert({name:"猪八戒",age:28,gender:"男"});

//指定 _id插入
db.stus.insert({_id:"hello",name:"猪八戒",age:28,gender:"男"});

//插入多个对象
db.stus.insert([
    {name:"沙和尚",age:38,gender:"男"},
    {name:"白骨精",age:14,gender:"女"},
    {name:"蜘蛛精",age:14,gender:"女"}
]);
db.co.insert([
    {time:"2023.12.13.15:23",place:'01',RFID:"AF8C297B"},
    {time:"2023.12.13.15:23",place:'02',RFID:"AF8C297B"},
    {time:"2023.12.15.19:14",place:'01',RFID:"3A69826C"}
]);
//查询全部
db.stus.find(); 

//生成一个 _id
ObjectId() ;

4.查询

//查询所有
db.collection.find ()
//查询数组中第一个数据
db.collection.findOne()

//简单的条件查询
//查询当前数据库中”stus“集合的所有
db.stus.find(); 
//查询当前数据库中“stus”集合的 “_id=Hello”的所有数据
db.stus.find({_id:"hello"});
//查询当前数据库中“stus”集合的 “age=16" 并且 "name= 白骨精"的所有数据
db.stus.find({age:16 , name:"白骨精"});
//查询“age=28”的所有数据
db.stus.find({age:14});
//查询 “age=28”的第一个条数据
db.stus.findOne({age:28});
//统计当前数据库中 "stus"集合的所有数据条数
db.stus.find({}).count();

至此,完成框架安装。
测试例程见下文。

七、其他报错

sftp异常

重启服务即可

systemctl restart sshd.service

普通用户ssh登录

在这里插入图片描述

首先你可以试试

1、 ssh username@hostname

这里username是你要连接的电脑的用户名,hostname是它的地址。

如果可以的话,还是恭喜你。一次搞定。

如果失败

Permission denied (publickey,gssapi-keyex,gssapi-with-mic)

应该是你的配置文件出现了问题 /etc/ssh/sshd_config

这里我们使用简单的连接方式,很多同学可能也会使用另一种连接方式,那就是

2、ssh hostname

但是你会发现这样会出现这样的问题

Permission denied (publickey,gssapi-keyex,gssapi-with-mic)

并且一直输入密码总是提示密码不对,并一直报此错误。

那是因为你没有指定连接的用户名,它会默认使用当前的用户名所以会错误。

如果你不嫌麻烦可以使用

ssh username@hostname

当然也可以使用以下简单的方式:映射关系

在.ssh文件下创建一个文本config(如果没有)

touch config

编辑文档:

Host hostname

user username

例如:

HOST hadoop102
USER hadoop102
HoST hadoop103
USER hadoop103

添加的是对你连接关系的映射。

从hadoop102使用ssh hadoop103时默认改为ssh hadoop103@hadoop103,而不是原来的ssh hadoop102@hadoop103了

最后修改的最重要的一点记住权限问题config文档的权限同组用户严格为不能写权限

修改:

chmod644 config 

chmod600 config

再次使用 ssh 用户名 就ok了!!!

这篇文章我主要想说的就是config文件,不嫌麻烦你可以使用 ssh hadoop103@hadoop103,嫌麻烦你可以添加config文件的映射,直接ssh hadoop102。

至于前面的ssh连接我没有讲的太清楚,那些网上到处都是,就不说了 。

hdfs无法上传,显示用户错误

vim /etc/profile

添加:export HADOOP_USER_NAME=king1(king1为我的用户名)
source /etc/profile(记得执行,以保证立即生效)

标签: hadoop spark linux

本文转载自: https://blog.csdn.net/m0_64269338/article/details/136854013
版权归原作者 0liver King 所有, 如有侵权,请联系我们删除。

“Hadoop与Spark的x86和ARM混合集群部署【环境搭建篇】”的评论:

还没有评论