基于云服务器的数仓搭建-集群安装
数据模拟
上传文件至/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一下就正常显示了
参考资料
海波老师-电商数仓