首页 文章 精选 留言 我的

精选列表

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

Ubuntu 14.04+Apache+PHP+MySQL+EduSoho[文档]

版权声明:转载请注明出处:http://blog.csdn.net/dajitui2024 https://blog.csdn.net/dajitui2024/article/details/79396611 参考原文:http://www.qiqiuyu.com/course/20/task/793/show注意: 本教程基于Ubuntu系统 14.04版本并且需要以root用户操作机器,请在确保您的环境是否符合以上两个条件之后,再进行后续的操作。切记:我们的edusoho访问目录是edusoho/web,只有在nginx或者Apache配置里面把根目录定位到web目录下,才不会出现奇怪的问题,否则就会出现图片不能显示或者文件无法上传的问题。 1、更新和升级系统 sudo apt-get update sudo apt-get upgrade 2、安装和配置apache 2.1、安装apache sudo apt-get install apache2 sudo apt-get install libapache2-mod-xsendfile 2.2、配置apache虚拟主机 apache说2.2的版本: 打开apache的配置文件httpd.conf 找到 #LoadModule rewrite_module modules/mod_rewrite.so 把前面#去掉。没有则添加,但必选独占一行,使apache支持 mod_rewrite 模块 apache说2.4的版本: 默认开启,在/etc/apache2/mods-available下存在rewrite.load 这个配置说明已启用 sudo a2enmod rewrite #启用rewrite模块 sudo a2enmod xsendfile #启用xsendfile模块 vi /etc/apache2/sites-enabled/edusoho.conf 将以下代码添加到虚拟主机配置中 <VirtualHost *:80> ServerName example.com ServerAlias www.example.com DocumentRoot /var/www/project/web <Directory /var/www/project/web> # enable the .htaccess rewrites AllowOverride All Require all granted </Directory> ErrorLog /var/log/apache2/project_error.log CustomLog /var/log/apache2/project_access.log combined </VirtualHost> 注意:apache2.2和2.4稍有不同,如果您是2.2,将<Directory>节点修改为: <Directory /var/www/project/web> # enable the .htaccess rewrites AllowOverride All Order allow,deny Allow from All </Directory> 注意: 1、将DocumentRoot、ServerName、伪静态路径修改为您安装系统的目录,保存修改。 2、rm /etc/apache2/sites-enabled/000-default -Rf 3、安装和配置PHP 3.1、安装PHP以及相关的插件 sudo apt-get install php5 php5-cli php5-curl php5-fpm php5-intl php5-mcrypt php5-mysqlnd php5-gd libapache2-mod-php5 3.2、修改PHP配置 #编辑php.ini , 将以下配置的值修改为1024M vi /etc/php5/apache2/php.ini memory_limit = 1024M post_max_size = 1024M upload_max_filesize = 1024M 重启Apache service apache2 restart 4、安装MySql和创建EduSoho数据库 apt-get install mysql-server 备注:安装过程中注意设定MySql的root密码,不设置默认为空,通常密码设置为root。 mysql -uroot -p 然后你需要输入MySQL数据库的root密码。 进入数据库命令行模式后,创建edusoho数据库,执行: CREATE DATABASE `edusoho` DEFAULT CHARACTER SET utf8 ; GRANT ALL PRIVILEGES ON `edusoho`.* TO 'esuser'@'localhost' IDENTIFIED BY 'edusoho'; quit; 注意:这里为edusoho数据库创建了一个用户名,用户名为:esuser,密码为edusoho,在后面安装的第三步需要用到,不建议直接填写root账户。 5、下载和解压EduSoho程序 mkdir /var/www cd /var/www wget http://download.edusoho.com/edusoho-VERSION.tar.gz (注:将VERSION替换为当前EduSoho最新版本号,可从官网www.edusoho.com查询获取) tar -zxvf edusoho-VERSION.tar.gz chown www-data:www-data edusoho/ -Rf 注:这里的下载地址可以在http://download.edusoho.com/中可以获取到,VERSION为下载来之后压缩包后面的版本号。 最后一步: 浏览器中打开:http://YOU_DOMAIN 安装,当然这里的YOU_DOMAIN是您的域名。

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

Android 中文 API 文档 (45) —— AbsoluteLayout.LayoutParams

正文 一、结构 public static classAbsoluteLayout.LayoutParamsextendsViewGroup.LayoutParams java.lang.Object android.view.ViewGroup.LayoutParams android.widget.AbsoluteLayout.LayoutParams 二、概述 每个子元素布局信息与绝对布局相关联。参见绝对布局属性中该类所支持的子视图属性列表。(译者注: AbsoluteLayout的这种“绝对”定位的布局方式和我们非常熟悉的Windows编程中的Left和Top设置UI元素的位置是基本一致的。) 三、字段 public int x 在View Group内部子元素中的X水平位置。 public int y 在View Group内部子元素中的Y垂直位置。 四、构造函数 public AbsoluteLayout.LayoutParams(int width, int height, int x, int y) 创建一个新的具有指定宽度、高度和位置的布局参数。 参数: widthMATCH_PARENT,WRAP_CONTENT或者固定大小的像素 heightMATCH_PARENT,WRAP_CONTENT或者固定大小的像素 x子元素的X位置 y子元素的Y位置 public AbsoluteLayout.LayoutParams(Context c, AttributeSet attrs) 创建一组新的布局参数,通过上下文提取的相关属性值设置。XML属性映射到这个布局参数设置如下: ·layout_x:子元素的X位置 ·layout_y:子元素的Y位置 ·所有来自ViewGroup.LayoutParams的XML属性 参数: c上下文环境. attrs从属性设置中提取布局参数值。 public AbsoluteLayout.LayoutParams(ViewGroup.LayoutParams source) (译者注:根据ViewGroup.LayoutParams实例化布局参数,从源码可以看出: 五、公共方法 public String debug (String output) 返回设置的布局参数的字符串表示形式。 参数 output用于内部表示的预置字符串 返回值 返回如下格式字符串:输出+ "ViewGroup.LayoutParams={ width=WIDTH, height=HEIGHT }" 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/582598,如需转载请自行联系原作者

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

Android 中文 API 文档 (44) —— Chronometer.OnChronometerTickListener

正文 一、结构 public static interfaceChronometer.OnChronometerTickListener 二、概述 计时器递增的时候通知这个回调。 三、公共方法 public abstract voidonChronometerTick(Chronometer chronometer) 在计时器变化时通知。 参数 chronometer计时器对象。 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/582600,如需转载请自行联系原作者

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

Rancher-k8s加速安装文档

Kubernetes是一个强大的容器编排工具,帮助用户在可伸缩性系统上可靠部署和运行容器化应用。Rancher容器管理平台原生支持K8s,使用户可以简单轻松地部署K8s集群。 很多同学正常部署k8s环境后无法进入Dashboard,基础设施应用栈均无报错。但通过查看 基础架构|容器 发现并没有Dashboard相关的容器。 因为k8s在拉起相关服务(如Dashboard、内置DNS等服务)是通过应用商店里面的YML文件来定义的,YML文件中定义了相关的镜像名和版本。而Rancher部署的k8s应用栈属于k8s的基础框架,相关的镜像通过dockerhub/rancher 仓库拉取。 默认Rancher-catalog k8s YML中服务镜像都是从谷歌仓库拉取,在没有科学上网的情况下,国内环境几乎无法成功拉取镜像。 为了解决这一问题,优化中国区用户的使用体验,我们修改了http://git.oschina.net/rancher/rancher-catalog仓库中的YML文件,将相关的镜像也同步到国内仓库,通过替换默认商店地址来实现加速部署。 环境准备 整个演示环境由以下4台本地虚拟机组成,相关信息说明如下: 操作说明 具体演示操作说明如下: 第一步 1、直接运行Rancher_server: 1 Sudodockerrun-d--restartalways–namerancher_server-p 8080 : 8080 rancher/server:stable&&sudodockerlogs-francher-server 容器初始化完成后,通过主机IP:8080访问WEB。 2、添加变量启动Rancher_server: 1 2 3 Sudodockerrun-d--namerancher-server-p 8080 : 8080 --restart=unless-stopped-eDEFAULT_CATTLE_CATALOG_URL= '{"catalogs":{"library":{"url":"http://git.oschina.net/rancher/rancher-catalog.git","branch":"k8s-cn"}}}' \ rancher/server:stable&&sudodockerlogs-francher-server 变量的作用后面介绍。 第二步,Rancher基本配置: 因为Rancher修改过的设置参数无法同步到已创建的环境,所以在创建环境前要把相关设置配置好。比如,如果你想让Rancher默认去拉取私有仓库的镜像,需要配置registry.default= 参数等。 应用商店(Catalog)地址配置:在系统管理\系统设置中,找到应用商店。禁用Rancher 官方认证仓库并按照下图配置。 名称:library (全小写) 地址:https://git.oschina.net/rancher/rancher-catalog.git 分支: k8s-cn PS:回到最开始的启动命令,如果以第二种方式启动,这个地方就会被默认配置好。所以,根据自己的情况选择哪一种配置方式, 最后点击保存。 第三步,Kubernetes环境配置查看对比: 重启并进入WEB后,选择环境管理。如图: 在环境模板中,找到Kubernetes 模板,点击右边的编辑图标,接着点击编辑配置。 以下是Rancher-k8s的默认配置对比,图一为默认商店的参数,图二为自定义商店的参数。 这里只是查看参数不做相关修改。点击cancel返回模板编辑页面。 在这里,根据需要可以定制组件,比如可以把默认的ipsec网络改为vxlan网络等,这里不再叙述。 最后点保存或者cancle返回环境管理界面。 第四步,添加环境: 在环境管理界面中,点击页面上方的添加环境按钮: 填写环境名称,选择环境模板(Kubernetes),点击创建。创建后: PS:default环境由于没有添加host,会显示Unhealthy。 切换模板 等待添加主机 第五步,添加主机: 如上图,进入添加主机界面 指定用于注册这台主机的公网IP。如果留空,Rancher会自动检测IP注册。通常在主机有唯一公网IP 的情况下这是可以的。如果主机位于防火墙/NAT设备之后,或者主机同时也是运行rancher/server容器的主机时,则必须设置此IP。 以上这段话会在添加主机页面显示,这段话的意思就是:如果准备添加的节点有运行Rancher-server容器,那么在添加节点的时候就要输入节点可被直接访问的主机IP地址(如果做的Rancher-HA,那么每台运行Rancher-server的节点都要添加主机IP地址),如果不添加主机IP地址,那么在添加节点后获取到的地址很可能会是Rancher-server容器内部的私网地址,导致无法使各节点通信。所以需要注意一下! 本示例三个节点都没有运行rancher_server,所以直接复制生成的代码,在三个节点执行。 节点添加成功,应用栈创建完毕,正在启动服务: 镜像拉取中 到此为止,k8s就部署完成。 服务容器查看:点击基础架构|主机 对比基础设施中kubernetes 应用栈,可以发现有以下容器是不在应用栈中的: 这些应用是在k8s框架运行起来之后,再通过YML配置文件拉起的k8s服务,比如Dashboard服务 那些点击 kubernetes UI 提示服务不可达的。 可以先看看有没有此服务容器。 接下来在k8s中简单部署一个应用。 第六步,k8s应用部署: 进入k8s的Dashboard后,默认显示的是default 命名空间。 可以通过下拉箭头切换到kube-system命名空间,这里显示了CPU、内存使用率,以及一些系统组件的运行状况。 应用部署: 页面右上角点击create 按钮,进入部署配置界面,并简单做一写设置: 注:在service中,如果选择Internal, 将需要ingress功能,ingress类似于LB的功能,这个后续讲解。这里我们选择External 。 最后点击deploy .点击deploy后将会跳转到部署状态界面,如图: 部署完成后显示状态: 页面右侧点击service 可以看到部署的服务以及访问信息。 返回Rancher,进入基础设施 可以看到自动增加了一个kubernetes-loadbalancers 应用栈。 这个应用栈的信息是通过k8s传递到Rancher,所以在部署应用后,在Rancher中很容易找到服务访问点。 原文来源:Rancher Labs 本文转自 RancherLabs 51CTO博客,原文链接:http://blog.51cto.com/12462495/1946612

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

云数据恢复:文档是成功的关键

创建云上的数据恢复计划,很重要的一点是持续跟踪基础架构,DR需求和可能的故障转移持续时间。 公有云给IT部门提供了绝佳的机会来实现业务的持续性/灾难恢复计划,而无需花费巨资构建独享的数据中心。有了云数据恢复系统之后,云就可以用作基本数据的存储库或者甚至当主要系统出问题时运行应用之处。 当构建DR计划时,第一步是查看用来交付IT服务的应用,并且决定灾难发生时需要保护什么。这意味着创建需要运行的应用和服务的清单。很多企业已经转向虚拟化作为其核心服务器的部署模型;但是,仍然需要考虑物理服务器。完善的云数据恢复计划应该包括如下: 用来交付基础架构的物理和虚拟服务器。这些包括活动目录(AD)服务器,DNS/DNCP服务器和应用。 用来交付应用的物理服务器。为什么还在物理服务器上交付服务,这需要有好一点的理由;这可能包括扩展和性能要求,或者使用自定义硬件和操作系统。但是,云恢复服务可能能够帮助虚拟化其中一些组件。 用来交付应用的虚拟服务器。可能有几十台或者上百台虚拟机用来实现应用。每台都需要确认和记录、查看存储、内存和虚拟处理器需求。 最好提前确定基础架构服务器,因为当灾难发生时这些系统需要第一时间恢复服务。可以预配置在云上运行的AD、DNS和DNCP服务,并且和它们的内部实例同步,让DR流程更加容易,也能够更快实现。 要想让云上的DR能够成功工作,理解网络配置至关重要。这意味着需要花时间理解网络层的应用之间的相互依赖关系,包括安全和防火墙配置。云数据恢复相关的问题有: 是否有应用或者服务器互相之间有延迟依赖? 是否有East-West防火墙规则来管理站内流量? 面向客户的应用的外部带宽需求是什么? 确定云数据恢复需求 假定在灾难事件发生时,每个应用都需要立即恢复,这并不太实际。相反,应该基于一系列条件来区分应用的优先级,来决定需要多快,以及哪些同步系统和数据需要恢复运营。在决定恢复应用的服务等级时,可以使用一些标准来进行度量: 恢复时间目标。它衡量在应序备份并且运行之前可以容忍多长的下线时间;通常以分钟或者小时计量。比如,零RTO表示完全不能容忍掉线,而一小时的RTO意味着应用必须在DR发生的一小时内完成恢复。 恢复点目标。它衡量一旦应用再次运行时可以容忍丢失多少数据。零RPO意味着所有数据都必须恢复到灾难发生点,而24小时的RTO意味着恢复后数据或系统可以过时24小时。 服务级别目标。SLO衡量整体应用的恢复情况。比如,协议可能是在四小时内恢复90%的应用。越严格的SLO要求越多的基础架构支撑并且可能需要越多的人力才能达到,因此留有一定的灵活度有助于管理DR的费用。 SLO 允许区分数据和应用的优先级。比如,一个在线信用卡处理系统要求零RPO和非常低的RTO。期望这样的系统永远也不会丢失信息是合理的。另一种极端情 况是,负责报告的应用可能能够容忍24到48小时的数据过期时间,因为其数据是从其他应用里抽取出来的。其他系统大多数处在这两种极端情况之间。 建立正确的云数据恢复需求包括和应用程序的业务所有者沟通,因为他们了解其应用的重要程度。从经验上看,业务所有者会认为其所有应用都很重要——直到他们了解恢复所需的费用为止。因此可以告诉他们不同方案的费用评估。 服务级别的最后一点是:一些严格的需求,比如零PRO,基于云的DR是无法达成的,因为本地和云位置之间会有延时。需要将这些应用排除在基于云的DR之外,并且提供更多定制的DR产品。 DR服务会运行多久? 最后需要讨论的是,服务会在公有云上运行多久。做这样的决策依赖于发生的事件类型。并非所有灾难都会导致所有在线功能的崩溃。还会存在一些边缘事件类型,比如: 服务器丢失。要么是物理服务器,要么是虚拟服务器主机。虚拟服务器的丢失可能很严重,但也可能不严重,应用程序需要转而运行在DR模式。 多系统丢失。比如,如果共享存储阵列出问题的话,可能会失去多个应用。 数据中心丢失。在最坏的情况下,整个数据中心都丢失了,或者访问不了。所有服务都需要运行在DR模式下。 有时候,服务需要移动几个小时或者几天。当整个站点都丢失时,需求可能是运行DR服务几周或者几个月,直到重建了之前的设备。云恢复服务会为所使用的活动服务计费,因此在选择DR服务时这是很重要的考核点。 本文作者:崔婧雯编译 来源:51CTO

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

akka文档(java)——akka的用例示例

我们看到akka正被许多大型组织所采用,已被广泛应用于投资与商业银行业务,零食与社交媒体,虚拟仿真,游戏与博彩,数据分析等等行业。任何需要高吞吐量和低延迟的系统都是使用akka的良好候选者。 这里有一些良好的关于akka用例的讨论以及在生产环境的使用评论。 下面是一些已将akka部署到生产环境的领域 事务处理(在线游戏,金融、银行,贸易,统计,博彩,社会化媒体,电信) 纵向扩展,横向扩展,容错/HA 后端服务 (任何行业,任何应用) REST服务, SOAP, Cometd, WebSockets等,充当信息枢纽/集成层纵向扩展 、横向扩展,容错/HA 并发/并行性(任何应用) 简单正确的使用与理解akka仅仅是将它的jar添加到你的JVM工程(使用Scala、Java、Groovy或JRuby) 虚拟仿真 主/从,计算风格,MapReduce等 批处理(任何行业) Camel与批量数据源整合,角色对工作负载分而治之 通讯枢纽(电信、网络媒体、移动媒体) 纵向扩展,横向扩展,容错/HA 游戏与博彩(MOM(消息中间件),网络游戏,博彩) 纵向扩展,横向扩展,容错/HA 商业智能/数据挖掘/通用运算 纵向扩展,横向扩展,容错/HA 复杂的事件流处理 纵向扩展,横向扩展,容错/HA 转载自并发编程网 - ifeve.com

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

Apache Storm 官方文档 —— Ack 框架的实现

Storm 的acker使用哈希校验和来跟踪每个 tuple 树的完成情况:每个 tuple 在被发送出的时候,它的值会与校验和进行异或运算,然后在 tuple 被 ack 的时候这个值又会再次与校验和进行异或运算。这样,一旦所有的 tuple 都被成功 ack,校验和就会变为 0(随机生成的校验和为 0 的概率极小,可以忽略不计)。 你可以在wiki中了解更多关于可靠性机制的信息。 ackerexecute() Acker 实际上也是一个 bolt,它的execute 方法是定义在mk-acker-bolt中的。在一个新的 tuple 树生成的时候,spout 为每个 tuple 发送一个用于异或的固有 id,acker 会将这些 id 记录在它的挂起队列中。每次 executor ack 一个 tuple 的时候,acker 会接收到一个部分校验和,这个校验和是 tuple 自身的 id(将其从挂起队列中清除)和 executor 发送的每个下游 tuple 的 id(放入挂起队列中)的异或值。 这个过程是这样的: 在接收到 tick tuple 信号的时候,将 tuple 树的校验值向超时方向移动并且返回。同时,在 tuple 树中更新或者创建一个记录。 初始化阶段:使用指定的校验和值进行初始化,并且记录 spout 的 id; ack 阶段:将部分校验和与当前的校验和进行异或运算; fail 阶段:仅仅将 tuple 标记为 failed 状态。 接下来,将记录存入RotatingMap(重新设置超时计数值)并且继续以下过程: 如果总校验和为 0, 表明 tuple 树已经完成:将记录从挂起队列中移除,并通知 spout 处理成功; 如果 tuple 树失败了,也会有一种完成状态:将记录从挂起队列中移除,并通知 spout 处理失败。 最后,发送一个我们自己的 ack 信号。 挂起 tuples 与RotatingMap Acker 将挂起树存放在一个RotatingMap中。RotatingMap是一个在 Storm 中多处使用的简单工具,它主要用于高效地处理过程的超时。 RotatingMap 与 HashMap 类似,支持 O(1) 时间的 get 操作。 在 RotatingMap 内部有多个 HashMap(称为槽,buckets),每个 HashMap 都保存有一群会在同一时间超时的记录。我们称存在时间最长的 bucket 为死亡牢房(death row),而访问最多的 bucket 称为苗圃(nursery)。一个新的值在被.put()到 RotatingMap 中,它都会被重定位到 nursery 中,并且从其他的它之前可能在的 bucket 中移除(这是一种高效的重新设置延时时间的方法)。 在 RotatingMap 的所有者调用.rotate()方法的时候,RotatingMap 会将每个 bucket 向着超时的方向移动一步(一般 Storm 对象会在收到一个系统 tick 流 tuple 的时候调用 rotate 方法)。如果此时在前面所说的 death row bucket 中有 key-value 键值对,RotatingMap 会为每个 key-value 键值对触发一个回调函数(在构造器中定义的),让他们的所有者选择一个合适的操作(例如,将 tuple 标记为处理 转载自并发编程网 - ifeve.com 失败)。

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

Apache Storm 官方文档 —— 分布式 RPC

分布式 RPC(DRPC)的设计目标是充分利用 Storm 的计算能力实现高密度的并行实时计算。Storm 接收若干个函数参数作为输入流,然后通过 DRPC 输出这些函数调用的结果。严格来说,DRPC 并不能算作是 Storm 的一个特性,因为它只是一种基于 Storm 原语 (Stream、Spout、Bolt、Topology) 实现的计算模式。虽然可以将 DRPC 从 Storm 中打包出来作为一个独立的库,但是与 Storm 集成在一起显然更有用。 概述 DRPC 是通过一个 DRPC 服务端(DRPC server)来实现分布式 RPC 功能的。DRPC server 负责接收 RPC 请求,并将该请求发送到 Storm 中运行的 Topology,等待接收 Topology 发送的处理结果,并将该结果返回给发送请求的客户端。因此,从客户端的角度来说,DPRC 与普通的 RPC 调用并没有什么区别。例如,以下是一个使用参数 “http://twitter.com”调用 “reach” 函数计算结果的例子: DRPCClient client = new DRPCClient("drpc-host", 3772); String result = client.execute("reach", "http://twitter.com"); 下图是 DRPC 的原理示意图。 客户端通过向 DRPC 服务器发送待执行函数的名称以及该函数的参数来获取处理结果。实现该函数的拓扑使用一个DRPCSpout从 DRPC 服务器中接收一个函数调用流。DRPC 服务器会为每个函数调用都标记了一个唯一的 id。随后拓扑会执行函数来计算结果,并在拓扑的最后使用一个名为ReturnResults的 bolt 连接到 DRPC 服务器,根据函数调用的 id 来将函数调用的结果返回。 定义 DRPC 拓扑 可以直接使用普通的拓扑构造方法来构造 DRPC 拓扑,如下所示: public static class ExclaimBolt extends BaseBasicBolt { public void execute(Tuple tuple, BasicOutputCollector collector) { String input = tuple.getString(1); collector.emit(new Values(tuple.getValue(0), input + "!")); } public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("id", "result")); } } public static void main(String[] args) throws Exception { TopologyBuilder builder = new TopologyBuilder(); // builder.setSpout(drpcSpout); // builder.setBolt(new ExclaimBolt(), 3); // submit(builder.createTopology()); } 本地模式 DRPC DRPC 可以在本地模式下运行。以下是使用本地模式构造拓扑的例子: LocalDRPC drpc = new LocalDRPC(); DRPCSpout spout = new DRPCSpout("exclamation", drpc); builder.setSpout("drpc", spout); builder.setBolt("exclaim", new ExclaimBolt(), 3) .shuffleGrouping("drpc"); builder.setBolt("return", new ReturnResults(), 3) .shuffleGrouping("exclaim"); LocalCluster cluster = new LocalCluster(); Config conf = new Config(); cluster.submitTopology("drpc-demo", conf, builder.createTopology()); // local mode 测试代码 System.out.println(drpc.execute("exclamation", "hello")); cluster.shutdown(); drpc.shutdown(); 在这种模式下,首先你会创建一个LocalDPRC对象,该对象会在进程中模拟一个 DRPC 服务器,其作用类似于LocalCluster在进程中模拟 Storm 集群的功能。在定义好拓扑的各个组件之后,就可以使用LocalCluster来提交拓扑。在本地模式下LocalDPRC对象不会绑定到任何一个实际的端口,所以需要通过向DRPCSpout传入参数的方式来关联到拓扑中。 在启动拓扑后,你可以使用execute方法来完成 DRPC 调用。 远程模式 DRPC 在一个实际的集群中使用 DRPC 有以下三个步骤: 配置并启动 DRPC 服务器; 在集群的各个服务器上配置 DRPC 服务器的地址; 将 DRPC 拓扑提交到集群运行。 可以像 Nimbus、Supervisor 那样使用storm命令来启动 DRPC 服务器(注意,此 server 的基本配置,如 nimbus,ZooKeeper 等参数应该与 Storm 集群其他机器相同): bin/storm drpc 接下来,你需要在集群的各个服务器上配置 DRPC 服务器的地址。这是为了让DRPCSpout了解从哪里获取函数调用的方法。可以通过编辑storm.yaml或者添加拓扑配置的方式实现配置。配置storm.yaml的方式类似于下面这样: drpc.servers: - "drpc1.foo.com" - "drpc2.foo.com" 最后,你可以像其他拓扑一样使用StormSubmitter来启动拓扑。 以下是使用远程模式构造拓扑的一个例子: TopologyBuilder builder = new TopologyBuilder(); DRPCSpout spout = new DRPCSpout("exclamation"); builder.setSpout("drpc", spout, 3); builder.setBolt("exclaim", new ExclamationBolt(), 3) .shuffleGrouping("drpc"); builder.setBolt("return", new ReturnResults(), 7) .shuffleGrouping("exclaim"); Config conf = new Config(); conf.setNumWorkers(2); StormSubmitter.submitTopology("drpc-demo", conf, builder.createTopology()); 更复杂的例子 请参考Trident 教程一文中计算指定 URL 的 Reach 数的例子。 转载自并发编程网 - ifeve.com

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

Apache Storm 官方文档 —— 命令行操作

本文介绍了 Storm 命令行客户端中的所有命令操作。如果想要了解怎样设置你的 Strom 客户端和远程集群的交互,请按照配置开发环境一文中的步骤操作。 Storm 中支持的命令包括: jar kill activate deactivate rebalance repl classpath localconfvalue remoteconfvalue nimbus supervisor ui drpc jar 语法:storm jar topology-jar-path class ... 使用指定的参数运行 main 方法(也就是打包好的拓扑 jar 包中的 main 方法)。Storm 所需要的 jar 包和配置信息都在类路径(classpath)中。这个运行过程已经配置好了,这样StormSubmitter就可以在提交拓扑的时候将topology-jar-path中的 jar 包上传到集群中。 kill 语法:storm kill topology-name [-w wait-time-secs] 杀死集群中正在运行的名为topology-name的拓扑。执行该操作后,Storm 首先会注销拓扑中的 spout,使得拓扑中的消息超时,这样当前的所有消息就会结束执行。随后,Storm 会将所有的 worker 关闭,并清除他们的状态。你可以使用-w参数来调整 Storm 在注销与关闭拓扑之间的间隔时间。 activate 语法:storm activate topology-name 激活运行指定拓扑的所有 spout。 deactivate 语法:storm deactivate topology-name 停止指定拓扑的所有 spout 的运行。 rebalance 语法:storm rebalance topology-name [-w wait-time-secs] 有些场景下需要对正在运行的拓扑的工作进程(worker)进行弹性扩展。例如,加入你有 10 个节点,每个节点上运行有 4 个 worker,现在由于各种原因你需要为集群添加 10 个新节点。这时你就会希望通过扩展正在运行的拓扑的 worker 来使得每个节点只运行两个 worker,降低集群的负载。实现这个目的的一种直接的办法是 kill 掉正在运行的拓扑,然后重新向集群提交。不过 Storm 提供了再平衡命令可以以一种更简单的方法实现目的。 再平衡首先会在一个超时时间内(这个时间是可以通过-w参数配置的)注销掉拓扑,然后在整个集群中重新分配 worker。接着拓扑就会自动回到之前的状态(也就是说之前处于注销状态的拓扑仍然会保持注销状态,而处于激活状态的拓扑则会返回激活状态)。 repl 语法:storm repl 打开一个带有类路径上的 jar 包和配置信息的 Clojure 的交互式解释器(REPL)。该命令主要用于调试。 classpath 语法:storm classpath 打印客户端执行命令时使用的类路径环境变量。 localconfvalue 语法:storm localconfvalue conf-name 打印出本地 Storm 配置中conf-name属性的值。这里的本地配置指的是~/.storm/storm.yaml和defaults.yaml两个配置文件综合后的配置信息。 remoteconfvalue 语法:storm remoteconfvalue conf-name 打印出集群配置中conf-name属性的值。这里的集群配置指的是$STORM-PATH/conf/storm.yaml和defaults.yaml两个配置文件综合后的配置信息。该命令必须在一个集群机器上执行。 nimbus 语法:storm nimbus 启动 nimbus 后台进程。该命令应该在daemontools或者monit这样的工具监控下执行。详细信息请参考配置 Storm 集群一文。 supervisor 语法:storm supervisor 启动 supervisor 后台进程。该命令应该在daemontools或者monit这样的工具监控下执行。详细信息请参考配置 Storm 集群一文。 ui 语法:storm ui 启动 UI 后台进程。UI 提供了一个访问 Storm 集群的 Web 接口,其中包含有运行中的拓扑的详细信息。该命令应该在daemontools或者monit这样的工具监控下执行。详细信息请参考配置 Storm 集群一文。 drpc 语法:storm drpc 启动 DRPC 后台进程。该命令应该在daemontools或者monit这样的工具监控下执行。详细信息请参考分布式 RPC一文。 转载自并发编程网 - ifeve.com

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

Adopt Open JDK官方文档(五) Docker镜像

5.1 复制镜像 镜像可以从别的设备复制并导入本地的Docker仓库。 保存镜像的命令为: docker save -o <save image to path> <image name> 或者 docker save <image name> > <save image to path> 保存镜像示例 docker save -o base-image-openjdk9.tar neomatrix369/openjdk9-base-image:latest 或者 docker save neomatrix369/openjdk9-base-image:latest > openjdk9-base-image.tar 或者 docker save neomatrix369/openjdk9-base-image:latest | gzip > openjdk9-base-image.tar.gz openjdk9-base-image.tar 和 openjdk9-base-image.tar.gz 的镜像已默认保存至Docker仓库。 加载镜像的命令为 docker load -i <path to image tar file> 或者 docker load < <path to image tar file> 加载镜像示例 docker load -i openjdk9-base-image.tar 或者 docker load < openjdk9-base-image.tar 或者 docker load < gzip < openjdk9-base-image.tar.gz 5.2 创建镜像 提示:在之前的介绍章节中,已经给出了Docker在相关平台使用的介绍。 在Linux,MacOS,Windows平台创建OpenJDK9 docker镜像的详细步骤如下: Why not build #OpenJDK 9 using #Docker ? – Part 1 of 2 Why not build #OpenJDK 9 using #Docker ? – Part 2 of 2 5.3 检查镜像 提示:这一步针对的OpenJDK镜像,是已经创建好的或者从别处导入至本地的Docker仓库的。 不同的操作系统启动docker的方法也不相同,在Mac和Windows平台,通常通过命令boot2docker启动docker,Linux系统在启动时会自动加载。 在docker启动之后运行命令: $ docker images 会得到如下输出: REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE neomatrix369/openjdk9 latest 5877e8efd939 4 days ago 5.82 GB neomatrix369/full-image-openjdk9 latest 32b0a686e93b 4 days ago 5.82 GB neomatrix369/base-image-openjdk9 latest ce63b2673e6a 4 days ago 781.7 MB phusion/baseimage latest 5a14c1498ff4 4 months ago 279.7 MB 继续执行如下命令: $ sudo docker run -it --name openjdk9 neomatrix369/openjdk9 /bin/bash 这一步是跳转到docker容器中执行bash shell命令 $ sudo docker run -it --name openjdk9 neomatrix369/openjdk9 java -version 这一步会运行java命令(需要事先配置好java环境变量,通过PATH或者JAVA_HOME可以找到java命令)获取如下信息: openjdk version "1.9.0-internal" OpenJDK Runtime Environment (build 1.9.0-internal-_2015_06_04_06_46-b00) OpenJDK 64-Bit Server VM (build 1.9.0-internal-_2015_06_04_06_46-b00, mixed mode) 转载自并发编程网 - ifeve.com

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册