Kafka+Zookeeper安装
本文安装配置环境为多个ubuntu20.04 集群,安装包皆来自apache官网,分别为kafka2.4.1 + zookeeper3.6.3 + jdk1.8,在文章末尾附上自用的zookeeper、kafka群起脚本
注: 本文不包含jdk安装,详情见我的上一篇jdk1.8+hadoop3.2+scala2.12+spark3.1.2配置记录
Zookeeper3.6.3安装配置(已完成解压,目录为/home/hadoop/Zookeeper)
复制配置文件并重命名
1 | cp ~/Zookeeper/conf/zoo_sample.cfg ~/Zookeeper/conf/zoo.cfg |
新建Data文件夹,存放运行数据
1 | mkdir ~/Zookeeper/zkData |
修改配置文件内容
1 | # The number of milliseconds of each tick |
运行:
1 | /home/hadoop/Zookeeper/bin/zkServer.sh start |
不同服务器中应修改对应的myid内容,文件路径为Zookeeper/zkData/myid
将该文件中的数值改成对应服务器序号即可,如我的hadoop101中保持1,hadoop102修改成2,以此类推。
注: 也可参考jdk1.8+hadoop3.2+scala2.12+spark3.1.2配置记录中将bin文件夹注入到.bashrc中作为环境变量使用
Kafka2.4.1安装配置(已完成解压,目录为/home/hadoop/Kafka)
修改Kafka/config/server.properties文件
1 | ############################# Server Basics ############################# |
注: 在每个服务器中该文件中的broker.id值应不同
修改kafka中的zookeeper配置,文件路径:Kafka/config/zookeeper.properties,修改其中dataDir为响应路径即可,其他属性按需修改
1 | dataDir=/home/hadoop/Zookeeper |
运行:
1 | /home/hadoop/Kafka/bin/kafka-server-start.sh -daemon /home/hadoop/Kafka/config/server.properties |
当然在安装过程中也遇到不少问题,一下列出代表性问题,并给出解决方案:
1、使用群启脚本启动kafka时日志报错:
1 | nohup: failed to run command 'java': No such file or directory |
解决方案
修改Kafka/bin/kafka-run-class.sh中内容,在该文件头部添加需要使用的JAVA_HOME绝对路径即可(网传在群起脚本中添加的source /etc/profile无果可采取这种办法):
1 | export JAVA_HOME="/home/hadoop/JDK" |
2、启动后kafka闪退,日志报错zookeeper连接2181超时
解决方案
该错误有以下几点可能:
- 防火墙策略问题
- zookeeper未安装
- zookeeper配置错误
- zookeeper没在启动Kafka之前启动
3、zookeeper本地启动无问题,但群起Zookeeper脚本会导致日志报错JAVA_HOME找不到
解决方案
和问题1一样,添加JAVA_HOME的绝对路径,文件路径为Zookeeper/bin/zkEnv.sh
1 | JAVA_HOME="/home/hadoop/JDK" |
4、群起脚本跑完后发现只有一台机器成功运行zookeeper
重点关注上文提及的唯一编号的属性值(zookeeper:myid;kafka:broker.id)是否在每台机器上作出修改,再考虑配置错误
群起脚本附录
Zookeeper
1 | #! /bin/bash |
Kafka
1 | #! /bin/bash |
jdk1.8+hadoop3.2+scala2.12+spark3.1.2配置记录
记录下我在ubuntu20.04-用户hadoop环境下搭建jdk+hadoop+scala+spark环境的过程(不安装到root相关目录下)
tensorflow报错显存不够的应对措施
简单粗暴
1 | # tensorflow 内存不够的情况 适用于tensorflow 2.x |
hadoop集群搭建踩坑
问题1:
第一次启动集群前需要将master进行hdfs格式化
1 | hdfs namenode -format |
注:若以后想要再次格式化需关闭所有namenode、datanode,并删除hadoop目录下data、logs文件夹
问题2:
启动报错“Attempting to operate on hdfs namenode as root”
可在/etc/profile.d中添加一个sh脚本注入环境变量,脚本内容如下
1 | export HDFS_NAMENODE_USER=root |
问题3:
jps命令查询后发现datanode、namenode、nodemanager都正常启动了,唯独不见resourcemanager
启动集群时,不应直接调用./start-all.sh,应当在master上调用./start-dfs.sh,在准备部署resourcemanager的服务器上调用./start-yarn.sh
问题4:
localhost: mv: 无法获取“XXX”状态信息
要么是xml文件配置存在错误,要么是防火墙存在问题
centos7关闭开启防火墙命令如下:
1 | #关闭防火墙: |
问题5:
secondnamenode可视化查看网页打不开
同上
问题6:
启动nodemanagers时报出警告“localhost: Warning: Permanently added ‘localhost’ (ECDSA) to the list of known hosts.”
删除hadoop/etc/hadoop/workers文件中的localhost一行即可
python中base64模块解码报错“Incorrect padding”
问题描述
解码被base64编码过的字段信息,在base64编码解码工具中正常解码,但在python下的模块base64、binascii中的b64decode、a2b_base64等方法中出现解码报错
报错信息如下
1 | --------------------------------------------------------------------------- |
解决方案
python中的base64是4个4个的读取的,所以待解码的字段应当为4的倍数,不足添‘=’
1 | # 对待解码的字段a进行判断,若为4的倍数则不变,反之缺多少补多少 |
pytorch实现LeNet模型MNIST手写识别
模块导入,常量参数设定
1 | import torch |
数据加载
1 | train_loader = torch.utils.data.DataLoader( |
LeNet模型搭建
1 | class LeNet(nn.Module): |
查看模型结构
1 | model = LeNet() |
模型训练测试函数
1 | model = LeNet().to(device) |
模型训练,测试
for epoch in range(1, EPOCH + 1):
train(DEIVCE, model, train_loader, optimizer, epoch)
test(DEIVCE, model, train_loader)
Python 控制台输出时刷新当前行内容
今日小技巧GET
Python 控制台输出时刷新当前行内容
为了跑代码时不至于对了白屏发呆,提高用户(自己)体验,经过几次尝试,正确代码如下:
import time
for i in range(100):
time.sleep(0.1)
print("\rReading image {}/{}".format(1+i,100),end='')
Cannot convert a symbolic Keras inputoutput to a numpy array
环境: Tensorflow2.4.1
报错: Cannot convert a symbolic Keras input/output to a numpy array. This error may indicate that you're trying to pass a symbolic value to a NumPy call, which is not supported. Or, you may be trying to pass Keras symbolic inputs/outputs to a TF API that does not register dispatching, preventing Keras from automatically converting the API call to a lambda layer in the Functional Model.
产生原因: 采用了tf下的Keras 自定义损函数
分析:
损失函数部分代码:
1 | def vae_loss(x, x_decoded_mean): |
这是变分自编码的自定义损失函数,从中可以发现分别得到两种张量:
1 | xent_loss --> tensorflow.python.framework.ops.Tensor |
自定义函数的输入是KerasTensor,但是默认的loss函数输出的是Tensor,KerasTensor和Tensor是完全不同的类,kera_tensor源码中可以发现Keras可以将Tensor转成KerasTensor,但是没发现将KerasTensor转成Tensor的部分。。。
所以。。。我们可以说:
1 | Tensor+KerasTensor = KerasTensor |
但是keras自定义损失函数输入的是KerasTensor,默认输出的是Tensor,而这里会导致输出KerasTensor,所以就报错了。
解决方案: 我采用的解决方案如下:
1 | # 一般情况下采用该代码能够解决问题,可以发现函数返回结果已经转化成tensorflow.python.framework.ops.Tensor类了 |
所以keras还是避免使用吧,还是用的不太灵活的亚子,我还是老老实实学明白tensorflow怎么用吧~