首页 文章 精选 留言 我的

精选列表

搜索[文档识别],共10000篇文章
优秀的个人博客,低调大师

zabbix部署文档以及遇到的问题

邮政Zabbix部署方案 1、架构设计 考虑到ECS的数量多和扩展性问题,中间使用proxy代理。这样既能减轻server端的性能负载问题,又便于扩展,需要扩展ECS监控,可以基于server端新建proxy,子系统的监控通过proxy处理之后再发送给server端。Zabbix Proxy是实现Zabbix分布式监控的重要组成部分,是连接Zabbix Agent和Zabbix Server的“中间人”、“连接器”、“路由器”等。Zabbix Proxy将来自Agent的数据推送(push)到Zabbix Server或者由Zabbix Server来拿取(fetch)。 与Zabbix Server相比Zabbix Proxy不需要使用或安装GUI(Graphical User Interface、Web Interface),也不需

优秀的个人博客,低调大师

Android API中文文档(111) —— MailTo

正文 一、结构 public classMailTo extendsObject java.lang.Object android.net.MailTo 二、类概述 MailTo URL解析器。这个类解析到URL计划的邮件(a mailto schema URL参见这里)和可用于解析参数查询。它实现了RFC 2368协议。 三、常量 public static final StringMAILTO_SCHEME 常量值:"mailto:" 四、公共方法 public StringgetBody() 从一个Url中获取邮件的正文内容。如果没有设置正文内容,则返回null值。 返回值 返回正文或null public StringgetCc() 从一个Url中获取抄送地址。这可能是多个电子邮件地址,以逗号分隔的空间。如果没有指定抄送地址,则返回null值 返回值 逗号分隔的邮件地址或null public Map<String, String>getHeaders() 从一个Url中获取邮件头(Android123:比如编码类型,发送时间、IP等) 返回值 包含解析值的map public StringgetSubject() 从一个Url中获取主题。如果没有指定的主题行,则返回null值。 返回值 主题或null public StringgetTo() 从一个Url中获取收信人。这可能是多个电子邮件地址,以逗号分隔的空间。如果没指定,则返回null值。 返回值 逗号分隔的电子邮件地址或null。 public static booleanisMailTo(String url) 测试判断指定字符串是否包含Email的Url。 参数 url 用于测试的字符串 返回值 如果为true,字符串是包含Email的Url。 public static MailToparse(String url) 将指定Url字符串解析成MailTo类。这个解析器实现的RFC 2368。返回的对象可以用于查询解析的参数。 参数 url 包含Email的Url字符串 返回值 MailTo对象 异常 ParseException如果该结构并不是包含Email的Url将抛出此异常。 public StringtoString() 返回一个包含关于对象简洁的、大家都可以读懂的字符串。鼓励子类重写此方法,并提供一个考虑到对象的类型和数据的实现。默认的实现价于下面的表达式: 如果你打算实现自己toString方法,参见Writing a usefultoStringmethod。 返回值 表示此对象的可打印输出。 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/582371,如需转载请自行联系原作者

优秀的个人博客,低调大师

Elasticsearch mapping文档相似性算法

Elasticsearch allows you to configure a scoring algorithm orsimilarityper field. Thesimilaritysetting provides a simple way of choosing a similarity algorithm other than the default TF/IDF, such asBM25. Similarities are mostly useful fortextfields, but can also apply to other field types. Custom similarities can be configured by tuning the parameters of the built-in similarities. For more details about this expert options, see thesimilarity module. The only similarities which can be used out of the box, without any further configuration are: BM25 The Okapi BM25 algorithm. The algorithm used by default in Elasticsearch and Lucene. See Pluggable Similarity Algorithmsfor more information. classic The TF/IDF algorithm which used to be the default in Elasticsearch and Lucene. See Lucene’s Practical Scoring Functionfor more information. Thesimilaritycan be set on the field level when a field is first created, as follows: PUT my_index { "mappings": { "my_type": { "properties": { "default_field": { "type": "text" }, "classic_field": { "type": "text", "similarity": "classic" } } } } } COPY AS CURL VIEW IN CONSOLE Thedefault_fielduses theBM25similarity. Theclassic_fielduses theclassicsimilarity (ie TF/IDF). 参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/similarity.html 本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/6472719.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

官方文档,才是正途-docker-compose

需要的ingress网络映射,还是host宿主机端口映射: https://docs.docker.com/compose/compose-file/#secrets ======================== docker service create --name web \ --publish mode=host,published=80,target=80 \ nginx ========================== ports Expose ports. SHORT SYNTAX Either specify both ports (HOST:CONTAINER), or just the container port (a random host port will be chosen). Note: When mapping ports in theHOST:CONTAINERformat, you may experience erroneous results when using a container port lower than 60, because YAML will parse numbers in the formatxx:yyas sexagesimal (base 60). For this reason, we recommend always explicitly specifying your port mappings as strings. ports: - "3000" - "3000-3005" - "8000:8000" - "9090-9091:8080-8081" - "49100:22" - "127.0.0.1:8001:8001" - "127.0.0.1:5000-5010:5000-5010" - "6060:6060/udp" LONG SYNTAX The long form syntax allows the configuration of additional fields that can’t be expressed in the short form. target: the port inside the container published: the publicly exposed port protocol: the port protocol (tcporudp) mode:hostfor publishing a host port on each node, oringressfor a swarm mode port which will be load balanced. ports: - target: 80 published: 8080 protocol: tcp mode: host Note:The long syntax is new in v3.2

优秀的个人博客,低调大师

Apache Storm 官方文档 —— 源码组织结构

Strom 的代码有三个层次: 第一,Storm 在一开始就是按照兼容多语言的目的来设计的。Nimbus 是一个 Thrift 服务,拓扑也被定义为 Thrift 架构。Thrift 的使用使得 Storm 可以用于任何一种语言。 第二,所有的 Storm 接口都设计为 Java 接口。所以,尽管 Storm 核心代码中有大量的 Clojure 实现,所有的访问都必须经过 Java API。这就意味着 Storm 的每个特性都可以通过 Java 来实现。 第三,Storm 的实现中大量使用了 Clojure。可以说,Storm 的代码结构大概是一半的 Java 代码加上一半的 Clojure 代码。但是由于 Clojure 更具有表现力,所以实际上 Storm 的核心逻辑大多是采用 Clojure 来实现的。 下面详细说明了每个层次的细节信息。 storm.thrift 要理解 Storm 的代码架构,首先需要了解storm.thrift文件。 Storm 使用这个fork版本的 Thrift(“storm” 分支)来生成代码。这个 “fork” 版本实际上就是 Thrift7,其中所有的 Java package 也都重命名成了org.apache.thrift7。在其他方面,它与 Thrift7 完全相同。这个 fork 主要是为了解决 Thrift 缺乏向后兼容的机制的问题,同时,也可以让用户在自己的 Storm 拓扑中使用其他版本的 Thrift。 拓扑中的每个 spout 或者 bolt 都有一个特定的标识,这个标识称为“组件 id”。组件 id 主要为了从拓扑中 spout 和 bolt 的输出流中选择一个或多个流作为某个 bolt 订阅的输入流。Storm 拓扑中就包含有一个组件 id 与每种类型的组件(spout 与 bolt)相关联的 map。 Spout 和 Bolt 有相同的 Thrift 定义。我们来看看Bolt 的 Thrift 定义。它包含一个ComponentObject结构和一个ComponentCommon结构。 ComponentObject定义了 bolt 的实现,这个实现可以是以下三种类型中的一种: 一个 Java 序列化对象(实现了IBolt接口的对象)。 一个用于表明其他语言的实现的ShellComponent对象。以这种方式指定一个 bolt 会让 Storm 实例化一个ShellBolt对象来处理基于 JVM 的 worker 进程与组件的非 JVM 实现之间的通信。 一个带有类名与构造器参数的 Java 对象结构,Storm 可以使用这个结构来实例化 bolt。如果你需要定义一个非 JVM 语言的拓扑这个类型会很有用。使用这种方式,你可以在不创建并且序列化一个 Java 对象的情况下使用基于 JVM 的 spout 与 bolt。 ComponentCommon定义了组件的其他方面特性,包括: 该组件的输出流以及每个流的 metadata(无论是一个直接流还是基于域定义的流); 该组件消费的输入流(使用流分组所定义的一个将组件 id 与流 id 相关联的 map 来指定); 该组件的并行度; 该组件的组件级配置。 注意,spout 的结构也有一个ComponentCommon域,所以理论上说 spout 也可以声明一个输入流。然而 Storm 的 Java API 并没有为 spout 提供消费其他的流的方法,并且如果你为 spout 声明了输入流,在提交拓扑的时候也会报错。这是因为 spout 的输入流声明不是为了用户的使用,而是为了 Storm 内部的使用。Storm 会为拓扑添加隐含的流与 bolt 来设置应答框架(acking framework)。这些隐含的流中就有两个流用于从 acker bolt 向拓扑中的每个 spout 发送消息。在发现 tuple 树完成或者失败之后,acker 就会通过这些隐含的流发送 “ack” 或者 “fail” 消息。将用户的拓扑转化为运行时拓扑的代码在这里。 Java 接口 Storm 的对外接口基本上为 Java 接口,主要的几个接口有: IRichBolt IRichSpout TopologyBuilder 大部分接口的策略为: 使用一个 Java 接口来定义接口; 实现一个具有适当的默认实现的 Base 类。 你可以从BaseRichSpout类中观察到这种策略的工作机制。 如上所述,Spout 和 Bolt 都已经根据拓扑的 Thrift 定义进行了序列化。 在这些接口中,IBolt、ISpout与IRichBolt、IRichSpout之间存在着一些细微的差别。其中最主要的区别是带有 “Rich” 的接口中增加了declareOutputFields方法。这种区别的原因主要在于每个输出流的输出域声明必须是 Thrift 结构的一部分(这样才能实现跨语言操作),而用户本身只需要将流声明为自己的类的一部分即可。TopologyBuilder在构造 Thrift 结构时所做的就是调用declareOutputFields方法来获取声明并将其转化为 Thrift 结构。这种转化过程可以在TopologyBuilder的源码中看到。 实现 通过 Java 接口来详细说明所有的功能可以确保 Storm 的每个特征都是有效的。更重要的是,关注 Java 接口可以让有 Java 使用经验的用户更易上手。 另一方面,Storm 的核心架构主要是通过 Clojure 实现的。尽管按照一般的计数规则来说代码库中 Java 与 Clojure 各占 50%,但是大部分逻辑实现还是基于 Clojure 的。不过也有两个例外,分别是 DRPC 和事务型拓扑的实现。这两个部分是完全使用 Java 实现的。这是为了说明在 Storm 中如何实现高级抽象。DRPC 和事务型拓扑的实现分别位于backtype.storm.coordination、backtype.storm.drpc和backtype.storm.transactional包中。 以下是主要的 Java 包和 Clojure 命名空间的总结。 Java packages backtype.storm.coordination: 实现了用于将批处理整合到 Storm 上层的功能,DRPC 和事务型拓扑都需要这个功能。CoordinatedBolt是其中最重要的类。 backtype.storm.drpc: DRPC 高级抽象的实现。 backtype.storm.generated: 为 Storm 生成的 Thrift 代码(使用了这个fork版本的 Thrift,其中仅仅将包名重命名为 org.apache.thrift7 来避免与其他 Thrift 版本的冲突)。 backtype.storm.grouping: 包含自定义流分组的接口。 backtype.storm.hooks: 用于在 Storm 中添加事件钩子的接口,这些事件包括任务发送 tuple、tuple 被 ack 等等。 backtype.storm.serialization: Storm 序列化/反序列化 tuple 的接口。这是在Kryo的基础上构建的。 backtype.storm.spout: Spout 与一些关联接口的定义(例如SpoutOutputCollector)。其中也包含有用于实现非 JVM 语言 spout 的协议的ShellSpout。 backtype.storm.task: Bolt 与关联接口的定义(例如OutputCollector)。其中也包含有用于实现非 JVM 语言 bolt 的协议的ShellBolt。最后,TopologyContext也是在这里定义的,该类可以用于在拓扑运行时为 spout 和 bolt 提供拓扑以及他们自身执行的相关信息。 backtype.storm.testing: 包含很多 bolt 测试类以及用于 Storm 单元测试的工具类。 backtype.storm.topology: 在 Thrift 结构上层的 Java 层,用于为 Storm 提供完全的 Java API(用户不必了解 Thrift)。TopologyBuilder和一些为不同的 spout 和 bolt 提供帮助的基础类都在这里。稍微高级一点的IBasicBolt接口也在这里,该接口是一种实现基本的 bolt 的简单方式。 backtype.storm.transactional: 事务型拓扑的实现。 backtype.storm.tuple: Storm tuple 数据模型的实现。 backtype.storm.utils: 整个代码库中通用的数据结构和各种工具类。 Clojure namespaces 译者注:Clojure 部分内容暂不提供翻译。 转载自并发编程网 - ifeve.com

优秀的个人博客,低调大师

Apache Storm 官方文档 —— Storm 与 Kestrel

本文说明了如何使用 Storm 从 Kestrel 集群中消费数据。 前言 Storm 本教程中使用了storm-kestrel项目和storm-starter项目中的例子。建议读者将这几个项目 clone 到本地,并动手运行其中的例子。 Kestrel 本文假定读者可以如此项目所述在本地运行一个 Kestrel 集群。 Kestrel 服务器与队列 Kestrel 服务中包含有一组消息队列。Kestrel 队列是一种非常简单的消息队列,可以运行于 JVM 上,并使用 memcache 协议(以及一些扩展)与客户端交互。详情可以参考storm-kestrel项目中的KestrelThriftClient类的实现。 每个队列均严格遵循先入先出的规则。为了提高服务性能,数据都是缓存在系统内存中的;不过,只有开头的 128MB 是保存在内存中的。在服务停止的时候,队列的状态会保存到一个日志文件中。 请参阅此文了解更多详细信息。 Kestrel 具有 * 快速 * 小巧 * 持久 * 可靠 等特点。 例如,Twitter 就使用 Kestrel 作为消息系统的核心环节,此文中介绍了相关信息。 ** 向 Kestrel 中添加数据 首先,我们需要一个可以向 Kestrel 的队列添加数据的程序。下述方法使用了storm-kestrel项目中的KestrelClient的实现。该方法从一个包含 5 个句子的数组中随机选择一个句子添加到 Kestrel 的队列中。 private static void queueSentenceItems(KestrelClient kestrelClient, String queueName) throws ParseError, IOException { String[] sentences = new String[] { "the cow jumped over the moon", "an apple a day keeps the doctor away", "four score and seven years ago", "snow white and the seven dwarfs", "i am at two with nature"}; Random _rand = new Random(); for(int i=1; i<=10; i++){ String sentence = sentences[_rand.nextInt(sentences.length)]; String val = "ID " + i + " " + sentence; boolean queueSucess = kestrelClient.queue(queueName, val); System.out.println("queueSucess=" +queueSucess+ " [" + val +"]"); } } 从 Kestrel 中移除数据 此方法从一个队列中取出一个数据,但并不把该数据从队列中删除: private static void dequeueItems(KestrelClient kestrelClient, String queueName) throws IOException, ParseError { for(int i=1; i<=12; i++){ Item item = kestrelClient.dequeue(queueName); if(item==null){ System.out.println("The queue (" + queueName + ") contains no items."); } else { byte[] data = item._data; String receivedVal = new String(data); System.out.println("receivedItem=" + receivedVal); } } 此方法会从队列中取出并移除数据: private static void dequeueAndRemoveItems(KestrelClient kestrelClient, String queueName) throws IOException, ParseError { for(int i=1; i<=12; i++){ Item item = kestrelClient.dequeue(queueName); if(item==null){ System.out.println("The queue (" + queueName + ") contains no items."); } else { int itemID = item._id; byte[] data = item._data; String receivedVal = new String(data); kestrelClient.ack(queueName, itemID); System.out.println("receivedItem=" + receivedVal); } } } 向 Kestrel 中连续添加数据 下面的程序可以向本地 Kestrel 服务的一个sentence_queue队列中连续添加句子,这也是我们的最后一个程序。 可以在命令行窗口中输入一个右中括号]并回车来停止程序。 import java.io.IOException; import java.io.InputStream; import java.util.Random; import backtype.storm.spout.KestrelClient; import backtype.storm.spout.KestrelClient.Item; import backtype.storm.spout.KestrelClient.ParseError; public class AddSentenceItemsToKestrel { /** * @param args */ public static void main(String[] args) { InputStream is = System.in; char closing_bracket = ']'; int val = closing_bracket; boolean aux = true; try { KestrelClient kestrelClient = null; String queueName = "sentence_queue"; while(aux){ kestrelClient = new KestrelClient("localhost",22133); queueSentenceItems(kestrelClient, queueName); kestrelClient.close(); Thread.sleep(1000); if(is.available()>0){ if(val==is.read()) aux=false; } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParseError e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("end"); } } 使用 KestrelSpout 下面的拓扑使用KestrelSpout从一个 Kestrel 队列中读取句子,并将句子分割成若干个单词(Bolt:SplitSentence),然后输出每个单词出现的次数(Bolt:WordCount)。数据处理的细节可以参考消息的可靠性保证一文。 TopologyBuilder builder = new TopologyBuilder(); builder.setSpout("sentences", new KestrelSpout("localhost",22133,"sentence_queue",new StringScheme())); builder.setBolt("split", new SplitSentence(), 10) .shuffleGrouping("sentences"); builder.setBolt("count", new WordCount(), 20) .fieldsGrouping("split", new Fields("word")); 运行 首先,以生产模式或者开发者模式启动你的本地 Kestrel 服务。 然后,等待大约 5 秒钟以防出现网络连接异常。 现在可以运行向队列中添加数据的程序,并启动 Storm 拓扑。程序启动的顺序并不重要。 如果你以 TOPOLOGY_DEBUG 模式运行拓扑你会观察到拓扑中 tuple 发送的细节信息。 转载自并发编程网 - ifeve.com

优秀的个人博客,低调大师

Apache Storm 官方文档 —— 配置开发环境

本文详细讲解了配置 Storm 开发环境的相关信息。简单地说,配置过程包含以下几个步骤: 下载Storm 发行版,将其解压缩并复制到你的PATH环境变量的bin目录中(也可以根据需要自定义安装目录 —— 译者注); 如果需要在远程集群中运行拓扑,则需要在~/.storm/storm.yaml文件中配置好集群的相关信息。 上述几步的详细内容如下。 什么是开发环境? Storm 包含两种操作模式:本地模式与远程模式(即集群模式 —— 译者注)。在本地模式下,你可以在本地机器上的一个进程中完成所有的开发、测试拓扑的工作。而在远程模式下,为了运行拓扑,你需要先向服务器集群提交该拓扑。 Storm 的开发环境已经为你准备好了一切,因此,你可以在本地模式下完成开发、测试拓扑的工作,将拓扑打包并提交到远程服务器,并在远程服务器集群上运行或者终止拓扑。 我们再来回顾一下本地机器与远程集群之间的关系。Storm 集群是由一个称为 “Nimbus” 的主节点管理的。本地机器通过与 Nimbus 通信来提交代码(代码已经打包为 jar 格式),这样代码文件中包含的拓扑就可以在集群中运行。Nimbus 会小心地维护着代码在集群中的分布式结构,并为待运行的拓扑分配 worker。本地机器可以使用一个称为storm的命令行客户端来与 Nimbus 进行通信。不过,storm客户端仅用于远程模式,不能用于本地模式下开发、测试拓扑。 在本地机器上安装 Storm 如果要从本地机器上直接向远程集群提交拓扑,你需要在本地机器上安装 Storm 程序。本地的 Storm 程序可以提供与远程集群交互的storm客户端。在安装本地 Storm 之前,你需要从这里下载一个 Storm 安装程序并将其解压到你的电脑的某个位置。然后将 Storm 的bin/目录添加到你的PATH环境变量中,确保bin/storm脚本可以直接运行。 在本地机器上安装的 Storm 仅能用于与远程集群的交互。对于本地模式下的开发、测试拓扑,推荐使用 Maven 来将 Storm 添加到你的项目的开发依赖中。关于 Maven 的使用请参考此文。 在远程集群上开始/终止拓扑的运行 在上一步中我们已经安装好了本地的storm客户端。接下来就需要告诉客户端需要连接哪一个 Storm 集群。这可以通过在~/.storm/storm.yaml文件中填写 Storm 集群的主节点的 host 地址来实现: nimbus.host: "123.45.678.890" 另外,如果你在 AWS 上应用storm-deploy项目来配置 Storm 集群,它会自动配置好你的~/.storm/storm.yaml文件。你也可以使用attach命令手动配置附属的 Storm 集群(或者在多个集群之间切换): lein run :deploy --attach --name mystormcluster 更多内容请参考 storm-deploy 项目的wiki。 转载自并发编程网 - ifeve.com

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册