实时计算:Apache Storm:ApacheStorm的高级编程技巧_第1页
实时计算:Apache Storm:ApacheStorm的高级编程技巧_第2页
实时计算:Apache Storm:ApacheStorm的高级编程技巧_第3页
实时计算:Apache Storm:ApacheStorm的高级编程技巧_第4页
实时计算:Apache Storm:ApacheStorm的高级编程技巧_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实时计算:ApacheStorm:ApacheStorm的高级编程技巧1理解ApacheStorm的核心架构1.1深入剖析Storm的拓扑结构在ApacheStorm中,拓扑(Topology)是数据流处理的基本单元,它由一组Spout和Bolt组成,通过定义数据流的路径,形成一个有向无环图(DAG)。拓扑结构的设计直接影响到数据处理的效率和准确性。1.1.1SpoutSpout是Storm拓扑中的数据源,它可以是任何可以产生数据的组件,如读取Kafka中的消息、从数据库中读取数据、或者从网络流中获取数据。Spout通过nextTuple()方法不断向拓扑中发送数据。示例代码publicclassMySpoutextendsBaseRichSpout{

privateSpoutOutputCollector_collector;

privateint_sequence;

@Override

publicvoidopen(Mapconf,TopologyContextcontext,SpoutOutputCollectorcollector){

_collector=collector;

_sequence=0;

}

@Override

publicvoidnextTuple(){

_collector.emit(newValues("Hello,Storm!"+_sequence));

_sequence++;

try{

Thread.sleep(1000);

}catch(InterruptedExceptione){

e.printStackTrace();

}

}

}在这个例子中,MySpout是一个简单的Spout,它生成一系列带有序列号的消息,并通过_collector.emit()方法将数据发送到拓扑中。1.1.2BoltBolt是Storm拓扑中的数据处理器,它接收来自Spout或其他Bolt的数据,进行处理后,可以将数据发送到另一个Bolt或输出到外部系统。Bolt通过execute()方法处理接收到的元组。示例代码publicclassMyBoltextendsBaseBasicBolt{

@Override

publicvoidexecute(Tupletuple,BasicOutputCollectorcollector){

Stringsentence=tuple.getStringByField("sentence");

String[]words=sentence.split("");

for(Stringword:words){

collector.emit(word);

}

}

}在这个例子中,MyBolt接收一个包含句子的元组,将句子分割成单词,并将每个单词作为新的元组发送出去。1.2掌握Spout和Bolt的高级用法1.2.1并行度并行度(ParallelismHint)是指在Storm拓扑中,Spout或Bolt可以并行运行的实例数量。通过调整并行度,可以优化数据处理的性能。示例代码TopologyBuilderbuilder=newTopologyBuilder();

builder.setSpout("spout",newMySpout(),5);

builder.setBolt("bolt",newMyBolt(),10).shuffleGrouping("spout");在这个例子中,MySpout的并行度设置为5,MyBolt的并行度设置为10,这意味着拓扑将有5个MySpout实例和10个MyBolt实例并行运行。1.2.2分组策略分组策略(GroupingStrategy)定义了如何将数据从一个组件(Spout或Bolt)发送到另一个组件。Storm提供了多种分组策略,如shuffleGrouping、fieldsGrouping、allGrouping等。示例代码builder.setBolt("word-count-bolt",newWordCountBolt(),10)

.fieldsGrouping("spout",newFields("word"));在这个例子中,WordCountBolt实例将根据word字段进行分组,这意味着所有包含相同单词的元组将被发送到同一个WordCountBolt实例,便于进行单词计数。1.2.3状态管理状态管理(StateManagement)是Storm高级编程中的一个重要概念,它允许Bolt保存和恢复状态,以实现更复杂的数据处理逻辑,如窗口计算、状态查询等。示例代码publicclassWordCountBoltextendsBaseRichBolt{

privatetransientMap<String,Integer>_counts;

privatetransientBoltOutputCollector_collector;

@Override

publicvoidprepare(MapstormConf,TopologyContextcontext,OutputCollectorcollector){

_collector=(BoltOutputCollector)collector;

_counts=newHashMap<>();

}

@Override

publicvoidexecute(Tupletuple){

Stringword=tuple.getStringByField("word");

Integercount=_counts.get(word);

if(count==null){

count=0;

}

_counts.put(word,count+1);

_collector.ack(tuple);

}

@Override

publicvoidcleanup(){

//在这里可以保存状态到持久化存储

}

}在这个例子中,WordCountBolt使用一个HashMap来保存每个单词的计数,实现了状态管理的基本功能。1.2.4容错机制Storm提供了强大的容错机制,包括消息确认(MessageAcknowledgement)和故障恢复(FailureRecovery)。消息确认确保每个元组都被正确处理,而故障恢复则确保在组件失败时,拓扑可以自动恢复。示例代码publicclassMyBoltextendsBaseRichBolt{

privatetransientBoltOutputCollector_collector;

@Override

publicvoidprepare(MapstormConf,TopologyContextcontext,OutputCollectorcollector){

_collector=(BoltOutputCollector)collector;

}

@Override

publicvoidexecute(Tupletuple){

try{

//处理元组的代码

_collector.ack(tuple);

}catch(Exceptione){

_collector.fail(tuple);

}

}

}在这个例子中,MyBolt通过_collector.ack(tuple)确认元组被成功处理,如果处理过程中发生异常,则通过_collector.fail(tuple)通知Storm重新处理该元组。通过深入理解ApacheStorm的核心架构,包括拓扑结构、Spout和Bolt的高级用法,可以更有效地设计和优化实时数据处理系统。2优化ApacheStorm的性能2.1配置最佳实践在ApacheStorm中,性能优化往往始于合理的配置。Storm的配置参数影响着拓扑的执行效率、资源使用和数据处理速度。以下是一些关键的配置参数和最佳实践,用于提升ApacheStorm的性能:2.1.1设置合适的并行度topology.workers:定义每个任务的worker数量。过多的worker可能导致资源浪费,过少则可能限制处理能力。topology.executors:每个spout或bolt的executor数量。executor越多,处理能力越强,但也要考虑集群资源。topology.task.threads:每个executor的线程数。通常设置为1,除非有特殊需求。//配置示例

Configconf=newConfig();

conf.setNumWorkers(3);//设置worker数量

conf.setNumAckers(2);//设置acker数量,用于确保消息被正确处理

conf.setMaxTaskParallelism(8);//设置最大任务并行度2.1.2调整内存分配topology.memory.mb:每个worker分配的内存。根据任务复杂度调整。topology.java.opts:设置JVM参数,如堆内存大小。//配置示例

conf.setTopologyMemory(1024);//分配1GB内存给每个worker

conf.setTopologyJavaOpts("-Xmx1024m");//设置JVM堆内存为1GB2.1.3优化数据序列化Storm使用序列化机制在组件间传递数据。选择合适的序列化库可以显著提升性能。//使用Kryo序列化

conf.setSerializer(KryoSerializer.class);

conf.registerDefaultKryoSerializer(Map.class,MapSerializer.class);2.2数据流和消息传递优化数据流和消息传递是Storm性能的关键。优化这些方面可以显著提升数据处理速度和效率。2.2.1使用直接消息传递直接消息传递允许Storm将消息直接从一个bolt传递到另一个bolt,而不需要通过shuffle。这减少了不必要的数据复制和序列化/反序列化操作。//直接消息传递示例

TopologyBuilderbuilder=newTopologyBuilder();

builder.setBolt("Bolt2",newMyBolt2(),4).shuffleGrouping("Bolt1");

builder.setBolt("Bolt3",newMyBolt3(),4).fieldsGrouping("Bolt1",newFields("id"));

builder.setBolt("Bolt4",newMyBolt4(),4).directGrouping("Bolt3");2.2.2减少数据流中的元组大小元组是Storm中数据传递的基本单位。减少元组的大小可以减少网络传输的开销,从而提升性能。//减少元组大小示例

publicclassMyBoltextendsBaseRichBolt{

@Override

publicvoidexecute(Tupleinput){

Stringdata=input.getStringByField("data");

//处理数据

collector.emit(newValues(data));

}

}2.2.3使用Ack机制确保数据处理Ack机制确保每个元组都被正确处理。通过合理配置Ack机制,可以避免数据丢失,同时保持良好的性能。//Ack机制示例

publicclassMyBoltextendsBaseRichBoltimplementsIStatefulComponent{

privatetransientMap<String,Boolean>processed=newHashMap<>();

@Override

publicvoidexecute(Tupleinput){

Stringid=input.getStringByField("id");

if(!processed.containsKey(id)){

//处理数据

collector.emit(newValues(id));

processed.put(id,true);

collector.ack(input);

}

}

}2.2.4避免热点确保数据均匀分布到所有executor,避免某些executor成为热点,导致性能瓶颈。//使用fieldsGrouping避免热点

TopologyBuilderbuilder=newTopologyBuilder();

builder.setBolt("Bolt2",newMyBolt2(),4).fieldsGrouping("Bolt1",newFields("id"));2.2.5使用Spout的多线程Spout可以配置为多线程模式,以提高数据读取速度。//Spout多线程示例

publicclassMySpoutextendsBaseRichSpout{

privatetransientSpoutOutputCollectorcollector;

privatetransientThreadLocal<BufferedReader>reader;

@Override

publicvoidopen(Mapconf,TopologyContextcontext,SpoutOutputCollectorcollector){

this.collector=collector;

reader=newThreadLocal<BufferedReader>(){

@Override

protectedBufferedReaderinitialValue(){

returnnewBufferedReader(newFileReader("data.txt"));

}

};

}

@Override

publicvoidnextTuple(){

BufferedReaderbr=reader.get();

Stringline=br.readLine();

if(line!=null){

collector.emit(newValues(line));

}

}

}通过以上配置和数据流优化策略,可以显著提升ApacheStorm的性能,确保实时数据处理的高效和稳定。3实现ApacheStorm的容错与恢复3.1理解容错机制在分布式计算环境中,容错机制是确保系统稳定性和数据完整性的重要组成部分。ApacheStorm,作为一款实时计算框架,提供了强大的容错机制来处理节点故障、网络中断等不可预见的事件。Storm的容错机制主要依赖于其拓扑结构的特性,包括任务(Task)、工作进程(Worker)和执行器(Executor)的管理,以及数据流的可靠传输。3.1.1任务(Task)的管理Storm将每个Spout或Bolt的操作分解为多个任务,每个任务运行在一个工作进程的执行器中。当一个任务失败时,Storm会自动重启该任务,确保数据处理的连续性。这种机制基于Storm的主从架构,其中Nimbus作为主节点,负责监控和管理集群中的所有任务,而Supervisor作为从节点,负责运行和监控工作进程。3.1.2数据流的可靠传输Storm通过提供消息确认机制来确保数据流的可靠传输。当一个Bolt处理完一条消息后,它必须显式地确认这条消息。如果Bolt在处理消息过程中失败,Storm会检测到消息未被确认,并将该消息重新发送给Bolt进行处理,从而实现数据的恢复。代码示例:消息确认机制//定义一个可靠的Bolt

publicclassReliableBoltextendsBaseBasicBolt{

privatetransientMap<String,Integer>processedMessages=newHashMap<>();

@Override

publicvoidexecute(Tupletuple,BasicOutputCollectorcollector){

Stringmessage=tuple.getStringByField("message");

intcount=processedMessages.getOrDefault(message,0)+1;

processedMessages.put(message,count);

collector.emit(newValues(message,count));

tuple.ack();//确认消息处理完成

}

}在这个例子中,ReliableBolt继承自BaseBasicBolt,并在处理完每条消息后调用tuple.ack()来确认消息。如果Bolt在处理过程中失败,Storm会检测到消息未被确认,并重新发送该消息。3.2实现数据恢复策略数据恢复策略是ApacheStorm容错机制的另一个关键方面。Storm提供了多种数据恢复策略,包括:直接模式(DirectMode):在直接模式下,Storm会将消息直接发送到指定的Bolt,而不是随机分配。这使得在Bolt失败时,Storm可以准确地知道哪些消息需要重新发送,从而提高数据恢复的效率。消息跟踪(MessageTracking):Storm可以跟踪消息的处理路径,当检测到故障时,可以回溯到消息的源头,重新发送未确认的消息。状态后端(StateBackend):Storm允许使用状态后端来持久化Bolt的状态,即使Bolt失败,也可以从最近的状态恢复,继续处理数据。3.2.1代码示例:使用状态后端//配置状态后端

Configconf=newConfig();

conf.setDebug(true);

conf.setNumWorkers(3);

conf.setStateBackend(newZookeeperStateBackend("localhost:2181"));

//定义一个状态Bolt

publicclassStatefulBoltextendsBaseBasicBolt{

privatetransientMap<String,Integer>counts=newHashMap<>();

@Override

publicvoidprepare(MapstormConf,TopologyContextcontext){

//从状态后端恢复状态

Map<String,Object>state=context.getState();

for(Map.Entry<String,Object>entry:state.entrySet()){

counts.put(entry.getKey(),(Integer)entry.getValue());

}

}

@Override

publicvoidexecute(Tupletuple,BasicOutputCollectorcollector){

Stringword=tuple.getStringByField("word");

Integercount=counts.getOrDefault(word,0);

count++;

counts.put(word,count);

collector.emit(newValues(word,count));

tuple.ack();

//将状态更新到状态后端

context.putState(word,count);

}

}在这个例子中,我们配置了Zookeeper作为状态后端,并定义了一个StatefulBolt,它在prepare方法中从状态后端恢复状态,在execute方法中更新状态,并将更新的状态保存回状态后端。这样,即使Bolt失败,也可以从最近的状态恢复,继续处理数据。3.3结论ApacheStorm的容错与恢复机制是其作为实时计算框架的核心优势之一。通过任务管理、数据流的可靠传输和数据恢复策略,Storm能够确保在分布式环境中数据处理的连续性和数据的完整性。理解和应用这些机制对于构建稳定、可靠的实时数据处理系统至关重要。4ApacheStorm的集群管理与监控4.1集群部署与管理ApacheStorm是一个分布式实时计算系统,用于处理无界数据流。在生产环境中,Storm集群的部署与管理是确保系统稳定运行的关键。集群通常由几个主要组件构成:Nimbus、Supervisor、Worker节点和Zookeeper。4.1.1NimbusNimbus是Storm集群的主节点,负责整个集群的管理和协调工作。它主要执行以下任务:任务调度:Nimbus负责将Spouts和Bolts(Storm中的数据源和处理单元)分配给集群中的Supervisor节点。配置管理:Nimbus管理集群的配置信息,包括拓扑结构、任务分配和系统参数。故障恢复:当集群中的某个节点出现故障时,Nimbus会重新调度任务,确保数据处理的连续性。4.1.2SupervisorSupervisor是Storm集群中的工作节点,负责监听Nimbus分配的任务,并在本地机器上启动和管理Worker进程。每个Supervisor节点可以运行多个Worker进程,每个Worker进程负责执行一个拓扑的一部分。Supervisor的主要职责包括:任务执行:根据Nimbus的指令,启动和管理Worker进程。资源分配:为Worker进程分配必要的资源,如CPU和内存。状态监控:监控Worker进程的运行状态,并向Nimbus报告。4.1.3WorkerWorker是Supervisor节点上运行的进程,负责执行具体的拓扑任务。每个Worker进程可以包含多个线程,每个线程负责执行一个Spout或Bolt实例。4.1.4ZookeeperZookeeper是一个分布式协调服务,用于维护集群的元数据,如Nimbus和Supervisor的列表、拓扑状态和任务分配信息。Zookeeper在Storm集群中扮演着至关重要的角色,确保了集群的高可用性和一致性。4.2使用Nimbus和Supervisor进行监控ApacheStorm提供了丰富的监控工具和API,允许用户实时监控集群的运行状态。Nimbus和Supervisor在监控中扮演着核心角色。4.2.1Nimbus监控Nimbus通过HTTP接口提供了集群的监控信息,包括:拓扑状态:可以查看每个拓扑的运行状态、任务分配和执行情况。集群资源:监控集群的资源使用情况,如CPU、内存和磁盘空间。故障信息:提供集群中故障节点和任务的详细信息。4.2.2Supervisor监控Supervisor同样通过HTTP接口提供了本地节点的监控信息,包括:Worker状态:可以查看每个Worker进程的运行状态和资源使用情况。任务执行:监控每个Spout和Bolt的执行情况,包括处理速度和失败率。日志信息:提供Worker进程的日志信息,便于故障排查。4.2.3监控示例以下是一个使用Python和Storm的PyStorm库来监控Storm集群的示例代码:#导入必要的库

fromstormimportnimbus_client

#创建Nimbus客户端

client=nimbus_client.NimbusClient.builder().set_nimbus_host('nimbus_host').set_nimbus_port(6627).build()

#获取所有拓扑信息

topologies=client.get_topologies()

#遍历每个拓扑

fortopologyintopologies:

#获取拓扑的详细信息

topology_details=client.get_topology_info(topology.id)

#打印拓扑的名称和状态

print("TopologyName:",)

print("TopologyStatus:",topology.status)

#打印每个Spout和Bolt的执行情况

forspoutintopology_details.spouts:

print("SpoutID:",spout.id)

print("SpoutExecutionCount:",spout.executors[0].stats['execute'])

forboltintopology_details.bolts:

print("BoltID:",bolt.id)

print("BoltExecutionCount:",bolt.executors[0].stats['execute'])4.2.4解释上述代码首先创建了一个Nimbus客户端,然后通过该客户端获取了集群中所有拓扑的信息。接着,遍历每个拓扑,获取其详细信息,包括拓扑的名称、状态以及每个Spout和Bolt的执行情况。这有助于理解集群的实时处理能力和潜在的瓶颈。4.2.5结论ApacheStorm的集群管理与监控是确保实时数据处理系统稳定性和性能的关键。通过合理配置Nimbus、Supervisor和Zookeeper,以及利用Storm提供的监控工具,可以有效地监控和管理Storm集群,及时发现和解决问题,提高系统的整体效率和可靠性。5实时计算:ApacheStorm与大数据生态的集成5.1与ApacheKafka的集成5.1.1原理ApacheStorm与ApacheKafka的集成是实时数据处理领域中常见的模式。Kafka作为一款高吞吐量的分布式发布订阅消息系统,可以作为Storm的数据源,提供持续的数据流。Storm则负责对这些数据进行实时处理和分析。这种集成方式充分利用了Kafka的数据持久化和Storm的实时计算能力,为大数据实时处理提供了强大的支持。5.1.2内容在ApacheStorm中,可以使用KafkaSpout来消费Kafka中的数据。KafkaSpout是一个可靠的Spout,它能够确保从Kafka中读取的数据被正确处理。如果处理过程中发生故障,数据会被重新发送,直到成功处理。示例代码importorg.apache.storm.kafka.spout.KafkaSpout;

importorg.apache.storm.kafka.spout.KafkaSpoutConfig;

importorg.apache.storm.kafka.spout.KafkaSpoutStreamType;

importorg.apache.storm.kafka.spout.KafkaSpoutTridentTupleBuilder;

importorg.apache.storm.trident.TridentState;

importorg.apache.storm.trident.TridentTopology;

importorg.apache.storm.trident.operation.builtin.Count;

importorg.apache.storm.trident.state.StateFactory;

importorg.apache.storm.trident.state.memory.MemoryMapStateFactory;

importorg.apache.storm.Config;

importorg.apache.storm.LocalCluster;

importorg.apache.storm.spout.SchemeAsMultiScheme;

importorg.apache.storm.tuple.Fields;

importorg.apache.storm.utils.Utils;

importbacktype.storm.tuple.Values;

importjava.util.Map;

publicclassKafkaStormIntegrationExample{

publicstaticvoidmain(String[]args)throwsException{

//Kafka配置

Map<String,Object>kafkaConfig=newHashMap<>();

kafkaConfig.put("bootstrap.servers","localhost:9092");

kafkaConfig.put("group.id","storm-kafka-group");

kafkaConfig.put("auto.offset.reset","earliest");

//KafkaSpout配置

KafkaSpoutConfig<String,String>spoutConfig=KafkaSpoutConfig.builder("my-topic")

.setProp(kafkaConfig)

.setKeyScheme(newSchemeAsMultiScheme(newStringScheme()))

.setValueScheme(newSchemeAsMultiScheme(newStringScheme()))

.build();

//创建KafkaSpout

KafkaSpout<String,String>kafkaSpout=newKafkaSpout<>(spoutConfig);

//创建Trident拓扑

TridentTopologytopology=newTridentTopology();

//添加KafkaSpout

topology.newStream("kafka",kafkaSpout)

.each(newFields("word"),newSplit(),newFields("word"))

.groupBy(newFields("word"))

.persistentAggregate(newMemoryMapStateFactory(),newCount(),newFields("count"));

//创建并启动本地集群

LocalClustercluster=newLocalCluster();

cluster.submitTopology("kafka-storm-integration",newConfig(),topology.build());

//等待一段时间,让拓扑运行

Thread.sleep(10000);

//关闭集群

cluster.shutdown();

}

//分割单词

publicstaticclassSplitimplementsFunction{

@Override

publicvoidexecute(TridentTupletuple,TridentCollectorcollector){

Stringsentence=tuple.getString(0);

for(Stringword:sentence.split("")){

collector.emit(newValues(word));

}

}

}

}示例描述上述代码示例展示了如何在ApacheStorm中使用KafkaSpout来消费Kafka中的数据,并使用Trident框架进行实时数据处理。具体步骤如下:配置Kafka的参数,包括服务器地址、组ID和偏移量重置策略。创建KafkaSpoutConfig,指定要消费的主题,并设置键和值的解析方案。创建KafkaSpout实例。创建TridentTopology,并添加KafkaSpout作为数据源。使用each方法对数据进行分割,将句子分割成单词。使用groupBy和persistentAggregate方法对单词进行分组和计数。启动本地集群,并提交拓扑进行运行。5.1.3与ApacheHadoop的协同工作5.1.4原理ApacheStorm与ApacheHadoop的协同工作主要体现在数据处理的前后端。Hadoop通常用于批处理和数据存储,而Storm则用于实时数据处理。通过将Storm的输出结果存储到Hadoop的HDFS或使用Hadoop的MapReduce对Storm的结果进行进一步的批处理,可以实现两者之间的协同工作。5.1.5内容在ApacheStorm中,可以使用HdfsBolt来将处理后的数据写入Hadoop的HDFS。HdfsBolt支持将数据以文本或序列化格式写入HDFS,并可以配置滚动策略,如按时间或文件大小滚动。示例代码importorg.apache.storm.Config;

importorg.apache.storm.LocalCluster;

importorg.apache.storm.topology.TopologyBuilder;

importorg.apache.storm.tuple.Fields;

importorg.apache.storm.hdfs.bolt.HdfsBolt;

importorg.apache.storm.hdfs.bolt.format.DefaultFileNameFormat;

importorg.apache.storm.hdfs.bolt.format.DefaultFormat;

importorg.apache.storm.hdfs.bolt.rotation.FileRotationPolicy;

importorg.apache.storm.hdfs.bolt.rotation.FileSizeRotationPolicy;

importorg.apache.storm.hdfs.bolt.rotation.RotationPolicy;

importorg.apache.storm.hdfs.bolt.sync.CountSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.HdfsBoltDeclarer;

importorg.apache.storm.hdfs.bolt.format.DelimiterRecordFormat;

importorg.apache.storm.hdfs.bolt.format.RecordFormat;

importorg.apache.storm.hdfs.bolt.format.SimpleRecordFormat;

importorg.apache.storm.hdfs.bolt.format.TimestampFileNameFormat;

importorg.apache.storm.hdfs.bolt.rotation.FileSizeBasedRotationPolicy;

importorg.apache.storm.hdfs.bolt.rotation.TimeBasedRotationPolicy;

importorg.apache.storm.hdfs.bolt.sync.CountSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimeSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.SyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.TimestampSyncPolicy;

importorg.apache.storm.hdfs.bolt.sync.Time

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论