当前位置: 首页 > article >正文

基于云服务器的数仓搭建-集群安装

数据模拟

上传文件至/opt/module/applog目录下

# 12.mock,application.yml、gmall-remake-mock-2023-02-17.jar、path.json、logback.xml
mkdir /opt/module/applog
#资料中包名称不一样,执行后在applog/log文件下生成一个 app.log文件
java -jar gmall-remake-mock-2023-05-15-3.jar test 100 2022-06-08

将上述日志生成命令封装为脚本

# 在/home/alpfree/bin目录下创建脚本lg.sh
vim lg.sh
#!/bin/bash
echo "========== hadoop1 =========="
ssh hadoop1 "cd /opt/module/applog/; nohup java -jar gmall-remake-mock-2023-05-15-3.jar $1 $2 $3 >/dev/null 2>&1 &"
# 修改脚本执行权限
chmod 777 lg.sh
#执行脚本
lg.sh test 100
#查看日志存放路径
cd /opt/module/applog/log

集群命令批量执行脚本

# 在/home/alpfree/bin目录下创建脚本xcall
vim xcall
#! /bin/bash
 
for i in hadoop1 hadoop2 hadoop3
do
    echo --------- $i ----------
    ssh $i "$*"
done
# 修改脚本执行权限
chmod 777 xcall
# 启动脚本
xcall jps

hadoop安装部署

部署方案

NameNode负责管理HDFS元数据(如文件目录结构、块位置等),需常驻内存。若元数据量大(如海量小文件),内存不足会导致性能瓶颈,因此分配4G内存

ResourceManager是YARN的核心调度器,需处理全局资源请求和任务调度,对内存要求较高(建议至少4G)

NameNode主要消耗内存(元数据管理),而ResourceManager需要CPU和内存(任务调度)。两者在2核4G下可共存,但需监控资源争用

hadoop1

hadoop2

hadoop3

配置

2C4G

2C2G

2C2G

HDFS

NameNode

DataNode

DataNode

SecondaryNameNode

DataNode

YARN

ResourceManager

NodeManager

NodeManager

NodeManager

安装

# 将hadoop3.3.4.tar.gz导入到opt目录下面的software文件夹下面
# 进入到Hadoop安装包路径下
cd /opt/software/
# 解压安装文件到/opt/module下面
tar -zxvf hadoop-3.3.4.tar.gz -C /opt/module/
# 查看是否解压成功
ls /opt/module/hadoop-3.3.4
# 重命名
mv /opt/module/hadoop-3.3.4 /opt/module/hadoop

将Hadoop添加到环境变量

# Hadoop安装路径 /opt/module/hadoop
# 打开/etc/profile.d/my_env.sh文件
sudo vim /etc/profile.d/my_env.sh
# 在profile文件末尾添加HADOOP_HOME路径:
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
# 保存后退出
:wq
# 分发环境变量文件
sudo /home/alpfree/bin/xsync /etc/profile.d/my_env.sh
# source 是之生效(3台节点)
source /etc/profile.d/my_env.sh

配置集群

# 配置core-site.xml
cd $HADOOP_HOME/etc/hadoop
vim core-site.xml
# 指定NameNode的地址
# 配置该atguigu(superUser)
# 配置hdfs-site.xml
vim hdfs-site.xml
# nn web端访问地址
# 2nn web端访问地址
# 配置yarn-site.xml
vim yarn-site.xml
# 指定ResourceManager的地址
# yarn单个容器允许分配的最大最小内存
# yarn容器允许管理的物理内存大小
# 关闭yarn对物理内存和虚拟内存的限制检查
# 配置mapred-site.xml
vim mapred-site.xml
# 配置workers
vim /opt/module/hadoop/etc/hadoop/workers
hadoop1
hadoop2
hadoop3
# 配置历史服务器,为了查看程序的历史运行情况,需要配置一下历史服务器
vim mapred-site.xml
# 在该文件里面增加如下配置
# <!-- 历史服务器端地址 -->
<property>
    <name>mapreduce.jobhistory.address</name>
    <value>hadoop1:10020</value>
</property>
# <!-- 历史服务器web端地址 -->
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>hadoop1:19888</value>
</property>
# 配置日志的聚集,应用运行完成以后,将程序运行日志信息上传到HDFS系统上
# 方便的查看到程序运行详情,方便开发调试,开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager
vim yarn-site.xml
# 在该文件里面增加如下配置
# <!-- 开启日志聚集功能 -->
<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>
# <!-- 设置日志聚集服务器地址 -->
<property>  
    <name>yarn.log.server.url</name>  
    <value>http://hadoop1:19888/jobhistory/logs</value>
</property>
# <!-- 设置日志保留时间为7天 -->
<property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
</property>

分发Hadoop,启动集群

cd /home/alpfree/bin

vim hdp.sh

# 群起脚本,在/home/atguigu/bin目录下创建hdp.sh
cd /home/alpfree/bin
vim hdp.sh
#!/bin/bash
if [ $# -lt 1 ]
then
    echo "No Args Input..."
    exit ;
fi
case $1 in
"start")
        echo " =================== 启动 hadoop集群 ==================="
        echo " --------------- 启动 hdfs ---------------"
        ssh hadoop1 "/opt/module/hadoop/sbin/start-dfs.sh"
        echo " --------------- 启动 yarn ---------------"
        ssh hadoop1 "/opt/module/hadoop/sbin/start-yarn.sh"
;;
"stop")
        echo " =================== 关闭 hadoop集群 ==================="
        echo " --------------- 关闭 yarn ---------------"
        ssh hadoop1 "/opt/module/hadoop/sbin/stop-yarn.sh"
        echo " --------------- 关闭 hdfs ---------------"
        ssh hadoop1 "/opt/module/hadoop/sbin/stop-dfs.sh"
;;
*)
    echo "Input Args Error..."
;;
esac
# 增加权限
chmod 777 hdp.sh
        echo " --------------- 启动 historyserver ---------------"
        ssh hadoop1 "/opt/module/hadoop/bin/mapred --daemon start historyserver"
        
        echo " --------------- 关闭 historyserver ---------------"
        ssh hadoop1 "/opt/module/hadoop/bin/mapred --daemon stop historyserver"
# 分发Hadoop
xsync /opt/module/hadoop/
# 集群是第一次启动,需要在hadoop102节点格式化NameNode
# 注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)
cd /opt/module/hadoop/
bin/hdfs namenode -format
# 启动HDFS
sbin/start-dfs.sh
# 在配置了ResourceManager的节点(hadoop103)启动YARN
sbin/start-yarn.sh
# Web端查看HDFS的Web页面:http://hadoop1:9870/ http://113.45xx:9870/ 
# Web端查看SecondaryNameNode http://hadoop3:9868/status.html http://106.75.xx:9868/status.html
# 验证是否正常启动,查看线程,查看命令
jps 
hdfs dfs -ls /
# 开放必要的端口
# 启动集群
hdp.sh start
# 查看进程
xcall jps
# 停止集群
hdp.sh stop
# 查看进程
xcall jps

启动失败后解决方案

# 修改 hadoop-env.sh 文件永久设置环境变量,成功启动
vim etc/hadoop/hadoop-env.sh
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
# 创建一个新用户,但需要复制环境变量,没复制,没采用
# 创建hadoopuser
sudo useradd -m hadoopuser
sudo passwd hadoopuser #之后修改密码为 fN2ck659!
# 编辑 sbin/start-dfs.sh 和 sbin/stop-dfs.sh 脚本
export HDFS_NAMENODE_USER="hadoopuser"
export HDFS_DATANODE_USER="hadoopuser"
export HDFS_SECONDARYNAMENODE_USER="hadoopuser"
sudo chown -R hadoopuser:hadoopuser /opt/module/hadoop
# 在调用启动脚本时指定用户
sudo -u hadoopuser sbin/start-dfs.sh

连接不上解决方案

节点之间不能通信解决方案-修改host

分别修改对应的host为内网ip
vim /etc/hosts
外网ip 内网ip
https://blog.csdn.net/YongDaiMe/article/details/106837195

执行脚本及验证

# 分发Hadoop
xsync /opt/module/hadoop/
重启过程
hdfs namenode -format
hdp.sh start
xcall jps
hdp.sh stop
检查状态
hdfs dfsadmin -report
yarn node -list
C:\Windows\System32\drivers\etc\hosts
http://hadoop3:9868/status.html
http://hadoop1:9870/

历史服务器,日志聚集暂不配置

后续优化

# 生产环境服务器磁盘情况
# 在hdfs-site.xml文件中配置多目录,注意新挂载磁盘的访问权限问题
# DataNode节点保存数据的路径由dfs.datanode.data.dir参数决定,其默认值为file://${hadoop.tmp.dir}/dfs/data,
# 若服务器有多个磁盘,必须对该参数进行修改
df -h
# 集群数据均衡
# 开启数据均衡命令
# 参数10,代表的是集群中各个节点的磁盘空间利用率相差不超过10%
start-balancer.sh -threshold 10
# 停止数据均衡命令
stop-balancer.sh
# 磁盘间数据均衡
# 执行均衡计划
# 查看当前均衡任务的执行情况
# 取消均衡任务
hdfs diskbalancer -plan hadoop103
hdfs diskbalancer -query hadoop103
hdfs diskbalancer -cancel hadoop103.plan.json
HDFS参数调优hdfs-site.xml
# NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作
# 对于大集群或者有大量客户端的集群来说,通常需要增大参数
# dfs.namenode.handler.count的默认值10
# YARN参数调优yarn-site.xml
# 7台机器,每天几亿条数据,数据源->Flume->Kafka->HDFS->Hive
# 数据统计主要用HiveSQL,没有数据倾斜,小文件已经做了合并处理,开启的JVM重用,而且IO没有阻塞,内存用了不到50%
# 但是还是跑的非常慢,而且数据量洪峰过来时,整个集群都会宕掉。基于这种情况有没有优化方案
# 解决办法:
# 内存利用率不够。这个一般是Yarn的2个配置造成的,
# 单个任务可以申请的最大内存大小,和Hadoop单个节点可用内存大小。调节这两个参数能提高系统内存的利用率
yarn.nodemanager.resource.memory-mb
# 表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果
# 你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量
# yarn.scheduler.maximum-allocation-mb
# 单个任务可申请的最多物理内存量,默认是8192(MB)。

zookeeper安装

安装步骤

# 解压安装
# 上传解压Zookeeper安装包到/opt/module/目录下
tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz -C /opt/module/
# 修改/opt/module/apache-zookeeper-3.7.1-bin名称为zookeeper-3.7.1
mv apache-zookeeper-3.7.1-bin/ zookeeper
# 配置服务器编号
# 在/opt/module/zookeeper/目录下创建zkData
mkdir zkData
# 在/opt/module/zookeeper/zkData目录下创建一个myid的文件
# 在文件中添加与server对应的编号 1,在zkData 下创建,不然启动不了
vim myid
# 配置zoo.cfg文件
# 重命名/opt/module/zookeeper/conf目录下的zoo_sample.cfg为zoo.cfg
mv zoo_sample.cfg zoo.cfg
# 打开zoo.cfg文件
vim zoo.cfg
# 修改数据存储路径配置
dataDir=/opt/module/zookeeper/zkData
# 增加如下配置,server.A=B:C:D。
# A的值与zoo.cfg里面的配置信息比较从而判断到底是哪个server
# B是这个服务器的地址
# C Follower与集群中的Leader服务器交换信息的端口
# D 执行选举时服务器相互通信的端口
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888
#端口之间通信,需要在云服务器上打开对应的端口
# 同步/opt/module/zookeeper目录内容到hadoop2、hadoop3
xsync zookeeper/
# 分别修改hadoop2、hadoop3上的myid文件中内容为2、3
vim myid
# 集群操作
# 分别启动Zookeeper
# 查看状态
bin/zkServer.sh start
bin/zkServer.sh status

ZK集群启动停止脚本

# Zookeeper集群启动、停止、查看状态
zk.sh start
zk.sh stop
zk.sh status
# 在hadoop1的/home/alpfree/bin目录下创建脚本
vim zk.sh
#!/bin/bash
case $1 in
"start"){
    for i in hadoop1 hadoop2 hadoop3
    do
        echo ---------- zookeeper $i 启动 ------------
        ssh $i "/opt/module/zookeeper/bin/zkServer.sh start"
    done
};;
"stop"){
    for i in hadoop1 hadoop2 hadoop3
    do
        echo ---------- zookeeper $i 停止 ------------    
        ssh $i "/opt/module/zookeeper/bin/zkServer.sh stop"
    done
};;
"status"){
    for i in hadoop1 hadoop2 hadoop3
    do
        echo ---------- zookeeper $i 状态 ------------    
        ssh $i "/opt/module/zookeeper/bin/zkServer.sh status"
    done
};;
esac
# 增加脚本执行权限
chmod 777 zk.sh

故障解决

在zookeeper目录下创建的myid,导致启动失败,应在子目录zkData下创建

安全组端口开放,三个端口

Kafka安装

安装步骤

安装部署
上传并解压安装包
tar -zxvf kafka_2.12-3.3.1.tgz -C /opt/module/
修改解压后的文件名称
cd /opt/module/
mv kafka_2.12-3.3.1/ kafka
进入到/opt/module/kafka目录,修改配置文件,打开9092端口
cd config/
vim server.properties
分发安装包
xsync kafka/
分别在hadoop103和hadoop104上修改配置文件
/opt/module/kafka/config/server.properties中的broker.id及advertised.listeners
配置环境变量
在/etc/profile.d/my_env.sh文件中增加kafka环境变量配置
sudo vim /etc/profile.d/my_env.sh
#KAFKA_HOME
export KAFKA_HOME=/opt/module/kafka
export PATH=$PATH:$KAFKA_HOME/bin
刷新一下环境变量
source /etc/profile
分发环境变量文件到其他节点,并source
sudo /home/alpfree/bin/xsync /etc/profile.d/my_env.sh

配置文件

#broker的全局唯一编号,不能重复,只能是数字。
broker.id=0
#broker对外暴露的IP和端口 (每个节点单独配置)
advertised.listeners=PLAINTEXT://hadoop1:9092
#处理网络请求的线程数量
num.network.threads=3
#用来处理磁盘IO的线程数量
num.io.threads=8
#发送套接字的缓冲区大小
socket.send.buffer.bytes=102400
#接收套接字的缓冲区大小
socket.receive.buffer.bytes=102400
#请求套接字的缓冲区大小
socket.request.max.bytes=104857600
#kafka运行日志(数据)存放的路径,路径不需要提前创建,kafka自动帮你创建,可以配置多个磁盘路径,路径与路径之间可以用","分隔
log.dirs=/opt/module/kafka/datas
#topic在当前broker上的分区个数
num.partitions=1
#用来恢复和清理data下数据的线程数量
num.recovery.threads.per.data.dir=1
# 每个topic创建时的副本数,默认时1个副本
offsets.topic.replication.factor=1
#segment文件保留的最长时间,超时将被删除
log.retention.hours=168
#每个segment文件的大小,默认最大1G
log.segment.bytes=1073741824
# 检查过期数据的时间,默认5分钟检查一次是否数据过期
log.retention.check.interval.ms=300000
#配置连接Zookeeper集群地址(在zk根目录下创建/kafka,方便管理)
zookeeper.connect=hadoop1:2181,hadoop2:2181,hadoop3:2181/kafka

启动命令

# 先启动Zookeeper集群,然后启动Kafka
zk.sh start
# 依次在hadoop102、hadoop103、hadoop104节点上启动Kafka
bin/kafka-server-start.sh -daemon config/server.properties
# 查看进程
xcall jps
# 停止Kafka
bin/kafka-server-stop.sh
# 在/home/alpfree/bin目录下创建文件kf.sh脚本文件
vim kf.sh
#! /bin/bash
case $1 in
"start"){
    for i in hadoop1 hadoop2 hadoop3
    do
        echo " --------启动 $i Kafka-------"
        ssh $i "/opt/module/kafka/bin/kafka-server-start.sh -daemon /opt/module/kafka/config/server.properties"
    done
};;
"stop"){
    for i in hadoop1 hadoop2 hadoop3
    do
        echo " --------停止 $i Kafka-------"
        ssh $i "/opt/module/kafka/bin/kafka-server-stop.sh "
    done
};;
esac
 
# 添加执行权限
chmod 777 kf.sh
# 启动\停止集群命令
kf.sh start
kf.sh stop
# 停止Kafka集群时,一定要等Kafka所有节点进程全部停止后再停止Zookeeper集群。
# 因为Zookeeper集群当中记录着Kafka集群相关信息,Zookeeper集群一旦先停止,Kafka集群就没有办法再获取停止进程的信息,只能手动杀死Kafka进程了

命令行操作

查看操作主题命令参数
bin/kafka-topics.sh
查看当前服务器中的所有topic
bin/kafka-topics.sh --bootstrap-server hadoop1:9092 --list
创建first topic
bin/kafka-topics.sh --bootstrap-server hadoop1:9092 --create --partitions 1 --replication-factor 3 --topic first
查看first主题的详情
bin/kafka-topics.sh --bootstrap-server hadoop1:9092 --describe --topic first
修改分区数(注意:分区数只能增加,不能减少)
bin/kafka-topics.sh --bootstrap-server hadoop1:9092 --alter --topic first --partitions 3
删除topic
bin/kafka-topics.sh --bootstrap-server hadoop1:9092 --delete --topic first
生产者命令行操作
查看操作生产者命令参数
bin/kafka-console-producer.sh
发送消息
bin/kafka-console-producer.sh --bootstrap-server hadoop1:9092 --topic first
消费者命令行操作
查看操作消费者命令参数
bin/kafka-console-consumer.sh
消费first主题中的数据
bin/kafka-console-consumer.sh --bootstrap-server hadoop1:9092 --topic first
把主题中所有的数据都读取出来(包括历史数据)
bin/kafka-console-consumer.sh --bootstrap-server hadoop1:9092 --from-beginning --topic first

故障点

百度的机器没启动起来,修改jvm初始和最大内存为512M

# kafka-server-start.sh 脚本片段
# 原来
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
fi
# 修改后
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx512M -Xms512M"
fi

Flume安装

安装步骤

# 将apache-flume-1.10.1-bin.tar.gz上传到linux的/opt/software目录下
# 解压apache-flume-1.10.1-bin.tar.gz到/opt/module/目录下
tar -zxf /opt/software/apache-flume-1.10.1-bin.tar.gz -C /opt/module/
# 修改apache-flume-1.10.1-bin的名称为flume
mv /opt/module/apache-flume-1.10.1-bin /opt/module/flume
# 修改conf目录下的log4j2.xml配置文件,配置日志文件路径
   <Property name="LOG_DIR">/opt/module/flume/log</Property>
   
# 引入控制台输出,方便学习查看日志
    <Root level="INFO">
      <AppenderRef ref="LogFile" />
      <AppenderRef ref="Console" />
    </Root>
# 堆内存调整
# 修改/opt/module/flume/conf/flume-env.sh文件,配置如下参数
vim flume-env.sh
export JAVA_OPTS="-Xms2048m -Xmx2048m -Dcom.sun.management.jmxremote"
# 分发
xsync /opt/module/flume/

日志采集flume配置

# 在hadoop1节点的Flume的job目录下创建file_to_kafka.conf
mkdir job
vim job/file_to_kafka.conf
# 配置文件内容如下
#定义组件
a1.sources = r1
a1.channels = c1
#配置source
a1.sources.r1.type = TAILDIR
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 = /opt/module/applog/log/app.*
a1.sources.r1.positionFile = /opt/module/flume/taildir_position.json
#配置channel
a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel
a1.channels.c1.kafka.bootstrap.servers = hadoop1:9092,hadoop3:9092
a1.channels.c1.kafka.topic = topic_log
a1.channels.c1.parseAsFlumeEvent = false
#组装 
a1.sources.r1.channels = c1

Flume启动脚本

# 日志采集Flume启停脚本
# 在hadoop102节点的/home/alpfree/bin目录下创建脚本f1.sh
vim f1.sh
#!/bin/bash
case $1 in
"start"){
    echo " --------启动 hadoop102 采集flume-------"
    ssh hadoop1 "nohup /opt/module/flume/bin/flume-ng agent -n a1 -c /opt/module/flume/conf/ -f /opt/module/flume/job/file_to_kafka.conf >/dev/null 2>&1 &"
};; 
"stop"){
    echo " --------停止 hadoop102 采集flume-------"
    ssh hadoop1 "ps -ef | grep file_to_kafka | grep -v grep |awk  '{print \$2}' | xargs -n1 kill -9 "
};;
esac
# 增加脚本执行权限
chmod 777 f1.sh
# f1启动\f1停止
f1.sh start
f1.sh stop

测试

# 启动Zookeeper、Kafka集群 zk.sh start kf.sh start
# 启动hadoop102的日志采集Flume f1.sh start
bin/flume-ng agent -n a1 -c conf/ -f job/file_to_kafka.conf
# 启动一个Kafka的Console-Consumer
bin/kafka-console-consumer.sh --bootstrap-server hadoop1:9092 --topic topic_log
# 生成数据,执行集群日志生成脚本
lg.sh test 100
# 观察Kafka消费者是否能消费到数据 kafka tool 
连接方式

故障

复制配置文件的时候,开头少写一个 a

可以看到消息,但kakfa中显示的是二进制文件,在kafka tool中更改下内容类型,再upate一下就正常显示了

参考资料

海波老师-电商数仓


http://www.kler.cn/a/611790.html

相关文章:

  • Pytorch学习笔记(十二)Learning PyTorch - NLP from Scratch
  • 禅道后台命令执行漏洞
  • 数位和相等
  • 【一起来学kubernetes】24、Service使用详解
  • 进程通信 system V共享内存 ─── linux第25课
  • 【漏洞修复】Android 10 系统源码中的 glibc、curl、openssl、cups、zlib 更新到最新版本
  • ECharts各类炫酷图表/3D柱形图
  • HTML之内联样式
  • 用WSL安装Ubuntu(Windows11)
  • 计算机二级(C语言)考试高频考点总汇(三)—— 结构体和共用体、结构体对齐规则、联合体大小计算
  • 力扣DAY29 | 热100 | 删除链表的倒数第N个结点
  • JumpServer:一款企业级开源堡垒机
  • Spring:Bean的作用域、循环依赖和事务
  • Docker-清理容器空间prune
  • 【sql优化】where 1=1
  • 实测:C++ 重构神经网络组件,神经网络内存占用降低
  • SQL Server安装过程中提示 .NET Framework 4.8 缺失
  • 2025年成都市双流区农业科技试验示范基地建设方案申报条件材料和补贴程序、时间安排
  • PySimpleGUI安装老版本,给软件链接,免费用,教程
  • 使用集成过滤插件在 Logstash 中处理来自 Elastic 集成的数据