1. 集群配置+proxy 不支持事务,不支持 script load 的情况下, 一种实现事务的方法。

eval 执行是具有原子性的(https://redis.io/commands/eval#atomicity-of-scripts) 但是 得注意 cluster的环境下
用eval 执行多语句,遇到多个key的情况
(error) CROSSSLOT Keys in request don’t hash to the same slot
一个可以用的方案: https://redis.io/topics/cluster-spec#keys-hash-tags

eval(script) 组装一个脚本,但是多个key必须用 keys hash tags的方法到一个slot里面,代理只会按照第一个key的hash来。

2. redis 大厂解决方案
https://www.cnblogs.com/me115/p/9043420.html
很有必要参考,这个大厂确实是这么做的。开发过程中坑位很多。

实现语言
名称
简介
相关链接
python
gensim
Gensim is a FREE Python library Scalable statistical semantics Analyze plain-text documents for semantic structure Retrieve semantically similar documents
开源python库:灵活的语意统计 检索相似文档 可用来构建自己的文本模型(word tag)进行相识度检索
python
whoosh
Whoosh is a fast, featureful full-text indexing and searching library implemented in pure Python. Programmers can use it to easily add search functionality to their applications and websites. Every part of how Whoosh works can be extended or replaced to meet your needs exactly. Some of Whoosh’s features include:
● Pythonic API.
● Pure-Python. No compilation or binary packages needed, no mysterious crashes.
● Fielded indexing and search.
● Fast indexing and retrieval — faster than any other pure-Python search solution I know of. See Benchmarks.
● Pluggable scoring algorithm (including BM25F), text analysis, storage, posting format, etc.
● Powerful query language.
● Production-quality pure Python spell-checker (as far as I know, the only one). Whoosh might be useful in the following circumstances:
● Anywhere a pure-Python solution is desirable to avoid having to build/compile native libraries (or force users to build/compile them).
● As a research platform (at least for programmers that find Python easier to read and work with than Java 😉
● When an easy-to-use Pythonic interface is more important to you than raw speed.
●If your application can make good use of one deeply integrated search/lookup solution you can rely on just being there rather than having two different search solutions (a simple/slow/homegrown one integrated, an indexed/fast/external binary dependency one as an option). Whoosh was created and is maintained by Matt Chaput. It was originally created for use in the online help system of Side Effects Software’s 3D animation software Houdini. Side Effects Software Inc. graciously agreed to open-source the code.
whoosh 是一个python实现的快速且功能丰富的全文索引和搜索库。程序员可以轻而易举的给自己的应用或网站添加搜索功能。根据具体的场景,whoosh实现的每个部分都可以二次开发和替换。 个人开发者Matt Chaput 在公司上班的时候开发的。
官方文档:
python、java、c++等
jieba
“结巴”中文分词:做最好的 Python 中文分词组件。 功能:中文分词、词性标注、关键词抽取 目前已有各种语言的实现。和whoosh结合轻松实现中文检索。
官方:
rust
sonic
Sonic is a fast, lightweight and schema-less search backend. It ingests search texts and identifier tuples that can then be queried against in a microsecond’s time. Sonic can be used as a simple alternative to super-heavy and full-featured search backends such as Elasticsearch in some use-cases. It is capable of normalizing natural language search queries, auto-completing a search query and providing the most relevant results for a query. Sonic is an identifier index, rather than a document index; when queried, it returns IDs that can then be used to refer to the matched documents in an external database. A strong attention to performance and code cleanliness has been given when designing Sonic. It aims at being crash-free, super-fast and puts minimum strain on server resources (our measurements have shown that Sonic – when under load – responds to search queries in the μs range, eats ~30MB RAM and has a low CPU footprint; see our benchmarks).
sonic 是个快速、轻量级、非结构化的搜索后端。专注文本和标记对的毫秒级查询。 sonic在某些场景下可以对重量级的全功能搜索引擎进行替代,比如elasticsearch。它能实现统一的自然语言查询,检索词自动补全,输出相关性结果。sonic是一个标记索引系统而不是文档索引系统:sonic的查询结果不是相关文档,而是外部数据库的ID标识。 设计sonic的时候就对性能和代码的整洁度非常关注。无故障、超快、轻度资源依赖就是sonic的目标。 起源于Crisp公司,背景就是简单+轻量资源。
官方:
(详细描述了关键特性)
java
Elasticsearch
java
Solr
Solr is the popular, blazing-fast, open source enterprise search platform built on Apache Lucene™.
Apache Lucence 项目的一个子项目。 Solr是一个流行、超快、开源的企业级的搜索平台。
官方:
java
Lucene
Apache Lucene is a high-performance, full-featured text search engine library written entirely in Java. It is a technology suitable for nearly any application that requires full-text search, especially cross-platform.
Apache Lucence 项目的一个子项目。 Apache Lucence是一个java写的高性能的全文搜索引擎库。对于需要全文检索的应用比较好的技术解决方案,特别是跨平台的应用。
官方 :
c++
sphinx
Sphinx is an open source full text search server, designed from the ground up with performance, relevance (aka search quality), and integration simplicity in mind. It’s written in C++ and works on Linux (RedHat, Ubuntu, etc), Windows, MacOS, Solaris, FreeBSD, and a few other systems. Sphinx lets you either batch index and search data stored in an SQL database, NoSQL storage, or just files quickly and easily — or index and search data on the fly, working with Sphinx pretty much as with a database server. A variety of text processing features enable fine-tuning Sphinx for your particular application requirements, and a number of relevance functions ensures you can tweak search quality as well. Searching via SphinxAPI is as simple as 3 lines of code, and querying via SphinxQL is even simpler, with search queries expressed in good old SQL. Sphinx clusters scale up to tens of billions of documents and hundreds of millions search queries per day, powering top websites such as CraigslistLiving SocialMetaCafe and Groupon… to view a complete list of known users please visit our Powered-by page. And last but not least, it’s licensed under GPLv2.
官方:
关键特性:
c++
faiss
Faiss is a library for efficient similarity search and clustering of dense vectors. It contains algorithms that search in sets of vectors of any size, up to ones that possibly do not fit in RAM. It also contains supporting code for evaluation and parameter tuning. Faiss is written in C++ with complete wrappers for Python/numpy. Some of the most useful algorithms are implemented on the GPU. It is developed by Facebook AI Research.
相似向量搜索和密集向量聚类
官方:
c++
SPTAG
A distributed approximate nearest neighborhood search (ANN) library which provides a high quality vector index build, search and distributed online serving toolkits for large scale vector search scenario.
官方:

 

20款开源搜索引擎介绍与比较
https://my.oschina.net/u/2274056/blog/1592809

Solr vs. Elasticsearch谁是开源搜索引擎王者(中英文)
https://www.cnblogs.com/xiaoqi/p/solr-vs-elasticsearch.html
https://logz.io/blog/solr-vs-elasticsearch/

开源搜索引擎Lucene、Solr、Sphinx等优劣势比较
https://blog.csdn.net/belalds/article/details/82667692

微软开源了 Bing 搜索背后的关键算法
https://www.oschina.net/news/106730/microsoft-open-sources-sptag?nocache=1558414049690

数据抓取工具:

    客户端模拟工具

seleniumhq https://www.seleniumhq.org/
phantomanjs
appuim

    爬虫框架

http://nutch.apache.org/
pyspider 个人用过对小型项目很友好,功能简单易用。

数据可视化如果做到以下几点就属于比较好的可视化平台了
1)过程简单、生产效率要高(无论是研发、运营、产品都快可以快速的创建想要的图表)。
2)自定义程度高:展现形式多样可选、交互自定义程度高(各种筛选过滤)。
3)便于分享:数据的分享是数据价值体现的一个环节。
4)数据的评论和备注:备注能够记录异常和原因,评论利于保存讨论和分析过程(一个相对完善的系统而言这个功能方便实际使用)。
5)权限控制:自由总是相对的,相对分享就是控制,张弛有度必是这个系统长存的基石
实现上述的可视化系统并非易事,里面涉及到很多的环节。
但可视化做的比较好的tableau却给我们创建了一个比较好的典范。它在数据的分享、效率方面做得无可挑剔。
实际环境中却不一定能直接使用一些成熟的解决方案,还需要自己搭建。

继续阅读

反向代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main

import (
    "net/http"
    "net/http/httputil"
    "net/url"
)

func main() {
    //【[one line code] 一行代码http反向代理】
    //127.0.0.1:8900 转发到 10.0.12.110:6335
    //测试: curl http://127.0.0.1:8900

    u, _ := url.Parse("http://10.0.12.110:6335") //反向代理的目的地址
    http.ListenAndServe(":8900", httputil.NewSingleHostReverseProxy(u))

}

静态服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
    "net/http"
)

func main() {

    //【[one line code] 一行代码静态web服务】
    //测试: curl http://127.0.0.1:8901/a.txt

    // 静态web服务:
    http.ListenAndServe(":8901", http.FileServer(http.Dir("/tmp")))

    //【[one line code] 一行代码静态web服务带路径转发】
    // curl 127.0.0.1:8902/tmpfiles/a.txt
    // url路径/tmpfile 映射到/tmp
    /*
        http.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))
        http.ListenAndServe(":8902", nil)
    */


}

当前比较好的sql格式化工具

以下在网上搜集了一些比较好的sql格式化工具,各有利弊。但对hive sql 来说目前还没有比较好的工具可以直接拿过来用。
1. ApexSQL Refactor SQL formatter
2. SQL Pretty Printer
         Instant SQL Formatter (在线免费版本 ) http://www.dpriver.com/pp/sqlformat.htm
         SQL Pretty Printer (桌面应用收费版本) http://www.dpriver.com/products/sqlpp/desktop_index.php
3. druid
         https://github.com/alibaba/druid 开源免费

sql格式化之druid

      druid(alibaba)实现了sql语法的分析(和antlr生成的parse非常像),目前已经支持大部分常用的sql语法。查看其代码发现Terence Parr(antlr的作者)说的挺对的,词法和语法分析十分的枯燥,而且容易出现错误。可维护性特别差。
      druid内部实现了一个format方法并支持很多种sql语法,虽然druid的主要方向并不在此,有些大柴小用但是如果可用也是极好的。目前看druid在hive的语法实现上不完全,有些语法还未支持(比如定义个es的外表)。但是要实现具体的语法,门槛还是有的,相较antlr还是有点复杂、而且学习该技能通用型较差。实地勘探发现druid在sql格式化方法中的两个问题,当然在格式化这个问题上这个还存在另外一个更大的问题就是注释(这个它并没有关注,只是保留了两个listener):

继续阅读

利用pyspark ,如何把key value 转换成我们自定义的一个string进行输出到hdfs。有些时候是不需要输出key只需要输出value; 有的时候是把key和value合并成一个字符串中间不需要tab分割。
看官方的这个文档很多参数不知道要写什么。
这个是要写入到hdfs,配置是hadoop的jobconf配置。需要看hadoop的jobconf配置。经查验conf 输入为dict类型
mapreduce.output.textoutputformat.separator 即可配置TextOutputFormat的分隔符,这个配置是在org.apache.hadoop.mapred.TextOutputFormat中。
1
tf.map(extracmap).saveAsHadoopFile("/tmp/test",outputFormatClass="org.apache.hadoop.mapred.TextOutputFormat",conf={'mapreduce.output.textoutputformat.separator':''})

完整实例如下:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/usr/bin/python
# -*- coding: UTF-8 -*-

'''
命令
/home/mg/spark-2.2.0/bin/spark-submit --master yarn --num-executors 100 --name pathfilter --queue default good.py 20180128
测试
/home/mg/spark-2.2.0/bin/spark2-submit --master local good.py 20181009
'''

from __future__ import  print_function
from pyspark.sql.types import *
from pyspark import *
from pyspark.sql import Row
from pyspark.sql import SparkSession
import sys
import re
import json
import time

reload(sys)
sys.setdefaultencoding('utf-8')


#日志处理
def extracmap(line):
    try:
        line_list = line.split(' - {')
        line_json = '{'+line_list[1]
        date_time =  line_list[0].split('|')[0].split('.')
        mobj = json.loads(line_json)
        if mobj:
            tarobj = {}
            tarobj['distinct_id']=mobj.has_key('uid') and mobj['uid'] or '000001'
            tarobj['time'] = mobj.has_key('logTime') and int(time.mktime(time.strptime(mobj['logTime'],'%Y-%m-%d %H:%M:%S'))) or 0
            return (json.dumps(tarobj),"")
    except Exception, e:
        pass

def filtermap(line):
    if line :
        return True
    return False


def mymain(date):
    spark = SparkSession \
        .builder \
        .appName("goodoutput") \
        .config("spark.some.config.option", "some-value") \
        .getOrCreate()
    sc = spark.sparkContext

    tf = sc.textFile("/tmp/mylogs/"+date+"/")
    tf.map(extracmap).filter(filtermap).saveAsHadoopFile("/tmp/logs/"+date+"/",outputFormatClass="org.apache.hadoop.mapred.TextOutputFormat",conf={'mapreduce.output.textoutputformat.separator':''})

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print("Usage: good.py <date>", file=sys.stderr)
        exit(-1)
    mymain(sys.argv[1])

    1. 圆的定义 https://zh.wikipedia.org/zh-hans/%E5%9C%86
    2. 圆周率 https://zh.wikipedia.org/zh-hans/%E5%9C%93%E5%91%A8%E7%8E%87
    3. 圆的面积 https://zh.wikipedia.org/zh-hans/%E5%9C%86%E7%9A%84%E9%9D%A2%E7%A7%AF
  1. 圆的面积计算
    1. 逼近
      1. 上下界(这个方向研究者主要是优化逼近的速度)
        1. 割圆法
          1. 阿基米德
          2. 威理博·斯涅尔(Cyclometricus,1962年[来源请求])
          3. 惠更斯(De Circuli Magnitudine Inventa,1654年)
      2. 无限逼近
        1. 高斯格点
        2. 数值逼近(最容易操作的方法)
          1. 蒙特卡罗(掷飞镖:如果随机样本一致地散布于一个包含圆的正方形中,样本击中圆的比例趋近于圆和正方形的面积比)
    2. 拼图
      1. 圆分为很大但有限块然后重拼成一个相同面积的正方形
    3. 微积分
      1. 积分&无穷级数展开
  2. 参考文章:
    1. https://zh.m.wikihow.com/%E8%AE%A1%E7%AE%97%E5%9C%86%E5%91%A8%E7%8E%87-Pi
    2. π论 https://web.math.sinica.edu.tw/math_media/d282/28208.pdf

  1. 历史
    1. 原始SVM算法是由弗拉基米尔·万普尼克和亚历克塞·泽范兰杰斯于1963年发明的。
    2. 1992年,Bernhard E. Boser,Isabelle M. Guyon和弗拉基米尔·万普尼克提出了解一种通过将核技巧应用于最大间隔超平面来创建非线性分​​类器的方法。
      1. 由拉格朗日对偶简化原始问题,引入核方法。
    3. 当前标准的前身(软间隔)由Corinna Cortes和Vapnik于1993年提出,并于1995年发表 Support-Vector Networks https://dl.acm.org/citation.cfm?id=218929
    4. SMO 算法是由 Microsoft Research 的 John C. Platt 在 1998 年发表的一篇论 文《SequentialMinimalOptimizationAFastAlgorithmforTrainingSupportVectorMachines》
  2. wiki:
    1. https://zh.wikipedia.org/zh-cn/%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F%E6%9C%BA
    2. https://en.wikipedia.org/wiki/Support_vector_machine
  3. 支持向量机通俗导论(理解SVM的三层境界)https://blog.csdn.net/macyang/article/details/38782399/
  4. 线性代数-向量内积 http://dec3.jlu.edu.cn/webcourse/t000022/teach/chapter5/5_1.htm
  5. 老冯经典之作:纯白板手推SVM http://www.julyedu.com/video/play/18/429
  6. SVM Tutorial: Classification, Regression, and Ranking
    1. https://x-algo.cn/wp-content/uploads/2016/08/SVM-Tutorial-Classification-Regression-and-Ranking.pdf
  7. 核函数
    1. 讲解非常好的教程(里面有讲解 sigmod 函数和多项式的具体展开 。):
      1. ML Lecture 20: Support Vector Machine (SVM) 李弘毅 https://www.youtube.com/watch?v=QSEPStBgwRQ
      2. svm 两个重要的点都有讲解(hinge loss, max margin)
    2. 数据挖掘十大算法 – 核函数 https://wizardforcel.gitbooks.io/dm-algo-top10/content/svm-4.html
  8. libsvm
    1. https://www.csie.ntu.edu.tw/~cjlin/libsvm/
      1. 各种对svm的扩展案例: https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/
    2. svm 可用数据集合:https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/
      1. rank
          1. 开源实现
            1. Large-scale rankSVM 
            2. http://www.cs.cornell.edu/people/tj/svm_light/svm_rank.html
          2. ranksvm原理 https://x-algo.cn/index.php/2016/08/09/ranksvm/
          3. RankSvm-基于点击数据的搜索排序算法 http://kubicode.me/2016/03/30/Machine%20Learning/RankSvm-Optimizing-Search-Engines-using-Clickthrough-Data/
          4. 应用场景
            1. 爱奇艺推荐系统架构与实践 王敏 2015 https://doc.mbalib.com/view/0fa428227a455b044575fec09310453a.html
            2. 机器学习在搜索排序中的应用 一淘及搜索事业部-搜索技术 仁重 http://topic.it168.com/factory/adc2013/doc/zenganxiang.pptx
            3. Learning To Rank在个性化电商搜索中的应用 吴晨(搜索BG) https://myslide.cn/slides/958
          5. 相关论文:
            1. Adapting Ranking SVM to Document Retrieval http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.136.9218&rep=rep1&type=pdf
      2. 点击转化率预测
        1. https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary.html#avazu
      3. 多分类:
        1. poker(德州扑克手牌的分类) https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass.html
        2. 来源: https://archive.ics.uci.edu/ml/datasets/Poker+Hand
        3. 相关论文:
          1. https://www.seas.upenn.edu/~cse400/CSE400_2006_2007/Pfund/PfundPaper.pdf Support Vector Machines in the Machine Learning Classifier for a Texas Hold’em Poker Bot
          2. http://www.wseas.us/e-library/conferences/crete2002/papers/444-494.pdf Evolutionary Data Mining With Automatic Rule Generalization
          3. https://pdfs.semanticscholar.org/905a/0f27e520b3f2627863f9fa94a87fda7060cd.pdf NN-based Poker Hand Classification and Game Playing
          4. https://eembdersler.files.wordpress.com/2010/09/2014913024-gokaydisken-project.pdf PREDICTING POKER HAND’S STRENGTH WITH ARTIFICIAL NEURAL NETWORKS
        4. 自己处理 https://github.com/whomm/pokerhand
          1. 把花色 和 大小映射到 1 – 52 之间 直接使用 svm -t 2 -c 100
            1. ../libsvm-3.23/svm-train -t 2 -c 100 ./poker.t
            2. awk -f mpre.awk poker >mp
            3. awk -f mpre.awk poker.t >mp.t
            4. 训练数据准确率Accuracy = 92.527% (23141/25010) (classification)
            5. 随机10000条测试数据 Accuracy = 28.06% (2806/10000) (classification)
          2. mlp 方法
            1. hidden_layer_sizes=(260,156,52), =’tanh’, solver=’lbfgs’, 正确率 98.92%,这个是对于测试集合的一个随机的样本,但是对于特定分类的准确率没有意义。
            2. 特定分类的准确率会很低 , 9 分类的数据就几条训练不出好的模型。

1)废弃oss批量删除bucket文件

对于非空的oss后台没有比较便捷的方式直接删除只能删除全部item然后再删除bucket

ossutil config 配置完成之后

    ./ossutil ls oss://bucketname/ | awk ‘{print $8}’ | xargs -I {} ./ossutil rm {}
参考资料:
     https://help.aliyun.com/document_detail/50452.html?spm=5176.87240.585413.1.KlUVHk
 2)用sslfofree 免费快速实现 slb https
https://www.sslforfree.com/ 提供免费的90天的证书,快过期renew需要重新申请一个新的证书。
申请完成后
格式转换
openssl x509 -in ca_bundle.crt -out ca_bundle.pem
openssl x509 -in certificate.crt -out certificate.pem
openssl rsa -in private.key -out private.key.pem
slb 创建服务器证书
证书内容: certificate.pem + “\n” + ca_bundle.pem
私钥: private.key.pem
然后添加监听 433接口即可