专栏集锦,大佬们可以收藏以备不时之需
Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html
Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html
Logback 详解专栏:https://blog.csdn.net/superdangbo/category_9271502.html
tensorflow专栏:https://blog.csdn.net/superdangbo/category_8691332.html
Redis专栏:https://blog.csdn.net/superdangbo/category_9950790.html
1024程序员节特辑文章:
1024程序员节特辑 | 解密Spring Cloud Hystrix熔断提高系统的可用性和容错能力
1024程序员节特辑 | ELK+ 用户画像构建个性化推荐引擎,智能实现“千人千面”
1024程序员节特辑 | Spring Boot实战 之 MongoDB分片或复制集操作
Spring实战系列文章:
Spring实战 | Spring AOP核心秘笈之葵花宝典
国庆中秋特辑系列文章:
国庆中秋特辑(三)使用生成对抗网络(GAN)生成具有节日氛围的画作,深度学习框架 TensorFlow 和 Keras 来实现
国庆中秋特辑(二)浪漫祝福方式 使用生成对抗网络(GAN)生成具有节日氛围的画作
国庆中秋特辑(一)浪漫祝福方式 用循环神经网络(RNN)或长短时记忆网络(LSTM)生成祝福诗词

ELK,全称 Elasticsearch、Logstash、Kibana,是一种流行的开源日志管理和分析平台。ELK Stack 的三个主要组件分别为 Elasticsearch(分布式搜索和分析引擎)、Logstash(数据收集和处理工具)以及 Kibana(数据可视化工具)。

1、发展历史
ELK 的历史可以追溯到 2012 年,当时 Elasticsearch 项目创始人 Shay Banon 发布了 Elasticsearch 的首个版本。随着项目的发展,Logstash 和 Kibana 相继诞生,并与 Elasticsearch 共同构成了 ELK Stack。
2、组件详细介绍
ELK 是指 Elasticsearch、Logstash 和 Kibana 三个开源工具的组合,通常用于大规模日志数据处理和可视化。以下是 ELK 的安装和部署步骤:
sudo apt-get update
sudo apt-get install openjdk-11-jdk
检查 Java 版本:
java -version
sudo mkdir -p /usr/share/elasticsearch
sudo tar -xzf elasticsearch-7.10.2.tar.gz -C /usr/share/elasticsearch --strip-components=1
设置 Elasticsearch 的环境变量:
export ES_HOME=/usr/share/elasticsearch
export PATH=$PATH:$ES_HOME/bin
创建 Elasticsearch 配置文件:
sudo tee /etc/elasticsearch/elasticsearch.yml << EOL
cluster.name: my-cluster
node.name: my-node
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["host1", "host2"]
cluster.initial_master_nodes: ["node-1", "node-2"]
EOL
启动 Elasticsearch:
sudo systemctl start elasticsearch
检查 Elasticsearch 是否运行正常:
curl -X GET "localhost:9200/"

下载完成后,将 Logstash 压缩包上传到服务器,然后解压:
sudo mkdir -p /usr/share/logstash
sudo tar -xzf logstash-7.10.2.tar.gz -C /usr/share/logstash --strip-components=1
创建 Logstash 配置文件:
sudo tee /etc/logstash/logstash.conf << EOL
input {
beats {
port => 5044
}
}
filter {
if "apache" in [$log][app] {
grok {
match => { "message" => "%{GREEDYDATA:apache_message}" }
}
} else if "nginx" in [$log][app] {
grok {
match => { "message" => "%{GREEDYDATA:nginx_message}" }
}
}
}
output {
if "apache" in [$log][app] {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "my-index-%{+YYYY.MM.dd}"
}
} else if "nginx" in [$log][app] {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "my-index-%{+YYYY.MM.dd}"
}
}
}
EOL
启动 Logstash:
sudo systemctl start logstash

下载完成后,将 Kibana 压缩包上传到服务器,然后解压:
sudo mkdir -p /usr/share/kibana
sudo tar -xzf kibana-7.10.2.tar.gz -C /usr/share/kibana --strip-components=1
创建 Kibana 配置文件:
sudo tee /etc/kibana/kibana.yml << EOL
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
EOL
启动 Kibana:
sudo systemctl start kibana

检查 Kibana 是否运行正常,访问 http://your_server_ip:5601,如果看到 Kibana 的欢迎页面,则说明安装成功。
http.port: 9200
discovery.seed_hosts: ["host1", "host2"]
cluster.initial_master_nodes: ["node-1", "node-2"]
在 Logstash 的配置文件中,添加以下内容:
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "my-index-%{+YYYY.MM.dd}"
}
}
在 Kibana 的配置文件中,添加以下内容:
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
sudo systemctl start elasticsearch
sudo systemctl start logstash
sudo systemctl start kibana
现在,你已经成功安装并部署了 ELK。
ELK 技术可以与多种技术结合,实现千人千面的需求。以下是一些建议,并结合具体案例和代码进行说明:
ELK(Elasticsearch、Logstash、Kibana)是一个大数据处理和可视化平台,而用户画像则是根据用户的行为、兴趣、喜好等信息构建的用户模型。实现千人千面,即为目标用户提供个性化的内容和服务。
要实现 ELK + 用户画像的千人千面,你需要完成以下步骤:
<dependencies>
<dependency>
<groupId>org.elasticsearchgroupId>
<artifactId>elasticsearchartifactId>
<version>7.15.1version>
dependency>
<dependency>
<groupId>org.elasticsearch.clientgroupId>
<artifactId>elasticsearch-rest-high-level-clientartifactId>
<version>7.15.1version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.26version>
dependency>
dependencies>
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.AvgAggregationBuilder;
import java.io.IOException;
import java.util.List;
public class ElasticsearchClient {
private RestHighLevelClient client;
public ElasticsearchClient(String host, int port) {
client = new RestHighLevelClient(RestClient.builder(host, port));
}
public void close() {
client.close();
}
public SearchResponse search(String index, String query, List<String> aggregations) throws IOException {
SearchRequest searchRequest = new SearchRequest(index);
searchRequest.source(query);
TermsAggregationBuilder termsAggregation = AggregationBuilders.terms("bucket");
termsAggregation.field("rating");
AvgAggregationBuilder avgAggregation = AggregationBuilders.avg("averageRating");
avgAggregation.field("rating");
searchRequest.aggregations(termsAggregation, avgAggregation);
return client.search(searchRequest, RequestOptions.DEFAULT);
}
}
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class CollaborativeFiltering {
public static void main(String[] args) {
// 创建模拟数据
List<double[]> ratings = new ArrayList<>();
ratings.add(new double[]{1, 1, 1, 1});
ratings.add(new double[]{1, 2, 3, 4});
ratings.add(new double[]{2, 3, 4, 5});
// 训练集和测试集划分
int[] trainIndexes = new int[ratings.size() - 2];
int[] testIndexes = new int[2];
for (int i = 0; i < ratings.size(); i++) {
if (i % 2 == 0) {
trainIndexes[trainIndexes.length - 1] = i;
} else {
testIndexes[testIndexes.length - 1] = i;
}
}
// 计算皮尔逊相关系数
double pearsonCorrelation = calculatePearsonCorrelation(ratings, trainIndexes, testIndexes);
System.out.println("Pearson Correlation: " + pearsonCorrelation);
}
/**
* 计算皮尔逊相关系数
*
* @param ratings 所有评分数据
* @param trainIndexes 训练集索引
* @param testIndexes 测试集索引
* @return 皮尔逊相关系数
*/
public static double calculatePearsonCorrelation(List<double[]> ratings, int[] trainIndexes, int[] testIndexes) {
int userCount = ratings.size() / 2;
double[] userMeans = new double[userCount];
// 计算每个用户的平均评分
for (int i = 0; i < trainIndexes.length; i++) {
userMeans[i] = calculateMean(ratings.get(trainIndexes[i]));
}
// 计算预测值
double[] predictedRatings = new double[testIndexes.length];
for (int i = 0; i < testIndexes.length; i++) {
double prediction = predict(ratings.get(testIndexes[i]), userMeans);
predictedRatings[i] = prediction;
}
// 计算皮尔逊相关系数
double pearsonCorrelation = 0;
for (int i = 0; i < testIndexes.length; i++) {
double realRating = ratings.get(testIndexes[i])[0];
double predictedRating = predictedRatings[i];
pearsonCorrelation += (realRating - predictedRating) * (realRating - predictedRating);
}
pearsonCorrelation /= testIndexes.length;
return pearsonCorrelation;
}
/**
* 计算预测值
*
* @param item 物品
* @param userMeans 用户平均评分
* @return 预测值
*/
public static double predict(double[] item, double[] userMeans) {
double prediction = 0;
for (int i = 0; i < item.length; i++) {
prediction += userMeans[i] * item[i];
}
return prediction / item.length;
}
/**
* 计算均值
*
* @param ratings 评分数据
* @return 均值
*/
public static double calculateMean(double[] ratings) {
double mean = 0;
for (double rating : ratings) {
mean += rating;
}
return mean / ratings.length;
}
}
这个 Java 类实现了协同过滤算法,使用皮尔逊相关系数作为度量标准。在 main 方法中,我们创建了一个模拟数据集,并将其划分为训练集和测试集。然后计算皮尔逊相关系数,并输出结果。
Elasticsearch、Logstash 和 Kibana(简称 ELK)是一个流行的开源大数据处理平台,可以用于收集、存储和分析大量日志数据。协同过滤算法是一种用于推荐系统的算法,可以结合 Python 实现。下面将分别介绍如何使用 ELK 和 Python 实现协同过滤算法。
首先,确保已安装 Elasticsearch、Logstash 和 Kibana。然后,安装 Python 及其相关库,如 elasticsearch 和 pandas。
pip install elasticsearch
pip install logstash
pip install kibana
pip install pandas numpy
接下来,实现协同过滤算法。这里我们使用一个简单的 Python 代码示例,你可以根据自己的需求进行修改:
import numpy as np
import pandas as pd
from sklearn.metrics.pairwise import euclidean
from elasticsearch import Elasticsearch
# 假设你有以下数据,存储在一个 DataFrame 中
data = {
'user_id': [1, 1, 1, 2, 2, 2],
'item_id': [1, 2, 3, 1, 2, 3],
'rating': [4, 5, 3, 4, 5, 3]
}
df = pd.DataFrame(data)
# 将数据存储到 Elasticsearch 中
es = Elasticsearch()
df.to_json(df.reset_index().to_dict(), orient='records', index=False)
es.index(index='ratings', doc_type='doc', body=df.reset_index().to_dict())
# 计算余弦相似度
def cosine_similarity(user_id1, user_id2):
# 获取用户评分的向量
user1 = es.mget(index='ratings', ids=[user_id1], doc_type='doc')
user2 = es.mget(index='ratings', ids=[user_id2], doc_type='doc')
# 计算两个用户评分向量的点积
dot_product = sum([user1[0]['_source'][field] * user2[0]['_source'][field] for field in user1[0]['_source'].keys()])
# 计算两个向量的模长
user1_norm = sum([value ** 2 for value in user1[0]['_source'].values()]) ** 0.5
user2_norm = sum([value ** 2 for value in user2[0]['_source'].values()]) ** 0.5
# 计算余弦相似度
return dot_product / (user1_norm * user2_norm)
# 计算两个用户的相似度
similarity = cosine_similarity(1, 2)
print(similarity)
上面的代码只是一个简单的示例,你可以根据自己的需求修改数据和算法。这里我们使用的是基于余弦相似度的协同过滤算法。
最后,通过 Kibana 分析和可视化结果。在 Kibana 中,选择 “Management” -> “Kibana” -> “Index Patterns”,创建一个名为 “ratings” 的索引模式。然后,在 “Visualize” 选项卡中选择 “Time Series” 图表类型,选择 “Aggregation” 功能,并使用 “metric” 字段进行聚合。在 “Style” 选项卡中,可以选择图表样式和颜色。