Samza使用入门
来源:互联网 发布:js判断上传文件的类型 编辑:程序博客网 时间:2024/04/30 16:44
Samza使用入门
本文基于Samza-0.10
Samza及相关环境
Samza依赖于kafka、zookeeper、Hadoop。运行samza之前需要先配置好相关环境。
如果对他们不熟悉的话也不要害怕,Hello Samza中集成了这三者,对于新手及其友好。本文依据于此进行介绍的。但熟悉之后强烈建议自己配置相关环境,管理相关环境的版本。
本文针对已经完整执行Hello Samza
提供的所有例子后,想自己编写代码并运行的情况。
Samza运行
Samza运行前首先要将kafka、zookeeper、Yarn(分布式运行时)启动。
运行代码为:
samza/bin/run-job.sh \--config-factory=org.apache.samza.config.factories.PropertiesConfigFactory \--config-path=file://$PWD/samza/config/config.properties
运行时需要配置好config.properties
。
Samza Job配置文件
一个简单的运行配置文件为:
#Job#指定运行环境,本地测试使用ThreadJobFactory或ProcessJobFactory#job.factory.class=org.apache.samza.job.yarn.YarnJobFactoryjob.factory.class=org.apache.samza.job.local.ThreadJobFactoryjob.name=CountLatancy#YARN#本地运行时可以省略yarn.package.path=file://{tmp}/filename.tar.gz#Task#主类名,包名.主类名task.class=samza.CountLatancy#使用kafka作为输入流时,字段含义为kafka.topictask.inputs=kafka.clickevent#windowable job 必须配置,单位为mstask.window.ms=60000#Serializers#定义序列化与反序列化类serializers.registry.json.class=org.apache.samza.serializers.JsonSerdeFactoryserializers.registry.string.class=org.apache.samza.serializers.StringSerdeFactoryserializers.registry.integer.class=org.apache.samza.serializers.IntegerSerdeFactory# Kafka Systemsystems.kafka.samza.factory=org.apache.samza.system.kafka.KafkaSystemFactory#输入流的键值序列化时使用哪一个序列化类。systems.kafka.samza.key.serde=stringsystems.kafka.samza.msg.serde=stringsystems.kafka.consumer.zookeeper.connect=localhost:2181systems.kafka.producer.bootstrap.servers=localhost:9092# Job Coordinatorjob.coordinator.system=kafka# Normally, this would be 3, but we have only one broker.job.coordinator.replication.factor=1
Samza Demo代码
package samza;import java.util.HashMap;import java.util.Map;import java.util.Map.Entry;import org.apache.samza.config.Config;import org.apache.samza.system.IncomingMessageEnvelope;import org.apache.samza.system.OutgoingMessageEnvelope;import org.apache.samza.system.SystemStream;import org.apache.samza.task.InitableTask;import org.apache.samza.task.MessageCollector;import org.apache.samza.task.StreamTask;import org.apache.samza.task.TaskContext;import org.apache.samza.task.TaskCoordinator;import org.apache.samza.task.WindowableTask;import org.json.JSONObject;public class CountLatancy implements StreamTask,WindowableTask,InitableTask{ Map<String,Integer> clickEvent = new HashMap<String,Integer>(); Map<String,Integer> clickCount = new HashMap<String,Integer>(); int total = 0; private static String TOPIC_NAME = "pageviews"; private static SystemStream stream = new SystemStream("kafka",TOPIC_NAME); public void window(MessageCollector collector, TaskCoordinator coodinator) throws Exception { //int total = 0; for(Entry<String,Integer> entry:clickEvent.entrySet()){ String name = entry.getKey(); int latancy = entry.getValue(); int count = clickCount.get(name); String json = "{\"name\" : \""+name+"\""+ ",\"total_latancyMs\" : "+latancy+ ",\"clickNum\" : "+count+ ",\"aver_lantancyMs\" : "+(latancy+0.0)/count+ "}"; total+=count; collector.send(new OutgoingMessageEnvelope (stream,json)); } collector.send(new OutgoingMessageEnvelope (stream,"Total messages per window : "+total+" .")); clickEvent = new HashMap<String,Integer>(); clickCount = new HashMap<String,Integer>(); } public void process(IncomingMessageEnvelope envelope, MessageCollector collector, TaskCoordinator coodinator) throws Exception { JSONObject json = new JSONObject(envelope.getMessage().toString()); String name = json.getString("name"); int latancy = json.getInt("latancyMs"); if(clickEvent.containsKey(json.get("name").toString())){ clickEvent.put(name, clickEvent.get(name)+latancy); clickCount.put(name, clickCount.get(name)+1); }else{ clickEvent.put(name,latancy); clickCount.put(name,1); } } public void init(Config config, TaskContext task) throws Exception { System.out.println("----------------------------------------------------------------"); System.out.println(config.toString()); System.out.println("----------------------------------------------------------------"); }}
代码是统计一下固定时间段内,每个人点击总点击次数和总时延。输入流demo为:
{"timestamp":"2015-09-01T01:35:19Z","url":"/foo","user":"bob","latencyMs":66}
Samza文件夹结构
在运行Samza程序之前,首先要了解一下Samza文件夹的组织结构。
Samza主文件夹下存在三个重要文件夹,bin、lib、config.
bin文件夹下存放各种启动代码(run-job.sh等)。
lib文件夹下存放以jar包形式存放的Samza运行环境,包括需要执行的Samza Job类。
config文件夹下存放各种Samza运行配置文件(test.properties)。
代码放在哪
代码需要使用maven工具进行打包,打包成jar包(不需要将运行环境打包进去)。放置于samza/lib/
下。
如果本地运行,准备工作就结束了,可以直接运行了。
如果是Yarn job,就需要将打包后的jar包放置于samza/lib/
文件夹下后,将samza/*
压缩为一个gz文件。这个压缩文件就是配置文件中的第9行中我们指定的那个运行包。
YARN job 运行流程
cd {src_home}mvn clean packagecp target/target.jar {samza_home}/lib/cd {samza_home}tar -zcvf filename.tar.gz *mv filename.tar.gz {tmp}/{samza_home}/bin/run-job.sh \--config-factory=org.apache.samza.config.factories.PropertiesConfigFactory \--config-path=file://{samza_home}/config/config.properties
0 0
- Samza使用入门
- Samza/Kafka机理解析
- hello samza不容易
- Samza如何划分Partition
- What is Samza?
- Samza状态管理分析
- Samza与Strom
- samza系统的分布式部署
- samza系统的配置解析
- Samza--基于hadoop的流处理引擎
- 快速理解SAMZA, streaming on kafka
- Storm翻版:开源实时数据处理系统Samza
- 快速理解SAMZA流处理框架
- Kafka and Samza: Real-time stream processing
- Hello Samza编译出错的解决办法
- 【Apache Samza 系列】实时流数据处理框架Samza中文教程 (一)-- 介绍
- 【Apache Samza 系列】实时流数据处理框架Samza中文教程 (二)-- 背景
- 【Apache Samza 系列】实时流数据处理框架Samza中文教程 (三)-- 概念
- 实现文字的渐变效果
- 限制UITextField输入长度
- JQuery中bind和unbind函数
- 用Mysql创建设备管理信息系统数据库(图解)
- 解决ie6下position:absolute不兼容问题
- Samza使用入门
- 富爸爸 年轻退休
- 【js】Ajax提交form表单(ajaxSubmit使用讲解 )
- 函数调用中堆栈
- OC中创建字符串的几种方法及Xcode7.3中其存储内存地址的异同
- Xcode各版本官方下载
- android as2.0 播放器源码 支持 4.2+ 系统
- jsp(2)
- ajaxFileUpload 异步上传文件简单使用