月度归档:2014年04月

ActiveMQ简介

来源:互联网

1. ActiveMQ简介

ActiveMQ Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

主要特点:

1. 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP

2. 完全支持JMS1.1J2EE 1.4规范 (持久化,XA消息,事务)

3. Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性

4. 通过了常见J2EE服务器( Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上

5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA

6. 支持通过JDBCjournal提供高速的消息持久化

7. 从设计上保证了高性能的集群,客户端-服务器,点对点

8. 支持Ajax

9. 支持与Axis的整合

10. 可以很容易得调用内嵌JMS provider,进行测试

2. JMS介绍

jmsJava消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息 ,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

JMSJava Messaging Service)是Java平台上有关面向消息中间件的技术规范 ,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发 ,翻译为Java消息服务。

 JMS有以下元素组成

JMS提供者

连接面向消息中间件的,JMS接口的一个实现。提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器。

 JMS客户

 生产或消费消息的基于Java的应用程序或对象。

 JMS生产者

  创建并发送消息的JMS客户。

 JMS消费者

 接收消息的JMS客户

 JMS消息

 包括可以在JMS客户之间传递的数据的对象

 JMS队列

 一个容纳那些被发送的等待阅读的消息的区域。队列暗示,这些消息将按照顺序发送。一旦一个消息被阅读,该消息将被从队列中移走。

 JMS主题

 一种支持发送消息给多个订阅者的机制

3. JMS模型

Java消息服务应用程序结构支持两种模型:即点对点或队列模型,发布者/订阅者模型。

在点对点或队列模型 下,一个生产者向一个特定的队列发布消息,一个消费者从该队列中读取消息。这里,生产者知道消费者的队列,并直接将消息发送到消费者的队列。这种模式被概括为:只有一个消费者将获得消息。生产者不需要在接收者消费该消息期间处于运行状态 ,接收者也同样不需要在消息发送时处于运行状态。每一个成功处理的消息都由接收者签收。

发布者/订阅者模型 支持向一个特定的消息主题发布消息。0或多个订阅者可能对接收来自特定消息主题的消息感兴趣。在这种模型下,发布者和订阅者彼此不知道对方。这种模式好比是匿名公告板。这种模式被概括为:多个消费者可以获得消息 .在发布者和订阅者之间存在时间依赖性。发布者需要建立一个订阅(subscription),以便客户能够购订阅。订阅者必须保持持续的活动状态以接收消息,除非订阅者建立了持久的订阅。在那种情况下,在订阅者未连接时发布的消息将在订阅者重新连接时重新发布。

JMS现在有两种传递消息的方式。标记为NON_PERSISTENT 的消息最多投递一次,而标记为PERSISTENT的消息将使用暂存后再转送的机理投递。如果一个JMS服务离线,那么持久性消息不会丢失但是得等到这个服务恢复联机时才会被传递。所以默认的消息传递方式是非持久性的。即使使用非持久性消息可能降低内务和需要的存储器,并且 这种传递方式只有当你不需要接收所有的消息时才使用

虽然JMS规范并不需要JMS供应商实现消息的优先级路线,但是它需要递送加快的消息优先于普通级别的消息。JMS定义了从09的优先级路线级别,0是最低的优先级而9则是最高的。更特殊的是04是正常优先级的变化幅度,而59是加快的优先级的变化幅度。举例来说: topicPublisher.publish (message, DeliveryMode.PERSISTENT, 8, 10000); //Pub-Sub queueSender.send(message,DeliveryMode.PERSISTENT, 8, 10000);//P2P 这个代码片断,有两种消息模型,映射递送方式是持久的,优先级为加快型,生存周期是10000 (以毫秒度量 )。如果生存周期设置为零,这则消息将永远不会过期。当消息需要时间限制否则将使其无效时,设置生存周期是有用的。

JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。

  · StreamMessage -- Java原始值的数据流

  · MapMessage--一套名称-值对

  · TextMessage--一个字符串对象

  · ObjectMessage--一个序列化的 Java对象

  · BytesMessage--一个未解释字节的数据流

JMS应用程序接口

ConnectionFactory 接口(连接工厂)

用户用来创建到JMS提供者的连接的被管对象。JMS客户通过可移植的接口访问连接,这样当下层的实现改变时,代码不需要进行修改。 管理员在JNDI名字空间中配置连接工厂,这样,JMS客户才能够查找到它们。根据消息类型的不同,用户将使用队列连接工厂,或者主题连接工厂。

Connection 接口(连接)

连接代表了应用程序和消息服务器之间的通信链路。在获得了连接工厂后,就可以创建一个与 JMS提供者的连接。根据不同的连接类型,连接允许用户创建会话,以发送和接收队列和主题到目标。

Destination 接口(目标)

目标是一个包装了消息目标标识符的被管对象,消息目标是指消息发布和接收的地点,或者是队列,或者是主题。 JMS管理员创建这些对象,然后用户通过JNDI发现它们。和连接工厂一样,管理员可以创建两种类型的目标,点对点模型的队列,以及发布者/订阅者模型的主题。

MessageConsumer 接口(消息消费者)

由会话创建的对象,用于接收发送到目标的消息。消费者可以同步地(阻塞模式),或异步(非阻塞)接收队列和主题类型的消息。

MessageProducer 接口(消息生产者)

由会话创建的对象,用于发送消息到目标。用户可以创建某个目标的发送者,也可以创建一个通用的发送者,在发送消息时指定目标。

Message 接口(消息)

是在消费者和生产者之间传送的对象,也就是说从一个应用程序创送到另一个应用程序。一个消息有三个主要部分:

消息头(必须):包含用于识别和为消息寻找路由的操作设置。

一组消息属性(可选):包含额外的属性,支持其他提供者和用户的兼容。可以创建定制的字段和过滤器(消息选择器)。

一个消息体(可选):允许用户创建五种类型的消息(文本消息,映射消息,字节消息,流消息和对象消息)。

消息接口非常灵活,并提供了许多方式来定制消息的内容。

Session 接口(会话)

表示一个单线程的上下文,用于发送和接收消息。由于会话是单线程的,所以消息是连续的,就是说消息是按照发送的顺序一个一个接收的。会话的好处是它支持事务。如果用户选择了事务支持,会话上下文将保存一组消息,直到事务被提交才发送这些消息。在提交事务之前,用户可以使用回滚操作取消这些消息。一个会话允许用户创建消息生产者来发送消息,创建消息消费者来接收消息。

4. JMS提供者实现

要使用Java消息服务,你必须要有一个JMS提供者,管理会话和队列。现在既有开源的提供者也有专有的提供者。

  开源的提供者包括:

  Apache ActiveMQ

  JBoss 社区所研发的 HornetQ

  Joram

  CoridanMantaRay

  The OpenJMS GroupOpenJMS

  专有的提供者包括:

  BEABEA WebLogic Server JMS

  TIBCO SoftwareEMS

  GigaSpaces TechnologiesGigaSpaces

  Softwired 2006iBus

  IONA TechnologiesIONA JMS

  SeeBeyondIQManager20058月被Sun Microsystems并购)

  webMethodsJMS+ -

  my-channelsNirvana

  Sonic SoftwareSonicMQ

  SwiftMQSwiftMQ

  IBMWebSphere MQ

5. ActiveMQ例子

Java 里有 JMS 的多个实现。其中 apache 下的 ActiveMQ 就是不错的选择。

ActiveMQ 最好还是了解下 JMS

JMS 公共

点对点域

发布 /订阅域

ConnectionFactory

QueueConnectionFactory

TopicConnectionFactory

Connection

QueueConnection

TopicConnection

Destination

Queue

Topic

Session

QueueSession

TopicSession

MessageProducer

QueueSender

TopicPublisher

MessageConsumer

QueueReceiver

TopicSubscriber

JMS 定义了两种方式:Quere(点对点);Topic(发布/订阅)。

ConnectionFactory 是连接工厂,负责创建Connection

Connection 负责创建 Session

Session 创建 MessageProducer(用来发消息) 和 MessageConsumer(用来接收消息)。

Destination 是消息的目的地。

Jms 发送 代码

public static void main(String[] args) throws Exception {

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();

Connection connection = connectionFactory.createConnection();

connection.start();

Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);

Destination destination = session.createQueue("my-queue");

MessageProducer producer = session.createProducer(destination);

for(int i=0; i<3; i++) {

MapMessage message = session.createMapMessage();

message.setLong("count", new Date().getTime());

Thread.sleep(1000);

//通过消息生产者发出消息

producer.send(message);

}

session.commit();

session.close();

connection.close();

}

Jms 接收代码:

public static void main(String[] args) throws Exception {

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();

Connection connection = connectionFactory.createConnection();

connection.start();

final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);

Destination destination = session.createQueue("my-queue");

MessageConsumer consumer = session.createConsumer(destination);

/*//listener 方式

consumer.setMessageListener(new MessageListener() {

public void onMessage(Message msg) {

MapMessage message = (MapMessage) msg;

//TODO something....

System.out.println(" 收到消息:" + new Date(message.getLong("count")));

session.commit();

}

});

Thread.sleep(30000);

*/

int i=0;

while(i<3) {

i++;

MapMessage message = (MapMessage) consumer.receive();

session.commit();

//TODO something....

System.out.println("收到消 息:" + new Date(message.getLong("count")));

}

session.close();

connection.close();

}

启动 JmsReceiver JmsSender 可以在看输出三条时间信息。当然 Jms 还指定有其它格式的数据,如 TextMessage

结合 Spring JmsTemplate 方便用

xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<!-- 在非 web / ejb 容器中使用 pool 时,要手动 stopspring 不会为 你执行 destroy-method 的方法

<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">

<property name="connectionFactory">

<bean class="org.apache.activemq.ActiveMQConnectionFactory">

<property name="brokerURL" value="tcp://localhost:61616" />

</bean>

</property>

</bean>

-->

<bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">

<property name="brokerURL" value="tcp://localhost:61616" />

</bean>

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">

<property name="connectionFactory" ref="jmsFactory" />

<property name="defaultDestination" ref="destination" />

<property name="messageConverter">

<bean class="org.springframework.jms.support.converter.SimpleMessageConverter" />

</property>

</bean>

<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">

<constructor-arg index="0" value="my-queue" />

</bean>

</beans>

sender

public static void main(String[] args) {

ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:app*.xml");

JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("jmsTemplate");

jmsTemplate.send(new MessageCreator() {

public Message createMessage(Session session) throws JMSException {

MapMessage mm = session.createMapMessage();

mm.setLong("count", new Date().getTime());

return mm;

}

});

}

receiver

public static void main(String[] args) {

ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:app*.xml");

JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("jmsTemplate");

while(true) {

Map<String, Object> mm = (Map<String, Object>) jmsTemplate.receiveAndConvert();

System.out.println("收到消 息:" + new Date((Long)mm.get("count")));

}

}

注意:直接用 Jms 接口时接收了消息后要提交一下,否则下次启动接收者时还可以收到旧数据。有了 JmsTemplate 就不用自己提交 session.commit() 了。如果使用了 PooledConnectionFactory 要把 apache-activemq-5.3.0\lib\optional\activemq-pool-5.3.0.jar 加到 classpath

6. ActiveMQ入门

启动ActiveMQ

activemq start命令启动ActiveMQ服务器。

在浏览器输入http://localhost:8061/ 并点击回车,可以看到如下界面:

总体页面浏览

点击,会看到如下界面:

点击

点击

ActiveMQ管理界面

队列管理

话题管理

订阅者管理

连接管理

发送JMS消息

Twitter利用Storm系统处理实时大数据

来源:互联网

Hadoop(大数据分析领域无可争辩的王者)专注于批处理。这种模型对许多情形(比如为网页建立索引)已经足够,但还存在其他一些使用模型,它们需要来自高度动态的来源的实时信息。为了解决这个问题,就得借助 Nathan Marz 推出的 Storm(现在在 Twitter 中称为 BackType)。Storm 不处理静态数据,但它处理预计会连续的流数据。考虑到 Twitter 用户每天生成 1.4 亿条推文 (tweet),那么就很容易看到此技术的巨大用途。

但 Storm 不只是一个传统的大数据分析系统:它是复杂事件处理 (CEP) 系统的一个示例。CEP 系统通常分类为计算和面向检测,其中每个系统都可通过用户定义的算法在 Storm 中实现。举例而言,CEP 可用于识别事件洪流中有意义的事件,然后实时地处理这些事件。

Nathan Marz 提供了在 Twitter 中使用 Storm 的大量示例。一个最有趣的示例是生成趋势信息。Twitter 从海量的推文中提取所浮现的趋势,并在本地和国家级别维护它们。这意味着当一个案例开始浮现时,Twitter 的趋势主题算法就会实时识别该主题。这种实时算法在 Storm 中实现为 Twitter 数据的一种连续分析。

Storm 与传统的大数据

Storm 与其他大数据解决方案的不同之处在于它的处理方式。Hadoop 在本质上是一个批处理系统。数据被引入 Hadoop 文件系统 (HDFS) 并分发到各个节点进行处理。当处理完成时,结果数据返回到 HDFS 供始发者使用。Storm 支持创建拓扑结构来转换没有终点的数据流。不同于 Hadoop 作业,这些转换从不停止,它们会持续处理到达的数据。

大数据实现

Hadoop 的核心是使用 Java? 语言编写的,但支持使用各种语言编写的数据分析应用程序。最新的应用程序的实现采用了更加深奥的路线,以充分利用现代语言和它们的特性。例如,位于伯克利的加利福尼亚大学 (UC) 的 Spark 是使用 Scala 语言实现的,而 Twitter Storm 是使用 Clojure(发音同 closure)语言实现的。

Clojure 是 Lisp 语言的一种现代方言。类似于 Lisp,Clojure 支持一种功能性编程风格,但 Clojure 还引入了一些特性来简化多线程编程(一种对创建 Storm 很有用的特性)。Clojure 是一种基于虚拟机 (VM) 的语言,在 Java 虚拟机上运行。但是,尽管 Storm 是使用 Clojure 语言开发的,您仍然可以在 Storm 中使用几乎任何语言编写应用程序。所需的只是一个连接到 Storm 的架构的适配器。已存在针对 Scala、JRuby、Perl 和 PHP 的适配器,但是还有支持流式传输到 Storm 拓扑结构中的结构化查询语言适配器。

Storm 的关键属性

Storm 实现的一些特征决定了它的性能和可靠性的。Storm 使用 ZeroMQ 传送消息,这就消除了中间的排队过程,使得消息能够直接在任务自身之间流动。在消息的背后,是一种用于序列化和反序列化 Storm 的原语类型的自动化且高效的机制。

Storm 的一个最有趣的地方是它注重容错和管理。Storm 实现了有保障的消息处理,所以每个元组都会通过该拓扑结构进行全面处理;如果发现一个元组还未处理,它会自动从喷嘴处重放。Storm 还实现了任务级的故障检测,在一个任务发生故障时,消息会自动重新分配以快速重新开始处理。Storm 包含比 Hadoop 更智能的处理管理,流程会由监管员来进行管理,以确保资源得到充分使用。

Storm 模型

Storm 实现了一种数据流模型,其中数据持续地流经一个转换实体网络(参见 图 1)。一个数据流的抽象称为一个流,这是一个无限的元组序列。元组就像一种使用一些附加的序列化代码来表示标准数据类型(比如整数、浮点和字节数组)或用户定义类型的结构。每个流由一个惟一 ID 定义,这个 ID 可用于构建数据源和接收器 (sink) 的拓扑结构。流起源于喷嘴,喷嘴将数据从外部来源流入 Storm 拓扑结构中。

图 1. 一个普通的 Storm 拓扑结构的概念性架构

接收器(或提供转换的实体)称为螺栓。螺栓实现了一个流上的单一转换和一个 Storm 拓扑结构中的所有处理。螺栓既可实现 MapReduce 之类的传统功能,也可实现更复杂的操作(单步功能),比如过滤、聚合或与数据库等外部实体通信。典型的 Storm 拓扑结构会实现多个转换,因此需要多个具有独立元组流的螺栓。喷嘴和螺栓都实现为 Linux? 系统中的一个或多个任务。

可使用 Storm 为词频轻松地实现 MapReduce 功能。如 图 2 中所示,喷嘴生成文本数据流,螺栓实现 Map 功能(令牌化一个流的各个单词)。来自 "map" 螺栓的流然后流入一个实现 Reduce 功能的螺栓中(以将单词聚合到总数中)。

图 2. MapReduce 功能的简单 Storm 拓扑结构

请注意,螺栓可将数据传输到多个螺栓,也可接受来自多个来源的数据。Storm 拥有流分组 的概念,流分组实现了混排 (shuffling)(随机但均等地将元组分发到螺栓)或字段分组(根据流的字段进行流分区)。还存在其他流分组,包括生成者使用自己的内部逻辑路由元组的能力。

但是,Storm 架构中一个最有趣的特性是有保障的消息处理。Storm 可保证一个喷嘴发射出的每个元组都会处理;如果它在超时时间内没有处理,Storm 会从该喷嘴重放该元组。此功能需要一些聪明的技巧来在拓扑结构中跟踪元素,也是 Storm 的重要的附加价值之一。

除了支持可靠的消息传送外,Storm 还使用 ZeroMQ 最大化消息传送性能(删除中间排队,实现消息在任务间的直接传送)。ZeroMQ 合并了拥塞检测并调整了它的通信,以优化可用的带宽。

Storm 示例演示

现在让我们通过实现一个简单的 MapReduce 拓扑结构的代码(参见 清单 1),看一下 Storm 示例。这个示例使用了来自 Nathan 的 Storm 入门工具包(可从 GitHub 获取)(参见 参考资料 获取链接)的巧妙设计的字数示例。此示例演示了 图 2 中所示的拓扑结构,它实现了一个包含一个螺栓的 map 转换和包含一个螺栓的 reduce 转换。

清单 1. 为图 2 中的 Storm 构建一个拓扑结构

1. TopologyBuilder builder = new TopologyBuilder();

2. builder.setSpout("spout", new RandomSentenceSpout(), 5);

3. builder.setBolt("map", new SplitSentence(), 4)

4. .shuffleGrouping("spout");

5. builder.setBolt("reduce", new WordCount(), 8)

6. .fieldsGrouping("map", new Fields("word"));

7. Config conf = new Config();

8. conf.setDebug(true);

9. LocalCluster cluster = new LocalCluster();

10. cluster.submitTopology("word-count", conf, builder.createTopology());

11. Thread.sleep(10000);

12. cluster.shutdown();

清单 1(添加了行号以供引用)首先使用 TopologyBuilder 声明一个新拓扑结构。接下来在第 3 行,定义了一个喷嘴(名为 spout),该喷嘴包含一个 RandomSentenceSpout。RandomSentenceSpout 类(也就是 nextTuple 方法)发出 5 个随机句子的其中一个作为它的数据。setSpout 方法末尾的 5 参数是一个并行性提示(或要为此活动创建的任务数)。

在第 5 和 6 行。我定义了第一个螺栓(或算法转换实体),在本例中为 map(或 split)螺栓。这个螺栓使用 SplitSentence 令牌化输入流并将其作为输出的各个单词发出。请注意,第 6 行使用了 shuffleGrouping,它定义了对此螺栓(在本例中为 "spout")的输入订阅,还将流分组定义为混排。这种混排分组意味着来自喷嘴的输入将混排 或随机分发给此螺栓中的任务(该螺栓已提示具有 4 任务并行性)。

在第 8 和 9 行,我定义了最后一个螺栓,这个螺栓实际上用于 reduce 元素,使用该元素的输入作为 map 螺栓。WordCount 方法实现了必要的字数统计行为(将相似的单词分组到一起,以维护总数),但不是混排的,所以它的输出是一致的。如果有多个任务在实现 reduce 行为,那么您最终会得到分段的计数,而不是总数。

第 11 和 12 行创建和定义了一个配置对象并启用了 Debug 模式。Config 类包含大量配置可能性(参见 参考资料,获取有关 Storm 类树的更多信息的链接)。

第 14 和 15 行创建了本地集群(在本例中,用于定义本地模式的用途)。我定义了我的本地集群、配置对象和拓扑结构的名称(可通过 builder 类的 createTopology 元素获取)。

最后,在第 17 行,Storm 休眠一段时间,然后在第 19 行关闭集群。请记住,Storm 是一个持续运行的操作系统,所以任务可存在相当长时间,不断处理它们订阅的流上的新元组。

您可在 Storm 入门工具包中了解这个非常简单的实现的更多信息,包括喷嘴和螺栓的细节。

使用 Storm

Nathan Marz 编写了一组简单易懂的文档,详细介绍了如何安装 Storm 来执行集群模式和本地模式的操作。本地模式无需一个庞大的节点集群,即可使用 Storm。如果需要在一个集群中使用 Storm 但缺乏节点,也可在 Amazon Elastic Compute Cloud (EC2) 中实现一个 Storm 集群。请参见 参考资料 获取每个 Storm 模式(本地、集群和 Amazon EC2)的参考信息。

其他开源的大数据解决方案

自 Google 在 2004 年推出 MapReduce 范式以来,已诞生了多个使用原始 MapReduce 范式(或拥有该范式的质量)的解决方案。Google 对 MapReduce 的最初应用是建立万维网的索引。尽管此应用程序仍然很流行,但这个简单模型解决的问题也正在增多。

表 1 提供了一个可用开源大数据解决方案的列表,包括传统的批处理和流式处理应用程序。在将 Storm 引入开源之前将近一年的时间里,Yahoo! 的 S4 分布式流计算平台已向 Apache 开源。S4 于 2010 年 10 月发布,它提供了一个高性能计算 (HPC) 平台,向应用程序开发人员隐藏了并行处理的复杂性。S4 实现了一个可扩展的、分散化的集群架构,并纳入了部分容错功能。

表 1. 开源大数据解决方案

更多信息

尽管 Hadoop 仍然是宣传最多的大数据分析解决方案,但仍可能存在许多其他的解决方案,每种解决方案都具有不同的特征。我在过去的文章中探讨了 Spark,它纳入了数据集的内存中处理功能(能够重新构建丢失的数据)。但 Hadoop 和 Spark 都专注于大数据集的批处理。Storm 提供了一个新的大数据分析模型,而且因为它最近被开源,所以也引起广泛的关注。

与 Hadoop 不同,Storm 是一个计算系统,它没有包括任何存储概念。这就使得 Storm 能够用在各种各样的上下文中,无论数据是从一个非传统来源动态传入,还是存储在数据库等存储系统中(或者由一个控制器用于对其他一些设备(比如一个交易系统)进行实时操作)都是如此。

请参见 参考资料 获取有关 Storm 的更多信息的链接,了解如何让一个集群正常运行,以及其他大数据分析解决方案(包括批处理和流式处理)。

参考资料

· 复杂事件处理 是 Storm 以及其他许多解决方案(比如 Yahoo! 的 S4)实现的模式。Storm 与 S4 之间的一个重要区别在于,Storm 在面对故障时提供了有保障的消息处理,而 S4 可能丢失消息。

· Nathan Marz(Storm 背后的重要开发人员)为他的新产品编写了多篇有趣且实用的介绍文章。对 Storm 的最早介绍来自 2011 年 5 月的 Storm 预览:能够实时处理的 Hadoop - BackType Technology,随后是 8 月推出的 A Storm is coming: more details and plans for release

· Storm 维基 提供了有关 Storm、它的理论基础的大量优秀文档,以及有关获取 Storm 和设置新项目的各种教程。您还将找到一些有关 Storm 的许多方面的实用文档,包括 Storm 在本地模式、集群模式和在 Amazon 上的使用。

· Spark,一种快速数据分析替代方案(M. Tim Jones,developerWorks,2011 年 11 月)介绍了 UC Berkeley 的内存中弹性数据分析平台。

· 应用程序虚拟化的过去与未来(M. Tim Jones,developerWorks,2011 年 5 月)详细介绍了虚拟化在语言抽象方面的使用。Storm 使用基于虚拟机的语言 Clojure 来实现,还使用 Java 技术和许多其他语言来构建它的内部(螺栓)应用程序。

· GitHub 上提供了 Storm 的一个 thorough class tree exists,详细介绍了 Storm 的类和接口。

· Hadoop 已开始解决简单批处理以外的模型。例如,通过调度,Hadoop 可调整其处理数据的方式,以便更多地关注交互性,而不是批量数据处理。在 Hadoop 中的调度(M. Tim Jones,developerWorks,2011 年 12 月)中了解有关 Hadoop 调度的更多信息。

本文由http://www.focustar.net 整理分享

zookeeper概要介绍

来源:互联网

Zookeeper是Hadoop下的一个子项目,主要用来在分布式环境下提供分布式锁、配置管理、名字服务、群组服务。它具有很高的可用性、稳定 性、可靠性。它在分布式应用中像一把瑞士军刀,很多地方都用得着,像我们的DMS系统中就用它来提供分布式锁服务和动态配置服务。

Zookeeper就像google在云技术领域提供的四大金刚之chubby(分布式锁服务),采用了简化的praxos算法来确保 zookeeper集群节点的数据一致性。Zookeeper可以部署为standalone模式或quorum模式。Standalone模式就是只有 单个Zookeeper server提供服务,优点是部署简单,缺点是有单点故障,不能提供高负载,可靠性无法保证,一旦server当机,将不能提供服务,这种模式主要使用在 测试环境中,生产环境不建议采用这种模式。Quorum模式则正好相反,只要Quorum的成员有一半以上处于正常状态,就能对外提供服务,具有高可用 性,Quorum成员可以共同分担业务请求的负载。没有单点故障。下图是zookeeper的架构图。

zookeeper提供的简单接口:

Zookeeper查询命令

Zookeeper查询命令主要用来查询服务器端的数据,不会更改服务器端的数据。所有的查询命令都可以即刻从client连接的server立即返回,不需要leader进行协调,因此查询命令得到的数据有可能是过期数据。但由于任何数据的修改,leader都会将更改的结果发布给所有的Follower,因此一般说来,Follower的数据是可以得到及时的更新。这些查询命令包括以下这些命令:

1. exists:判断指定path的node是否存在,如果存在则返回true,否则返回false.

2. getData:从指定path获取该node的数据

3. getACL:获取指定path的ACL。

4. getChildren:获取指定path的node的所有孩子结点。

所有的查询命令都可以指定watcher,通过它来跟踪指定path的数据变化。一旦指定的数据发生变化(create,delete,modified,children_changed),服务器将会发送命令来回调注册的watcher. Watcher详细的讲解将在Zookeeper的Watcher中单独讲解。

Zookeeper修改命令

Zookeeper修改命令主要是用来修改节点数据或结构,或者权限信息。任何修改命令都需要提交到leader进行协调,协调完成后才返回。修改命令主要包括:

1. createSession:请求server创建一个session

2. create:创建一个节点

3. delete:删除一个节点

4. setData:修改一个节点的数据

5. setACL:修改一个节点的ACL

6. closeSession:请求server关闭session

任何修改命令都需要leader协调。 在leader的协调过程中,需要3次leader与Follower之间的来回请求响应。并且在此过程中还会涉及事务日志的记录,更糟糕的情况是还有take snapshot的操作。因此此过程可能比较耗时。但Zookeeper的通信中最大特点是异步的,如果请求是连续不断的,Zookeeper的处理是集中处理逻辑,然后批量发送,批量的大小也是有控制的。如果请求量不大,则即刻发送。这样当负载很大时也能保证很大的吞吐量,时效性也在一定程度上进行了保证。

配置与安装

Zookeeper代码依赖简单,仅仅依赖于log4j。部署也非常简单,只需要在官网(http://hadoop.apache.org/zookeeper/)上下载包,解压到安装目录,修改配置文件,拷贝一份zoo-sample.cfg将其修改如下:

Config代码

1 #snapShot存放路径

2 dataDir=data

3 #transaction log 存放路径

4 dataLogDir=dataLog

5 #接收客户端请求的server端口,默认为

6 clientPort=2181

7 #代表1 tickTime多少毫秒,默认为2000毫秒

8 tickTime=2000

9 #初始化leader的时间,如果超过initLimit时间还没有收到大多数Follower的newLeader响应,则重新与各follower连接。

10 initLimit=5

11 #follower与leader之间的超时时间

12 syncLimit=5

13 #0:LeaderElection;1:AuthFastLeaderElection 非授权模式 2:AuthFastLeaderElection 授权模式 3:FastLeaderElection

14 electionAlg=0

15 #允许同一个client向server提交了请求,但还未返回的最大请求数

16 maxClientCnxns=100

17 #server.servrId=host:port:port

18 server.1=localhost:2881:3881

19 server.2=localhost:2882:3882

20 server.3=localhost:2883:3883

21 server.4=localhost:2884:3884

22 server.5=localhost:2885:3885

23

24 #group与weight跟大多数同意的策略相关,大多数同意策略为让所有组有超过一半权重的server已经确认过,则可以通过,

25 #如果没有指定server的权重,则默认为1,group中一定要包含所有的server,遗漏或多余都不行,当然可以不配,如果不配

26 #则weight也不需要配置

27 #group.groupId=serverId1:serverId2:serverId3:serverIdn

28 group.1=1:3:5

29 group.2=2:4

30

31 #weight.serverId=长整型数

32 weight.1=2

33 weight.2=3

34 weight.5=4

以上是集群环境下3.2.2版本的服务器端配置文件。在集群环境下每个server需要一个标识server编号的标识文件,这个标识文件需要放在data目录下,比如dataDir目录是/home/joe/zookeeper/data,则这个文件应该在data目录下,文件内容非常简单,就是一个数字编号,对应配置文件中指定的server.number,这个编号不能搞错,他们是通过这个编号来标识不同server的。配置文件准备就绪后,切换到zookeeper的安装目录/bin,你会看到一些zk*.sh. 比如zkCleanup.sh zkCli.sh zkEnv.sh zkServer.sh。可以检查一下shell脚本来搞清该脚本的用途。zkServer.sh就是用来启动zookeeper server的。zkClearnup.sh是用来清除哪些不再使用的日志文件和snapshot文件。启动脚本zkServer.sh start。正常情况就可以看到以下信息,代表你的集群环境配置好了。恭喜你,让我们一起zookeeper使用里程吧。

参考文章:

从0开始学编程(14) – Php数据相关操作

做为一个网站可以显示静态内容,例如简单的新闻,简单的一些介绍等, 但是在当前web2.0以及web3.0时代, web的交互性大大提高,我们若是仅仅显示一点静止的,不变化的内容是不可以想象的。

想象一下, 若是微博、论坛是静止的不能发言,怎能存在。各种社区是静止的,也是不可能的。

静止的网站是不太现实的, 好的网站是动态。 动态指的是什么?动态是指网站的内容是随着时间、随着用户发言、各种不同情况变化而变化。

但是无论如何变化, 在某个时刻, 都要记录用户发布的, 提交的数据,然后在一定时候讲这些数据显示给必要的、需要看的人,这样来完成一个动态的网站。

既然上面网站是动态, 动态的就有了数据, 那么数据存放在哪里?

数据存放在数据库中。。。。

前面我们介绍了一些数据库相关的东西, 那里面介绍的仅仅是概要列举了一些数据的例子。数据库简介

本文将从使用php的角度介绍php中访问数据库的方法,相关资源如下:

http://pan.baidu.com/s/1hqBTg4c m983

一. Php中操作mysql的参考资料

a) PHP MySQL 简介

http://www.w3school.com.cn/php/php_mysql_intro.asp

内容摘要如下:

MySQL 是一种数据库。数据库定义了存储信息的结构。

在数据库中,存在着一些表。类似 HTML 表格,数据库表含有行、列以及单元。

在分类存储信息时,数据库非常有用。一个公司的数据库可能拥有这些表:"Employees", "Products", "Customers" 以及 "Orders"。

数据库表

数据库通常包含一个或多个表。每个表都一个名称(比如 "Customers" 或 "Orders")。每个表包含带有数据的记录(行)。

下面是一个名为 "Persons" 的表的例子:

LastName

FirstName

Address

City

Hansen

Ola

Timoteivn 10

Sandnes

Svendson

Tove

Borgvn 23

Sandnes

Pettersen

Kari

Storgt 20

Stavanger

上面的表含有三个记录(每个记录是一个人)和四个列(LastName, FirstName, Address 以及 City)。

查询

查询是一种询问或请求。

通过 MySQL,我们可以向数据库查询具体的信息,并得到返回的记录集。

请看下面的查询:

SELECT LastName FROM Persons

上面的查询选取了 Persons 表中 LastName 列的所有数据,并返回类似这样的记录集:

LastName

Hansen

Svendson

Pettersen

b) PHP MySQL 连接数据库

http://www.w3school.com.cn/php/php_mysql_connect.asp

内容摘要如下:

免费的 MySQL 数据库通常是通过 PHP 来使用的。

连接到一个 MySQL 数据库

在您能够访问并处理数据库中的数据之前,您必须创建到达数据库的连接。

在 PHP 中,这个任务通过 mysql_connect() 函数完成。

语法

mysql_connect(servername,username,password);

参数

描述

servername

可选。规定要连接的服务器。默认是 "localhost:3306"。

username

可选。规定登录所使用的用户名。默认值是拥有服务器进程的用户的名称。

password

可选。规定登录所用的密码。默认是 ""。

注释:虽然还存在其他的参数,但上面列出了最重要的参数。请访问 W3School 提供的 PHP MySQL 参考手册,获得更多的细节信息。

例子

在下面的例子中,我们在一个变量中 ($con) 存放了在脚本中供稍后使用的连接。如果连接失败,将执行 "die" 部分:

<?php

$con = mysql_connect("localhost","peter","abc123");

if (!$con)

{

die('Could not connect: ' . mysql_error());

}

// some code

?>

关闭连接

脚本一结束,就会关闭连接。如需提前关闭连接,请使用 mysql_close() 函数。

c) PHP MySQL 创建数据库和表

http://www.w3school.com.cn/php/php_mysql_create.asp

数据库存有一个或多个表。

创建数据库

CREATE DATABASE 语句用于在 MySQL 中创建数据库。

语法

CREATE DATABASE database_name

为了让 PHP 执行上面的语句,我们必须使用 mysql_query() 函数。此函数用于向 MySQL 连接发送查询或命令。

例子

在下面的例子中,我们创建了一个名为 "my_db" 的数据库:

<?php

$con = mysql_connect("localhost","peter","abc123");

if (!$con)

{

die('Could not connect: ' . mysql_error());

}

if (mysql_query("CREATE DATABASE my_db",$con))

{

echo "Database created";

}

else

{

echo "Error creating database: " . mysql_error();

}

mysql_close($con);

?>

创建表

CREATE TABLE 用于在 MySQL 中创建数据库表。

更多内容参考:

http://www.w3school.com.cn/php/php_mysql_insert.asp

http://www.w3school.com.cn/php/php_mysql_select.asp

二. 通过php开发环境来开发并调试访问mysql程序

为了方便大家学习并调试php程序, 专门创建了一个vmware虚拟机的基于eclipse的php调试环境, 大家可以参照前面的部分下载相关资源。

本文依然参照那个系统进行, 相关视频在前面连接中。

大家需要打开虚拟机环境, 然后参照视频进行相关操作就可以了。

另外,用到相关sql语句及命令如下:

cd c:\xampp\mysql\bin

C:\xampp\mysql\bin>mysql.exe -h localhost -u root -p

show databases;

use my_db;

show tables;

desc persons;

select * from persons;

 

相关文章

从0开始学编程(22)-android开发环境搭建与入门教程

从0开始学编程(21)-Java网络编程入门

从0开始学编程(20)-Java线程入门

从0开始学编程(19)–java流概念入门

从0开始学编程(18)–java快速入门

从0开始学编程(17)–面向对象思想了解

从0开始学编程(16)–数据库加强

从0开始学编程(15)–总结篇-php编程强化巩固

从0开始学编程(14) – Php数据相关操作

从0开始学编程(13) Php获取form表单数据

从0开始学编程(12) 使用 eclipse的 php插件单步调试php程序

从0开始学编程(11) 使用 eclipse的 php插件 调试php程序

从0开始学编程(10) 用例子学习bootstrap的布局

从0开始学编程(9) – css、html和js简便工具

从0开始学编程(8) – 数据库简介

从0开始学编程(7) – 常用网站介绍

从0开始学编程(6)–在多了解一下php都涉及些啥东西

从0开始学编程(5)–方便的php编辑工具notepad++

从0开始学编程(4)–html基础入门

从0开始学编程(3)–学习必备的基础技能

从0开始学编程(2)–学习的方法和目标

从0开始学编程(1)–xampp配置php学习环境

 

8个必看的Bootstrap的WordPress框架

Boostrap越来越流行,主题开发者们开始尝试使用它来开发wordpress主题。这也使得bootstrap的wordpress框架用起来更加 便利。这些starter kit或者框架提供了一些基础代码和资源使得开发bootstrap wordpress主题更加容 ...

  Boostrap越来越流行,主题开发者们开始尝试使用它来开发wordpress主题。这也使得bootstrap的wordpress框架用起来 更加便利。这些starter kit或者框架提供了一些基础代码和资源使得开发bootstrap wordpress主题更加容易。你可以更快的使用这些框架进行开发,而不用先开发一个bootstrap主题,再把它变成转成wordpress主题。 这些你也可以做到,但需要更多的时间,特别是当你不熟悉转化过程的时候。

  如果你想更快的开发bootstrap wordpress主题,试试下面这些框架:

1 BoilerStrap

  Boilerstrap是一个WordPress的twenty twelve模板,其中已经包括了Boostrap。这减少了将bootstrap引入到WordPress的时间。唯一的缺点是其默认的CSS是twenty twelve的。所以,如果你想使用像twenty thirteen子主题等UI设计的话,你可能需要做一些额外工作。

2 WP-Bootstrap

  WP-bootstrap是一个在Bootstrap 2基础上建立的免费WordPress主题。目前已经有基于它的像页面模板以及Shortcodes、主页走马等很酷的东西。值得下载试一下。

3 Roots

  Roots最吸引人的地方是它清理了很多wordpress相关的东西,这样你可以花更多的时间来写代码而不是处理WordPress的设置。这个 bootstrap的WordPress框架基于HTML5 boilerplate,且包括bootstrap。当然你也可以移除bootstrap用其他CSS框架代替。

4 Skematik

  Skematik是一个强大的WP主题,它是一个名符其实的bootstrap wordpress框架,正如在它的关于部分中所陈述的:"Skematik是为开发者而生的"。Skematik是被开发用来扩展框架本身已经集成的许 多bootstrap Shortcodes。唯一的缺点是它不免费,这也是为什么现在没给出它链接的原因。

5 Bootstrap 3 WordPress主题框架

  一个很好的wordpress模板,只需要上传到你的wordpress主题文件夹你就可以开始自定制啦。所有Shortcodes和模板设计已经包含在框架中,定制变得更简单了。

6 Bootstart

  Bootstart是一个Gabfire开发的框架,其目的是为其特性主题的发布提供支持。这就是bootstrap wordpress框架的强大的地方。它有许多迎合刚需的模板和shortcodes,能够很大地提高你的开发效率。

7 Alienship

  Alienship可能对一些人来说有些陌生,但它是bootstrap wordpress开发的试金石。其最新版本已经使用了bootstrap 3,所以这个框架是非常时髦。想了解其功能列表的话点击上面的链接阅读更多内容。

8 Strappress

  starter主题已经集成在了所有的bootstrap 3 shortcodes中,所有使用bootstrap编码会更快。其中还包含一些模板以及11种不同颜色的主题。