0%

ZooKeeper在服务注册与订阅(服务发现)方面,通常会使用有序临时节点来实现。当一个服务实例启动时,它会在ZooKeeper中创建一个临时节点来表示自己的存在。其他服务可以通过监听这些节点的变化来实现实时的服务发现。下面是一个简单的Java代码示例,展示了如何使用ZooKeeper实现服务注册与订阅的基本逻辑。

首先,确保你的项目中引入了ZooKeeper客户端库依赖。常用的ZooKeeper客户端库包括zookeepercurator

示例代码基于curator库来实现服务注册与订阅:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.nodes.PersistentEphemeralNode;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.utils.CloseableUtils;

public class ServiceRegistry {
private final CuratorFramework client;
private final String basePath;

public ServiceRegistry(String connectString, String basePath) {
this.client = CuratorFrameworkFactory.newClient(connectString, new ExponentialBackoffRetry(1000, 3));
this.basePath = basePath;
client.start();
}

public void registerService(String serviceName, String serviceAddress) throws Exception {
String servicePath = basePath + "/" + serviceName;
PersistentEphemeralNode node = new PersistentEphemeralNode(client, PersistentEphemeralNode.Mode.EPHEMERAL, servicePath, serviceAddress.getBytes());
node.start();
node.waitForInitialCreate();
}

public void close() {
CloseableUtils.closeQuietly(client);
}
}

在上述代码中,ServiceRegistry类用于服务注册,它会创建一个临时节点来表示服务实例。当服务实例启动时,可以调用registerService方法来注册自己的信息。

下面是一个简单的服务订阅示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;
import org.apache.curator.retry.ExponentialBackoffRetry;

public class ServiceSubscriber {
private final CuratorFramework client;
private final String basePath;

public ServiceSubscriber(String connectString, String basePath) {
this.client = CuratorFrameworkFactory.newClient(connectString, new ExponentialBackoffRetry(1000, 3));
this.basePath = basePath;
client.start();
}

public void subscribe(String serviceName) throws Exception {
String servicePath = basePath + "/" + serviceName;

PathChildrenCache cache = new PathChildrenCache(client, servicePath, true);
PathChildrenCacheListener listener = new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent event) throws Exception {
if (event.getType() == PathChildrenCacheEvent.Type.CHILD_ADDED) {
ChildData data = event.getData();
String serviceAddress = new String(data.getData());
System.out.println("New service added: " + serviceAddress);
}
}
};
cache.getListenable().addListener(listener);
cache.start();
}

public void close() {
CloseableUtils.closeQuietly(client);
}
}

在上述代码中,ServiceSubscriber类用于订阅服务信息变化。它会监听指定服务的节点变化,并在有新服务实例加入时输出服务地址。

请注意,这只是一个基本的示例代码,实际项目中还需要考虑更多的异常处理、线程安全等问题。同时,还可以使用更高级的ZooKeeper客户端库,如Apache Curator,来简化操作和提供更多的特性。

Apache ZooKeeper是一个分布式的开源协调服务,用于管理大规模分布式系统中的配置、同步、命名等任务。它提供了一组简单而强大的API,用于处理复杂的分布式系统的协调问题。以下是一些典型的ZooKeeper应用场景实战示例:

  1. 分布式配置管理:
    ZooKeeper可用于管理分布式系统的配置信息。例如,你可以将数据库连接字符串、缓存配置等保存在ZooKeeper节点中,并在分布式应用中动态获取这些配置信息。

  2. 分布式锁:
    ZooKeeper的有序节点特性使得它非常适合实现分布式锁。你可以在ZooKeeper中创建一个临时有序节点,节点的顺序会根据创建顺序自动排序。应用可以根据节点顺序来决定谁获得了锁。

  3. 选举:
    ZooKeeper可以用于在分布式系统中进行领导者选举。多个节点可以在ZooKeeper中创建临时节点,谁创建成功谁就成为领导者。当一个节点宕机时,相应的临时节点会被删除,触发新一轮的选举。

  4. 服务发现:
    在微服务架构中,服务发现是一个重要的问题。ZooKeeper可以用于注册和发现服务。每个服务实例可以在ZooKeeper中创建一个临时节点,其他服务可以通过监听节点变化来实时获取可用的服务实例。

  5. 分布式同步:
    ZooKeeper提供的有序节点和监视功能可以用于实现分布式系统的同步机制。节点的创建和删除会触发事件通知,应用可以根据这些通知来进行同步操作。

  6. 协调任务分配:
    在分布式任务调度场景中,ZooKeeper可以帮助协调任务的分配和执行。任务调度器可以通过ZooKeeper来进行任务的分配、状态的维护以及故障处理。

  7. 消息队列:
    虽然ZooKeeper不是专门的消息队列系统,但可以借助其有序节点和事件通知功能来实现简单的消息队列。每个消息可以被看作一个有序节点,消息的消费者可以监听节点变化以获取消息。

这些只是ZooKeeper的一些典型应用场景,实际中还可以根据具体需求进行扩展。需要注意的是,虽然ZooKeeper在很多分布式系统场景下非常有用,但随着分布式系统技术的发展,也有一些替代方案出现,如etcd、Consul等。选择合适的工具要根据实际需求和技术背景进行权衡。

安装

可以安装Anaconda
通过Anaconda Prompts进入conda 命令行

常用命令

更换为国内源

清华源

conda config –add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config –add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
conda config –add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/

中科大源

conda config –add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/cloud/menpo/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/cloud/pytorch/

搜索时显示通道地址

conda config –set show_channel_urls yes

还原原始通道

conda config –remove-key channels

安装

可以安装Anaconda
通过Anaconda Prompts进入conda 命令行

常用命令

更换为国内源

清华源

conda config –add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config –add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
conda config –add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/

中科大源

conda config –add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/cloud/menpo/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/cloud/pytorch/
conda config –set show_channel_urls yes
conda config –remove-key channels

常用命令

1.验证conda是否被安装:conda –version(查看conda版本的一个命令)
2.更新conda至最新的版本:conda update conda
3.conda –help:查看conda帮助信息
4.conda list:查看当前环境中已安装的包信息
5.conda search –full-name 包名 精确查找可供安装的包版本
6.conda search 包名的一部分名称 模糊查找可供安装的包版本
7.conda install 包名 在当前环境中安装包(当使用conda install无法进行安装时,可以使用pip install进行安装,pip install无法安装的时候,可以使用conda install 安装)
8.conda remove 包名 卸载当前环境中的包
9.conda update –all 更新所有包
10.conda update 包名 更新指定包

默认情况下,新创建的环境将会被保存在/Users//anaconda3/env目录下,其中,为当前用户的用户名。
创建新的环境
conda create –name 新的python环境的名称
conda create –name 新的python环境的名称 python=要安装的python版本
conda create –name 新的python环境的名称 python=要安装的python版本 要安装的包名

切换环境
activate python环境名称 切换到xx环境中
deactivate python环境名称 退出xx环境

conda env list :显示已创建的环境
conda create –name 新的虚拟环境名称 –clone 要克隆的虚拟环境名称
conda remove –name 虚拟环境的名称 –all

安装

默认安装位置

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA

nvcc –version 查看安装版本(环境变量配置)

cuda下载地址

最新版本

https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10

历史版本

https://developer.nvidia.com/cuda-toolkit-archive

cudnn下载地址

https://developer.nvidia.com/rdp/cudnn-download

版本关系和查看

cuda: Compute Unified Device Architecture,是一种有NVIDIA推出的通用并行计算架构, 该架构使GPU能够解决复杂的计算问题。

cudnn: 是NVIDIA 推出的用于深度神经网络的GPU加速库,他强调性能,易用性和低内存开销。

cuda和cudnn的关系: cudnn是基于cuda架构开发的专门用于深度神经网络的GPU加速库。cuda可以理解为一个大的商圈,但这个商圈是空的,还未装修。cudnn可以理解为装修后的房间,例如负一楼专门针对游乐(深度神经网络)装修成大型游乐厂。

Volatile是Java虚拟机提供的**轻量级**的同步机制

三大特性

  • 保证可见性
  • 不保证原子性
  • 禁止指令重排

内存可见性

volatile修饰的变量,不拷贝副本到工作内存,直接操作主内存,任何修改都可以其他线程读取到。
volatile的可以保证写入和读取 64 位值(long类型和double类型 )的原子性。

单例中 volatile + synchronized 的作用

volatile 可见性、禁止指令重排
synchronized保证操作的原子性、一致性和可见性。


title:主成分分析

设计

1、神经网络最好设计成三层结构(输入层、隐藏层、输出层)
2、如果隐藏非要设计多层,保持每层的神经元数量相同
3、输入层神经元的数量与特性个数相同
4、输出层的神经元数量与输出结果的要求相关。比如10分类网络的输出层神经元数量是10个
5、隐层神经元的数量越多效果越好,但是过多的话,会增加计算量。最好多于输入层神经元的数量

训练步骤

1、随机初始化所有权重矩阵
2、向前传播计算所有层的激活值
3、计算损失成本
4、反向传播计算更新权重
5、使用“梯度检验”确认反向传播计算是否足够有效。(注意:一旦确认有效,立即关闭“梯度检验”)
6、使用梯度下降或任何有效算法获得最优权重矩阵


title:主成分分析

作用

降维

主成分分析(Principal Component Analysis,PCA)是一种常用的降维技术,用于从高维数据中提取主要特征,并将数据投影到一个新的低维空间。
主成分分析能降低所研究的数据空间的维数。即用研究m维的Y空间代替p维的X空间(m<p),而低维的Y空间代替高维的x空间所损失的信息很少。即:使只有一个主成分Yl(即 m=1)时,这个Yl仍是使用全部X变量(p个)得到的。例如要计算Yl的均值也得使用全部x的均值。在所选的前m个主成分中,如果某个Xi的系数全部近似于零的话,就可以把这个Xi删除,这也是一种删除多余变量的方法。

变量解释

有时可通过因子负荷aij的结论,弄清X变量间的某些关系。

图形分析

多维数据的一种图形表示方法。我们知道当维数大于3时便不能画出几何图形,多元统计研究的问题大都多于3个变量。要把研究的问题用图形表示出来是不可能的。然而,经过主成分分析后,我们可以选取前两个主成分或其中某两个主成分,根据主成分的得分,画出n个样品在二维平面上的分布况,由图形可直观地看出各样品在主分量中的地位,进而还可以对样本进行分类处理,可以由图形发现远离大多数样本点的离群点。

回归分析

由主成分分析法构造回归模型。即把各主成分作为新自变量代替原来自变量x做回归分析。

降低计算量

用主成分分析筛选回归变量。回归变量的选择有着重的实际意义,为了使模型本身易于做结构分析、控制和预报,好从原始变量所构成的子集合中选择最佳变量,构成最佳变量集合。用主成分分析筛选变量,可以用较少的计算量来选择量,获得选择最佳变量子集合的效果。

以下是一个使用 Python 的示例代码,演示如何使用 scikit-learn 库进行主成分分析:
首先,确保已安装 scikit-learn 库,可以通过以下命令安装:

1
pip install scikit-learn

接下来,使用下面的代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# 生成示例数据
np.random.seed(0)
X = np.random.randn(100, 2) # 生成100个样本,每个样本有2个特征

# 使用PCA进行降维
pca = PCA(n_components=1)
X_pca = pca.fit_transform(X)

# 绘制原始数据和降维后的数据
plt.scatter(X[:, 0], X[:, 1], label='Original Data')
plt.scatter(X_pca, np.zeros(X_pca.shape), label='PCA')
plt.legend()
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('PCA Example')
plt.show()

# 输出主成分分析后的方差解释比例
print("Explained Variance Ratio:", pca.explained_variance_ratio_)

在上述代码中,我们首先生成了一个随机样本数据 X,其中每个样本有两个特征。然后,使用 PCA 类进行主成分分析,将数据降维到一个维度。通过绘制散点图,您可以观察原始数据和降维后的数据之间的关系。最后,我们打印出主成分分析后的方差解释比例,这是降维后保留的信息量。

请注意,PCA 的应用范围不仅限于这个简单的示例,它可以用于处理更复杂的数据,如图像、文本等。在实际应用中,您可能需要根据数据的特点进行调整和优化。