Apache storm apachestorm中的并行性

我是Apache Storm的新手,正在尝试为我的用例设计一个简单的拓扑。Storm()中对并行性的解释给我留下了两个疑问: 1) 假设同一个工人将有遗嘱执行人,这样安全吗 如果我只有一个工人,我的喷口和螺栓会怎么样 2) 工作间通信使用ZeroMQ,它使用网络进行通信,而不是LMX中断器 用于工作人员内部通信,在内存中通信速度更快。我是否应该创建一个工人来提高绩效 请回答上述问题,如果不正确,请更正我的理解。1)是 2) 由于进程内通信在Storm中要昂贵得多,因此建议每台机器每拓扑使用一个w

Apache storm 暴风雨-卡夫卡是一个奇怪的例外

在提交Storm拓扑时,我遇到了一个奇怪的错误异常。它在一个VM上运行,但在另一个VM上引发异常。我无法理解为什么会发生这种情况,因此我正在粘贴整个堆栈跟踪: java.lang.RuntimeException: java.lang.RuntimeException: org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /brokers/topics

Apache storm 如何使用IMetricsConsumer捕获所有指标?

我已经创建了imericsConsumer的一个实现,并通过YAML在我的拓扑中注册了它,如下所示。我在自己的代码中创建的任何自定义度量都会成功地传递给此使用者 topology.metrics.consumer.register: - class: "hnb.storm.metric.opentsdb.OpenTsdbMetricConsumer" parallelism.hint: ${storm.topology.metrics.consumer.paralleli

Apache storm 如何建立Storm伪分布式集群

我已经建立了一个Zookeeper伪分布式集群,我想在我的单机上的一个伪集群上运行一个Storm拓扑,我应该怎么做?我看到有人写道,它需要配置Storm 3次,就像处理Zookeeper一样,我不确定,有人知道吗?只需按照群集设置指南: 对于伪分布式安装,请在您的单机中运行所有守护进程(ZK、Nimbus和一个单一的管理程序)。我错过了!非常感谢。127.0.1.1我应该散列还是让它散列呢?127.0.1.1。应该已经有真名了吗?如果没有,请尝试添加另一行实名。我以前在此文件中做过更改,无

Apache storm storm BasicBolt在哪里处理ack()函数?

我们知道,当使用BaseBasicBolt时,我们不需要调用ack()函数 但是当我浏览BaeBasicBolt的代码时,IBasicCode,找不到任何代码的实现 因此,我想知道在BasicBolt中如何调用ack()方法?我找到了它 当TopologyBuilder.setBolt()完成时,会出现BasicBoltExecutor处理ack和fail逻辑

Apache storm storm1.1.0:未找到匹配字段:org.apache.storm.pacemaker.PacemakerClient类的waitUntilReady

使用storm 1.1.0运行拓扑时,storm的worker上的pacemaker出现错误 ->java.lang.IllegalArgumentException:未找到匹配字段:org.apache.storm.pacemaker.PacemakerClient类的waitUntilReady 似乎在使用反射时,调用程序找不到waitUntilReady方法? 但是我在PacemakerClient的源代码中发现了这个方法:private void waitUntilReady()抛出Pa

Apache storm Storm拓扑不会以并行提示1200开始

我有一个带有3个螺栓(a、B、C)的storm拓扑,其中中间螺栓的平均时间约为450ms,其他两个螺栓的平均时间不到1ms 我能够使用以下并行性提示值运行拓扑: Version Info: "org.apache.storm" % "storm-core" % "1.2.1" "org.apache.storm" % "storm-kafka-client" % "1.2.1" 但当我将并行性提示B增加到1200时,拓扑不会启动 在拓扑日志中,我看到多次加载executor:

Apache storm 阿帕奇·卡夫卡vs阿帕奇风暴

ApacheKafka:分布式消息传递系统 apachestorm:实时消息处理 我们如何在实时数据管道中使用这两种技术来处理事件数据 在实时数据管道方面,在我看来,两者的工作是相同的。我们如何在数据管道上同时使用这两种技术?您使用Apache Kafka作为一种分布式、健壮的队列,它可以处理大量数据,并使您能够将消息从一个端点传递到另一个端点 暴风雨不是排队。它是一个具有分布式实时处理能力的系统,这意味着您可以并行地对实时数据执行各种操作 这些工具的通用流程(据我所知)如下所示: 实时系统--

Apache storm 阿帕奇风暴螺栓

我是Apache Storm的新手,我看到了上面的程序,但不太理解。我想知道data=tup.values[0]做了什么。谢谢你的帮助 Tuple by definition是一个有序的对象列表tup.values[0]按位置从tuple检索对象。因此它只返回元组中的第一个对象 class MyBolt(storm.BasicBolt): def process(self, tup): data = tup.values[0].split(',')

Apache storm 如何从storm中的特定流中选择字段值

调用getValueByField时,如何指定前一个Bolt/spoot发出的特定流名称,以便特定的字段名称来自该流 我需要知道这一点,因为我面临以下例外情况: public void execute(Tuple input) { Object value = input.getValueByField(FIELD_NAME); ... } 所以,我想在调用getValueBy时指定一个特定的流。。。方法。我不记得对元组执行此操作的方法,但您可以获得发送元组的人的信息: Invalid

Apache storm 在暴风雨中FieldID是什么意思?

这是配置文件: TopologyBuilder builder = new TopologyBuilder(); builder.setSpout("1", new Produce(), 1); builder.setBolt("2", new Output(), 4).shuffleGrouping("1"); builder.setBolt("3", new Writer(), 8).fieldsGrouping("2", new Fields("ahah","bb")); # And

Apache storm 在Apache Storm中,如何确定组件(喷口/螺栓)是否发生故障并重新激活?

我正在ApacheStorm集群上运行一个拓扑,我想保留一个专门的螺栓,以便在喷口关闭时执行一些与状态相关的清理(注意:喷口的并行度为5,因此如果一个实例关闭,我需要特定的信息) 我如何确定喷口是否下降并被恢复? 如何识别哪一个喷口(5个喷口中的一个)发生故障

Apache storm 使用storm时,如何将对象从拓扑上下文访问到螺栓中?

我们需要在创建拓扑时传递一个对象,以便螺栓可以访问该对象,并基于该对象进行进一步处理。是否可以通过TopplogyContext传递对象?如果可以,如何传递?或者,在提交拓扑之前,是否有其他方法在提交拓扑时传递对象,以便bolt可以在其上拥有句柄/控件 我们需要通过上下文传递对象,以便所有螺栓都可以访问它,并且不需要强制在该拓扑的所有螺栓中实现构造函数。因此,想知道是否存在任何API来执行相同的操作吗?我不太清楚您的意思,但是您的bolt类在初始化时始终可以接受一个参数,您可以使用创建拓扑时要传

Apache storm 如何为安全性启用storm ui的身份验证?

最近我安装了分布式实时计算系统“Storm”。 启用storm ui时,每个人都可以通过权限访问storm ui,并且可以终止我的拓扑。 如何启用身份验证?您可能希望大致了解一下,尤其是本节 另外,在配置文件中有一个战利品。它包含与保护Apache Storm拓扑相关的条目 请检查您使用的是哪个版本的Apache Storm。您使用的是哪个版本的Storm?

Apache storm 为什么在storm拓扑中执行和确认之间存在巨大的延迟

我正在开发ApacheStorm,我发现执行和确认之间存在巨大的差异 以下是Storm UI的屏幕截图 我们该怎么做才能使ack等于executed,我试着增加打包机的数量,但这没有任何帮助。为了弄清楚,我想尝试解释这两个值的含义。Executed表示为bot调用execute方法的次数。Acked表示螺栓调用ack的次数 从上面的快照可以看出,这意味着booking_bolt执行了23300次execute方法,而只调用了500次acked 所以,在bolt的execute方法中,ack或fa

Apache storm 风暴螺栓错误处理最佳实践

只是想了解如何检测重试的元组,以便在最后一次重试失败时将它们添加到某种死信队列中。我有一个想法,我想如何处理例外/失败一般从这个;特别是分离可再审和不可再审例外的想法 不可重试的异常是引入的错误,在重播时不会成功。我想捕捉这些,并立即将元组添加到死信队列中。当错误/问题得到解决时,可以分析问题并重新处理元组 有了可重试的例外情况,这就不那么容易了。您可能会遇到间歇性网络问题,重试后会成功。另一方面,下游服务可能会中断数小时 对于后一种情况(由于下游中断而导致的可重试异常),它将导致元组被重放X次

Apache storm 如何在我的storm jar中使用acl访问卡夫卡?

在我不使用任何SASL或ACL使用kafka之前,它工作得很好,现在我为我的kafka集群构建了SASL_明文,如何在我的storm jar中访问我的kafka集群 我的风暴版本:1.1.0 卡夫卡版本:0.10.1 我使用HDP-2.6.3.0-235 任何建议都会很有帮助。谢谢这些是我在安全环境下使用卡夫卡运行storm的步骤 1.您需要使用storm的hdp特定依赖项来启用安全协议属性 <repositories> <repository>

Apache storm 如何在Apache Storm中分割流?

我不明白如何在Apache Storm中分割流。例如,我有一个螺栓A,经过一些计算后,它有somevalue1、somevalue2和somevalue3。它想把一些值1发送到螺栓B,一些值2发送到螺栓C,一些值1,一些值2发送到螺栓D。在暴风雨中我该怎么做?我将使用什么分组?我的拓扑结构是什么样的?提前感谢您的帮助 这里有两个选项:和“直接分组”。根据您的要求,其中一个将为您提供服务 看看WordCountTopology示例项目,看看这是否就是您想要的。否则,“直接分组”将是更好的选择 但同

Apache storm 风暴拉进陈旧的依赖

我们正在尝试从Storm 0.10.0升级到1.0.2,我们的项目使用 在版本之间,storm社区将backtype.storm包名更改为org.apache.storm包名 作为我们自己升级的一部分,我们不得不将暴风卡夫卡的版本也改为1.0.2 但是,当我在storm上运行拓扑时,我得到了关于旧版本中缺少类的错误: apache-storm-1.0.2/bin/storm \ jar \ $jarFile \ org.apache.storm.flux.Flux \ $yamlFile \

Apache storm 作为单个实例运行Storm HA Nimbus

我正在使用Storm 1.0.2。目前我们有一个小的拓扑结构,我们只希望运行一个Nimbus实例。然而,在我们唯一的Nimbus实例出现磁盘丢失的罕见情况下,创建一个新实例将永远不会起作用。新实例将转到ZK,由于缺少拓扑数据,将永远不会被选为领导者,也不会再次出现。这是我们面临的问题。我能想到的唯一解决办法是将这些数据存储在一个单独的永久磁盘上,这样即使我们唯一的Nimbus实例发生故障,我们也不会丢失拓扑JAR,下一个实例可以由ZK无任何问题地成为Leader 我错过什么了吗?除删除nimbu

Apache storm 远程提交的Storm拓扑未运行

我们创建了一个storm拓扑,并在本地模式下进行了测试,一切正常。然后我们做了一个构建,并提交给nimbus和一个主管,共有4个插槽。拓扑显示在storm UI上,并显示为活动,集群上使用了4个插槽。但单击拓扑时,没有喷口、螺栓和统计信息。我们的Redis数据库也没有写入任何内容。所以我们想知道是否有什么我们没有做的 风暴版:2.0.0 OS:Linux Mint 19.1肉桂版由于某种原因,您的拓扑很可能无法启动。看看Storm中的日志目录。最有可能的是风暴会记录那里的错误。您很可能想查看日志

Apache storm 使用Trident拓扑的好处是什么?它与DRPC拓扑有何不同?

我对风暴还不熟悉。。请帮助我清楚地理解Trident拓扑。我还想知道Trident拓扑的需求套件是什么?Trident基本上是建立在storm之上的抽象,允许有状态流处理。它确保消息的“精确一次处理”,而不是消息的“至少一次处理” 从页面 Trident是在Storm上进行实时计算的高级抽象。它允许您将高吞吐量(每秒数百万条消息)、有状态流处理与低延迟分布式查询无缝混合。如果您熟悉Pig或Cascading等高级批处理工具,则Trident的概念将非常熟悉–Trident具有连接、聚合、分组、函

Apache storm 错误404到风暴用户界面

我在Ubuntu 14.04上安装了Storm(在虚拟机上) 我还安装了apache2,并在此目录中创建了一个链接: ln -sf /usr/share/storm/public/ /var/www/html/ 通过此链接,我可以通过点击以下链接访问我的storm目录: 172.1.24.18/风暴 但是,我有404个错误: 例子: GEThttp://172.25.31.45/api/v1/topology/summary 404(未找到) 事实上,我认为Storm使用绝对路径。 如果

Apache storm 使用nimbus客户端部署storm jar时,storm UI中缺少喷口和螺栓信息

我遵循了下面帖子中的一个例子 我能够成功地部署拓扑。在storm Ui中,我可以看到拓扑处于活动状态,但喷口和螺栓细节缺失。知道我错过了什么吗。感谢您的帮助。您创建了一个空拓扑,然后提交了它。您的喷口和螺栓不会显示,因为您尚未将它们添加到TopologyBuilder: Config config = new Config(); TopologyBuilder builder = new TopologyBuilder(); builder.setSpout(MY_SPOUT_ID, mySp

Apache storm Storm 1.0.1提交拓扑时出现工作错误

在向Storm 1.0.1提交拓扑时,我收到以下错误(worker.log)(尽管有错误,拓扑确实已提交,并且出现在Storm UI中): 在supervisor.log中也找到了此条目: o.a.s.util [WARN] Worker Process ea92e1b7-c870-4b4c-b0a6-00272f27f521:# There is insufficient memory for the Java Runtime Environment to continue. 但是,“fre

Apache storm Storm是否支持事件之间的时间关系?

我正在寻找一种方法来检测未发生的事件。示例:事件B应在事件A的15分钟内发生。Esper有“时间:间隔”,Drools Fusion有“窗口:时间”和“之后” 任何风暴都无法做到这一点。您需要编写自己的代码并将其放入Storm bolt中,您可以利用Storm tick元组 Storm是分布式容错实时计算系统,因此不进行复杂的事件处理 CEP工具(如Esper和Drools)可以分析一系列事件,以找到您正在寻找的模式。谢谢。我真的很想使用Drools,但找不到HA解决方案。支持持久会话,但它们似

Apache storm 风暴vs卡夫卡和处理器

我在阅读storm文档时发现,不清楚apache storm到底给了我什么,而不是让一个小进程从一个kafka主题消费并产生到另一个主题?有了这个架构,我可以改变每个工作进程的数量,以适应哪些组件较慢等。大概storm会给我自动容错和易于重新平衡?是否可能有任何性能改进 大概storm会给我自动容错和轻松的重新平衡 是的,这都是关于容错和再平衡的: Storm将密切关注大多数组件,并跟踪批处理是否成功重播。如果不是,它将方便地重播它。UI和logviewer是非常小的添加。另一个好处是,Stor

Apache storm 如何查看垃圾收集日志?

我了解到垃圾收集日志对于解决性能问题非常有用,但我无法查看它们 我在yaml中添加了以下内容,其中xloggc属性设置为我可以找到工作人员/主管/etc日志的相同路径: worker.childopts: "-XX:+PrintCGTimeStamps -XX:+PrintGCTimeStamps -Xloggc: /mycomp/log/storm/worker%ID%-jvm-gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5

Apache storm 风暴光环不起作用

我是Apache Storm的新手,目前正在从事一个使用Storm的项目。在试图了解风暴的基本知识时,我遇到了nimbus和监督员。我开始设置一个远程集群。我编辑了storm.yaml文件,并将nimbus和zookeeper设置为localhost。我试着在我的本地机器上运行我的动物管理员nimbus。我用“风暴光环”启动了光环,但光环并没有启动,而我的动物园管理员正在积极运行。我有我得到的截图 有人能帮我整理一下吗。您必须从storm安装目录的bin目录运行start命令 导航到storm安

Apache storm Flink和Storm的主要区别是什么?

在我看来,这是一个错误的比较,因为它将窗口事件处理系统与微批处理进行了比较;同样,把弗林克和桑扎相比对我来说也没有多大意义。在这两种情况下,它将实时事件处理策略与批处理事件处理策略进行了比较,即使在Samza的情况下“规模”较小。但我想知道Flink和Storm的比较,Storm在概念上似乎更相似 我发现(幻灯片4)将主要区别记录为Flink的“可调延迟”。另一个暗示似乎是,弗林克的一篇文章指出,弗林克更好地集成到Spark或HadoopMR世界中,但没有提及或引用任何实际细节。最后,Fabia

Apache storm 工作日志中出现连接被拒绝错误-apache storm

我在worker日志中看到了下面的错误,几乎每毫秒都会发生一次,但是集群运行良好,我想知道这些错误是什么意思,以及为什么会发生这种情况 这发生在所有工作节点上 2016-05-12T15:32:53.514-0500 b.s.m.n.Client[错误]尝试3到Netty-Client-xxxxx.hq.abc.com/xx.xx.xxx.xx:6700失败:java.net.ConnectException:连接被拒绝:xxxxx.hq.abc.com/xx.xx.xxx:6700 过了一段时

Apache storm 未确认的元组会发生什么情况?

假设我有一个ApacheStorm拓扑处理一些元组。我确认了其中大部分,但有时由于错误,它们未被处理,因此未被确认 这些“丢失的”元组会发生什么?Storm是否会自动让它们失败,还是每次都要明确地让它们失败?来自Storm的文档: 通过显式地使元组失败,可以比等待元组超时更快地重放喷动元组。(=默认情况下为30秒) 处理的每个元组都必须确认或失败。Storm使用内存跟踪每个元组,因此如果您不确认/失败每个元组,任务最终将耗尽内存。来自Storm的文档: 通过显式地使元组失败,可以比等待元组超

Apache storm 清除storm拓扑后的资源清理

我们有一个与MariaDB数据库交互的storm拓扑。我们的螺栓实现了IRichBolt接口并覆盖了生命周期方法。我们在prepare方法中打开一个db连接,然后在cleanup方法中关闭它。 cleanup方法文档说明: 在IBolt即将关闭时调用。无法保证将调用cleanup,因为主管会在集群上杀死-9的工作进程。 保证调用cleanup的一个上下文是在本地模式下运行Storm时终止拓扑 并且kill-9命令在不清理任何资源的情况下终止进程。因此,我们得出这样的结论:在终止拓扑时,不必调用c

Apache storm 不带ZeroMQ/JZMQ的Apache Storm安装

我正在尝试设置一个多集群风暴系统。我在这方面找到了一些第三方逐步指南。它们都有Java、Python、ZeroMQ 2.1.7和JZMQ作为Nimbus和Supervisor/Slave节点的需求。但是在ApacheStorm官方网站上,Nimbus和Supervisor节点的唯一要求是Java 6和Python 2.6.6() 有人知道Storm群集配置是否需要ZeroMQ和JZMQ吗?安装这两个软件有什么好处吗?从Storm 0.9.0及以后,不再需要0MQ,您可以使用Netty,但需要对其

Apache storm 如何将拓扑提交到指定的storm worker节点?

假设我有一个由三台服务器组成的风暴集群,分别命名为server1、server2、server3 Server1作为主节点运行,server2和server3作为工作节点运行 当我将拓扑提交到Server1时,它总是将拓扑分发到Server2上运行 但是服务器2有问题(新提交的拓扑可以运行,但不能真正工作,我不知道为什么),所以我想更改拓扑运行的服务器 这是我的问题: 如何将拓扑提交到指定的工作服务器?我想您可能会混淆工作服务器和管理服务器。监控器在群集中的每个节点上运行,并在启动Storm群集

Apache storm heron拓扑在停用后继续运行

我目前正在Heron&ApacheStorm上进行一些资源管理和调度研究 我注意到,在向Heron提交拓扑之后,它们开始运行并占用资源,但在停用它们之后,它们似乎仍在后台运行,占用了100%的CPU和RAM!我错过什么了吗?根据我的理解,停用拓扑应该会阻止它们并阻止它们处理新的元组 停用拓扑。一旦停用,拓扑将停止处理,但仍在群集中运行 但是当我在停用后检查heron ui时,它仍然在处理新的元组,因为emit计数一直在变化!但当我杀了他们,一切都恢复正常!这正常吗?如果没有,问题出在哪里?您可以

Apache storm 测量风暴螺栓的潜伏期

我试图测量拓扑中每个螺栓的延迟。Storm给出的延迟数不够,因为我们需要计算百分位数。在我当前的设置中,我通过测量完成execute方法(包括调用emit)所需的时间来测量bolt的延迟。上述方法的假设是,收集器的emit将立即返回,而不调用next bolt instances execute方法,即使拓扑中的当前bolt实例和下一个bolt实例共享相同的执行器。将计时器置于execute方法的开头和结尾(在emit之后)您应该没事。这是否意味着emit方法是异步的?不一定。Emit可能会将该

Apache storm 喷口过早地确认,甚至失败的螺栓元组

我使用的是Python Storm库streamparse(它在下面利用了pystorm)。我在样板wordcount项目中调用Spoutsfail()方法时遇到问题。根据我读到的大量信息,在螺栓中调用fail(tuple)应该会导致原始喷口出现故障。然而,即使我做了一些修改,当喷口离开喷口时,我总是得到一个正确的喷口ack()。这是正确的行为,还是需要更改设置/实例变量 我在streamparse 3.4.0和storm 1.0.2上 我的日志显示喷口ack()在螺栓记录之前 7609 [Th

Apache storm 如何通过编程插入消息来测试Storm拓扑的功能

我们的ApacheStorm拓扑使用KafkaSpout监听来自Kafka的消息,并在执行大量映射/减少/丰富/聚合等操作后,最终将数据插入Cassandra。还有另一个kafka输入,在这里我们接收用户对数据的查询,如果topology找到响应,它会将其发送到第三个kafka主题。现在,我们想使用Junit编写E2E测试,在该测试中,我们可以直接以编程方式将数据插入拓扑,然后通过插入用户查询消息,我们可以在第三点断言在查询中收到的响应是正确的 为了实现这一点,我们考虑启动EmbeddedKaf

Apache storm Storm DRPCTopology是否有内置队列?

我正在尝试设置一个storm拓扑,以从社交网络获取更新,处理它们并写入后端。我考虑获取数据并使用卡夫卡队列,让卡夫卡从队列中读取数据。但在阅读有关DRPCTopology的文章时,看起来我只需要将数据发送到DRPC服务器,然后它就可以处理到spouts的转发。DRPC服务器是否内置了队列?那么对于我的用例,我可以用它代替卡夫卡喷口吗 问:DRPC服务器是否内置了队列 是的,storm附带的使用内部ConcurrentLinkedQueue 问:那么对于我的用例,我可以用它代替卡夫卡喷口吗 只有当

Apache storm Storm拓扑未开始处理

我正在启动一个Storm v1.0.1群集,其中包含1个nimbus和4个supervisor节点。我有两个zookeeper节点。当我尝试启动一个示例拓扑时,它应该是从Kafka使用的。然而,在提交拓扑图后检查nimbus和supervisor日志时,我发现工人没有启动 暴风雪 storm.zookeeper.servers: - "storage14" - "storage16" nimbus.host: "storage01" nimbus.seeds : ["stora

Apache storm 克鲁约在暴风雨中

我需要通过ApacheStorm(部署在远程集群中)序列化复杂对象(opencv:Mat)。有人能给我推荐一个好的自定义kryo序列化教程,或者提出一个解决方案吗? 提前谢谢 我已经创建了一个bean public class DataBean{ Mat imageMatrix; int id; public DataBean(){ } public DataBean(int id, Mat matrix) { setId(id);

Apache storm 喷嘴故障,螺栓无故障

请在下面找到风暴拓扑的统计信息 相关信息: spout1将所有元组发送到bolt1 bolt1执行额外的tick元组(这就是为什么它与从spout1发出的元组数不匹配) 以下是我的问题: 喷口中有1059个故障,而一个下游螺栓中只有3个故障 从spout1发出的元组数与bolt1返回的元组数不匹配(我已经检查了代码,每个进入bolt1的元组都会确认或失败) 有人能帮我理解这里可能出了什么问题吗。我最初的猜测是: topology.max.spout.pending设置为20000。这可能

Apache storm Apache storm Spoot的发射速度快于Bolt计算,导致ConcurrentModificationException

这是我的情况。我有一个卡夫卡喷口,喷口每秒发出一个元组。螺栓将连接到Rserve,需要大约5秒钟来计算结果,然后发出一个元组。 但是螺栓总是得到一致的修改例外,然后工人就死了 public class LagBolt extends BaseRichBolt { OutputCollector _collector; public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputColl

  1    2   3   4   5   6  ... 下一页 最后一页 共 14 页