大数据之数据收集
数据收集是大数据的基础。散落在各处的数据,只有经过了数据收集,才会集中起来,提供了后续处理的可能。从大数据技术发展以来,出现了很多数据收集的技术框架,本文试图在若干流行的数据收集解决方案上加以叙述。
评估一个技术框架是否适合某个业务场景,通常需要考虑多个方面。
l 最基本的,考虑接口是否适配,收集socket数据了还是log数据,输出到哪里;
l 考虑技术框架的性能,是否满足业务的需求;
l 还需要考虑灵活性,如果需要做一些过滤或者自定义开发,是否容易;
l 考虑对性能的影响,数据收集不能影响了业务系统本身的运行,不能资源消耗太大;
l 考虑运维的难易程度,有的技术方案依赖很多,配置很复杂,就容易出错;
l 考虑技术框架是否高可靠,不会出现丢数据的情况。
相信通过上面几个方面的判断,应该可以找到合适的技术框架。
一、Flume
Flume是一种分布式,可靠且可用的服务,用于有效地收集,聚合和移动大量流事件数据。
source接口适配
Source Type |
Comments |
Avro Source |
Listens on Avro port and receives events from external Avro client streams. |
Thrift Source |
Listens on Thrift port and receives events from external Thrift client streams. |
Exec Source |
Exec source runs a given Unix command on start-up and expects that process to continuously produce data on standard out (stderr is simply discarded, unless property logStdErr is set to true). |
JMS Source |
JMS Source reads messages from a JMS destination such as a queue or topic. |
SSL and JMS Source |
MS client implementations typically support to configure SSL/TLS via some Java system properties defined by JSSE (Java Secure Socket Extension). |
Spooling Directory Source |
This source lets you ingest data by placing files to be ingested into a “spooling” directory on disk. |
Taildir Source |
Watch the specified files, and tail them in nearly real-time once detected new lines appended to the each files. |
Kafka Source |
Kafka Source is an Apache Kafka consumer that reads messages from Kafka topics. |
NetCat TCP Source |
A netcat-like source that listens on a given port and turns each line of text into an event. |
NetCat UDP Source |
As per the original Netcat (TCP) source, this source that listens on a given port and turns each line of text into an event and sent via the connected channel. Acts like nc -u -k -l [host] [port]. |
Sequence Generator Source |
A simple sequence generator that continuously generates events with a counter that starts from 0, increments by 1 and stops at totalEvents. |
Syslog Sources |
Reads syslog data and generate Flume events. |
Syslog TCP Source |
The original, tried-and-true syslog TCP source. |
Multiport Syslog TCP Source |
his is a newer, faster, multi-port capable version of the Syslog TCP source. |
Syslog UDP Source |
|
HTTP Source |
A source which accepts Flume Events by HTTP POST and GET. |
Stress Source |
StressSource is an internal load-generating source implementation which is very useful for stress tests. |
Custom Source |
A custom source is your own implementation of the Source interface. |
Scribe Source |
Scribe is another type of ingest system. To adopt existing Scribe ingest system, Flume should use ScribeSource based on Thrift with compatible transfering protocol. |
|
|
sink接口适配
Sink Type |
Comments |
HDFS Sink |
This sink writes events into the Hadoop Distributed File System (HDFS). It currently supports creating text and sequence files. It supports compression in both file types. |
Hive Sink |
This sink streams events containing delimited text or JSON data directly into a Hive table or partition. Events are written using Hive transactions. |
Logger Sink |
Logs event at INFO level. Typically useful for testing/debugging purpose. |
Avro Sink |
This sink forms one half of Flume’s tiered collection support. Flume events sent to this sink are turned into Avro events and sent to the configured hostname / port pair. |
Thrift Sink |
This sink forms one half of Flume’s tiered collection support. Flume events sent to this sink are turned into Thrift events and sent to the configured hostname / port pair. |
IRC Sink |
The IRC sink takes messages from attached channel and relays those to configured IRC destinations. |
File Roll Sink |
Stores events on the local filesystem. |
Null Sink |
Discards all events it receives from the channel. |
HBaseSink |
This sink writes data to HBase. The Hbase configuration is picked up from the first hbase-site.xml encountered in the classpath. A class implementing HbaseEventSerializer which is specified by the configuration is used to convert the events into HBase puts and/or increments. |
HBase2Sink |
HBase2Sink is the equivalent of HBaseSink for HBase version 2. |
AsyncHBaseSink |
This sink writes data to HBase using an asynchronous model. |
MorphlineSolrSink |
This sink extracts data from Flume events, transforms it, and loads it in near-real-time into Apache Solr servers, which in turn serve queries to end users or search applications. |
ElasticSearchSink |
This sink writes data to an elasticsearch cluster. By default, events will be written so that the Kibana graphical interface can display them - just as if logstash wrote them. |
Kafka Sink |
This is a Flume Sink implementation that can publish data to a Kafka topic. |
HTTP Sink |
Behaviour of this sink is that it will take events from the channel, and send those events to a remote service using an HTTP POST request. The event content is sent as the POST body. |
Custom Sink |
A custom sink is your own implementation of the Sink interface. A custom sink’s class and its dependencies must be included in the agent’s classpath when starting the Flume agent. |
由上可见,Flume支持的接口比较丰富,最常用的基于文件的日志收集source以及同步到kafka的sink。
处理能力,处理能力和机器性能和数据都有关,在考虑的时候,既需要考虑每秒多少条数据,也需要考虑每秒多少兆数据。通常,在以file作为channel的时候,Flume可以支持每秒几十兆的数据处理,以memory作为channel的时候,可以支持每秒几百兆的数据处理。
灵活性,Flume的灵活性还是不错的,在数据处理的各个环节都预留有接口,方便进行个性化开发,再加上Flume本身也是java语言开发的,就更友好一些。
消耗,Flume本身的资源消耗还是比较多的,如果对资源消耗敏感,经过参数调优之后,使用的资源能够降低不少。
维护性,Flume的依赖不多,jar包下载既可用,有人觉得配置起来比较麻烦,不过灵活性带来的就是复杂性,个人感觉还好。
可靠性,Flume的可靠性在几个方面都有体现,首先需要选择合适的channel,来保证消息处理的可靠性,其次Flume自身还待遇LB的功能。
http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html
https://blog.csdn.net/lijinqi1987/article/details/77506034
二、Logstash
Logstash本身是作为ELK的一员存在的,负责数据摄入,后来慢慢的也接入了更多的数据源和数据端。
Input接口
Input Plugin |
Description |
azure_event_hubs |
Receives events from Azure Event Hubs |
beats |
Receives events from the Elastic Beats framework |
cloudwatch |
Pulls events from the Amazon Web Services CloudWatch API |
couchdb_changes |
Streams events from CouchDB’s _changes URI |
dead_letter_queue |
read events from Logstash’s dead letter queue |
elasticsearch |
Reads query results from an Elasticsearch cluster |
exec |
Captures the output of a shell command as an event |
file |
Streams events from files |
ganglia |
Reads Ganglia packets over UDP |
gelf |
Reads GELF-format messages from Graylog2 as events |
generator |
Generates random log events for test purposes |
github |
Reads events from a GitHub webhook |
google_cloud_storage |
Extract events from files in a Google Cloud Storage bucket |
google_pubsub |
Consume events from a Google Cloud PubSub service |
graphite |
Reads metrics from the graphite tool |
heartbeat |
Generates heartbeat events for testing |
http |
Receives events over HTTP or HTTPS |
http_poller |
Decodes the output of an HTTP API into events |
imap |
Reads mail from an IMAP server |
irc |
Reads events from an IRC server |
java_generator |
Generates synthetic log events |
java_stdin |
Reads events from standard input |
jdbc |
Creates events from JDBC data |
jms |
Reads events from a Jms Broker |
jmx |
Retrieves metrics from remote Java applications over JMX |
kafka |
Reads events from a Kafka topic |
kinesis |
Receives events through an AWS Kinesis stream |
log4j |
Reads events over a TCP socket from a Log4j SocketAppender object |
lumberjack |
Receives events using the Lumberjack protocl |
meetup |
Captures the output of command line tools as an event |
pipe |
Streams events from a long-running command pipe |
puppet_facter |
Receives facts from a Puppet server |
rabbitmq |
Pulls events from a RabbitMQ exchange |
redis |
Reads events from a Redis instance |
relp |
Receives RELP events over a TCP socket |
rss |
Captures the output of command line tools as an event |
s3 |
Streams events from files in a S3 bucket |
s3_sns_sqs |
Reads logs from AWS S3 buckets using sqs |
salesforce |
Creates events based on a Salesforce SOQL query |
snmp |
Polls network devices using Simple Network Management Protocol (SNMP) |
snmptrap |
Creates events based on SNMP trap messages |
sqlite |
Creates events based on rows in an SQLite database |
sqs |
Pulls events from an Amazon Web Services Simple Queue Service queue |
stdin |
Reads events from standard input |
stomp |
Creates events received with the STOMP protocol |
syslog |
Reads syslog messages as events |
tcp |
Reads events from a TCP socket |
|
Reads events from the Twitter Streaming API |
udp |
Reads events over UDP |
unix |
Reads events over a UNIX socket |
varnishlog |
Reads from the varnish cache shared memory log |
websocket |
Reads events from a websocket |
wmi |
Creates events based on the results of a WMI query |
xmpp |
Receives events over the XMPP/Jabber protocol |
可以看到Logstash除了支持file,stdout,kafka等常规的input之外,还支持很多乱七八糟的input,这说明其作为一个ELK的数据摄入是合格的,但是否是我们需要的,则要仔细评估。
Output接口
Output Plugin |
Description |
boundary |
Sends annotations to Boundary based on Logstash events |
circonus |
Sends annotations to Circonus based on Logstash events |
cloudwatch |
Aggregates and sends metric data to AWS CloudWatch |
csv |
Writes events to disk in a delimited format |
datadog |
Sends events to DataDogHQ based on Logstash events |
datadog_metrics |
Sends metrics to DataDogHQ based on Logstash events |
elastic_app_search |
Sends events to the Elastic App Search solution |
elasticsearch |
Stores logs in Elasticsearch |
|
Sends email to a specified address when output is received |
exec |
Runs a command for a matching event |
file |
Writes events to files on disk |
ganglia |
Writes metrics to Ganglia’s gmond |
gelf |
Generates GELF formatted output for Graylog2 |
google_bigquery |
Writes events to Google BigQuery |
google_cloud_storage |
Uploads log events to Google Cloud Storage |
google_pubsub |
Uploads log events to Google Cloud Pubsub |
graphite |
Writes metrics to Graphite |
graphtastic |
Sends metric data on Windows |
http |
Sends events to a generic HTTP or HTTPS endpoint |
influxdb |
Writes metrics to InfluxDB |
irc |
Writes events to IRC |
java_sink |
Discards any events received |
java_stdout |
Prints events to the STDOUT of the shell |
juggernaut |
Pushes messages to the Juggernaut websockets server |
kafka |
Writes events to a Kafka topic |
librato |
Sends metrics, annotations, and alerts to Librato based on Logstash events |
loggly |
Ships logs to Loggly |
lumberjack |
Sends events using the lumberjack protocol |
metriccatcher |
Writes metrics to MetricCatcher |
mongodb |
Writes events to MongoDB |
nagios |
Sends passive check results to Nagios |
nagios_nsca |
Sends passive check results to Nagios using the NSCA protocol |
opentsdb |
Writes metrics to OpenTSDB |
pagerduty |
Sends notifications based on preconfigured services and escalation policies |
pipe |
Pipes events to another program’s standard input |
rabbitmq |
Pushes events to a RabbitMQ exchange |
redis |
Sends events to a Redis queue using the RPUSH command |
redmine |
Creates tickets using the Redmine API |
riak |
Writes events to the Riak distributed key/value store |
riemann |
Sends metrics to Riemann |
s3 |
Sends Logstash events to the Amazon Simple Storage Service |
sns |
Sends events to Amazon’s Simple Notification Service |
solr_http |
Stores and indexes logs in Solr |
sqs |
Pushes events to an Amazon Web Services Simple Queue Service queue |
statsd |
Sends metrics using the statsd network daemon |
stdout |
Prints events to the standard output |
stomp |
Writes events using the STOMP protocol |
syslog |
Sends events to a syslog server |
tcp |
Writes events over a TCP socket |
timber |
Sends events to the Timber.io logging service |
udp |
Sends events over UDP |
webhdfs |
Sends Logstash events to HDFS using the webhdfs REST API |
websocket |
Publishes messages to a websocket |
xmpp |
Posts events over XMPP |
zabbix |
Sends events to a Zabbix server |
与Input类似,Output首先是一大批ES自己的东西,对于Hadoop系统的支持本身比较少,但在一些NoSQL数据库方面的支持,相对多一些,比如Redis、MongoDB等。
处理能力,Logstash处理能力在每秒几千条的规模上。
灵活性,Logstash提供了强大的数据过滤和预处理能力。
消耗,Logstash对资源的要求比较高,需要比较多的内存资源。
运维,Logstash本身以JRuby写成,依赖和配置的复杂度比较高。
可靠,Logstash是单机运行,极端情况下存在丢数据的可能。
https://www.elastic.co/guide/en/logstash/current/index.html
https://doc.yonyoucloud.com/doc/logstash-best-practice-cn/index.html
三、FileBeat
FileBeat也是ES推出的数据收集的技术框架,相对于Logstash而言,支持数据处理的能力要弱一些,不过这正是其目的——轻量化,资源消耗就很低。
Input接口
Input type |
Comments |
Log |
read lines from log files. |
Stdin |
read events from standard in. |
Container |
read containers log files. |
Kafka |
read from topics in a Kafka cluster. |
Redis |
read entries from Redis slowlogs. |
UDP |
read events over UDP. |
Docker |
read logs from Docker containers. |
TCP |
read events over TCP. |
Syslog |
read events over TCP or UDP, this input will parse BSD (rfc3164) event and some variant. |
s3 |
retrieve logs from S3 objects that are pointed by messages from specific SQS queues. |
NetFlow |
read NetFlow and IPFIX exported flows and options records over UDP. |
Google Pub/Sub |
read messages from a Google Cloud Pub/Sub topic subscription. |
Azure eventhub |
read messages from an azure eventhub. |
可以看到FileBeat支持的Input种类比较少,但是常规的文件、标准输出、Kafka等都支持,另外对特定产品的支持还是有的。
Output接口
Output type |
Comments |
Elasticsearch |
sends the transactions directly to Elasticsearch by using the Elasticsearch HTTP API. |
Logstash |
sends events directly to Logstash by using the lumberjack protocol, which runs over TCP. Logstash allows for additional processing and routing of generated events. |
Kafka |
sends the events to Apache Kafka. |
Redis |
inserts the events into a Redis list or a Redis channel. |
File |
dumps the transactions into a file where each transaction is in a JSON format. |
Console |
writes events in JSON format to stdout. |
由以上组件接口可以看出,FileBeat在支持持久化方面还是比较弱的,由于本身孵化自ES,所以持久化的大部分为ES系组件,但对Kafka和Redis的支持,也能满足一定的需求。
处理能力,FileBeat的处理能力相对一般,满足基本的需求可以,类似每秒几千条数据,如果数据量再多,就需要特殊处理。
灵活性,FileBeat提供了一定的灵活性,不过GO语言本身就有门槛,不如Flume和Logstash灵活性和处理能力强。
消耗,由于以GO编写,所以正常情况下,资源消耗不多,但当遇到event的消息比较大时,在默认配置下容易出现OOM的情况。
运维,FileBeat本身是用GO写的,所以没有额外的依赖,但配置文件采用类YAML格式,可配的内容还是比较多的。
可靠,没看到FileBeat本身对数据传输过程本身防丢失采取的策略,所以极端情况下,存在丢数据的可能。
https://www.elastic.co/guide/en/beats/filebeat/current/index.html