Flume使用案例二

之前的案例一只算是一个小demo,在实际生产环境中是不会用Flume来做这种需求的

实时监控hive日志,并上传到HDFS中

1)拷贝Hadoop相关jar包到Flume的lib目录下(将监控日志实时上传到HDFS中,相当于持有Hadoop的API,才能操作Hadoop)

hadoop/common/lib/hadoop-auth-2.5.0-cdh5.3.6.jar
hadoop/common/lib/commons-configuration-1.6.jar
hadoop/mapreduce1/lib/hadoop-hdfs-2.5.0-cdh5.3.6.jar
hadoop/common/hadoop-common-2.5.0-cdh5.3.6.jar

将上边所属目录下的jar包拷贝到Flume的lib目录下

上边目录下的jar包是HadoopCDH5.3.6版本的,不同版本的Hadoop上边的jar包所在位置不一样,可以根据以下命令在Hadoop目录下查找

find ./ -name 'hadoop-auth*'

你会发现相同的jar包在不同的目录下都存在,这时候只需要拷贝其中一份到Flume的lib目录即可

注意:      以下的jar为1.99版本的Flume必须引用的jar

hadoop/hdfs/lib/htrace-core-3.1.0-incubating.jar
hadoop/hdfs/lib/commons-io-2.4.jar

2)编写Job的flume-hdfs.conf文件

# Name the components on this agent
a2.sources = r2
a2.sinks = k2
a2.channels = c2
# Describe/configure the source
a2.sources.r2.type = exec
a2.sources.r2.command = tail -F /tmp/root/hive.log
a2.sources.r2.shell = /bin/bash -c
# Describe the sink
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://cdh0:8020/flume/%Y%m%d/%H
#上传文件的前缀
a2.sinks.k2.hdfs.filePrefix = logs-
#是否按照时间滚动文件夹
a2.sinks.k2.hdfs.round = true
#多少时间单位创建一个新的文件夹
a2.sinks.k2.hdfs.roundValue = 1
#重新定义时间单位
a2.sinks.k2.hdfs.roundUnit = hour
#是否使用本地时间戳
a2.sinks.k2.hdfs.useLocalTimeStamp = true
#积攒多少个Event才向HDFSflush一次,这个值不能超过channels的阈值
a2.sinks.k2.hdfs.batchSize = 1000
#设置文件类型,可支持压缩(DataStream指不支持压缩)
a2.sinks.k2.hdfs.fileType = DataStream
#多久生成一个新的文件(这里最好让每个文件的大小接近127M)
a2.sinks.k2.hdfs.rollInterval = 600
#设置每个文件的滚动大小(为0则不设置此规则)
a2.sinks.k2.hdfs.rollSize = 134217700
#文件的滚动按照数据量的个数,为0则表示与Event数量无关
a2.sinks.k2.hdfs.rollCount = 0
#最小副本数,为1表示不产生副本,这里如果不这样设置的话,前面的滚动设置都不生效
a2.sinks.k2.hdfs.minBlockReplicas = 1
# Use a channel which buffers events in memory
a2.channels.c2.type = memory
a2.channels.c2.capacity = 1000
a2.channels.c2.transactionCapacity = 100
# Bind the source and sink to the channel
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2

注意:    

tail  -F

上边命令是用来查看实时文件的,默认查看最后10行数据,-F是指当查看实时文件失败的时候重新查看,-f则是指在查看失败后不重新查看,tail -F的命令表面是由Flume执行的,实际是由java中的Runtime().getXXX.exec("tail -F XXXx")执行的

3)执行

bin/flume-ng agent \
--conf conf/ \
--name a2 \
--conf-file conf/job_flume1.conf

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用Flume采集某个接口的代码,需要以下步骤: 1. 安装Flume:请按照Flume的官方文档进行安装。 2. 配置Flume:在Flume的配置文件中,指定采集源、汇聚点、输出点等信息。 3. 编写采集代码:需要使用Flume的Java API,来连接到接口并采集数据。 以下是一个示例代码: ``` import org.apache.flume.*; import org.apache.flume.conf.Configurable; import org.apache.flume.source.AbstractSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class HttpSource extends AbstractSource implements Configurable, PollableSource { private static final Logger logger = LoggerFactory.getLogger(HttpSource.class); private String urlStr; @Override public void configure(Context context) { urlStr = context.getString("url"); if (urlStr == null) { throw new ConfigurationException("HttpSource: url must be specified."); } } @Override public Status process() throws EventDeliveryException { Status result = Status.READY; HttpURLConnection conn = null; try { URL url = new URL(urlStr); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.connect(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = reader.readLine()) != null) { Event event = EventBuilder.withBody(line.getBytes()); getChannelProcessor().processEvent(event); } } catch (Exception e) { logger.error("HttpSource process error.", e); result = Status.BACKOFF; } finally { if (conn != null) { conn.disconnect(); } } return result; } @Override public long getBackOffSleepIncrement() { return 0; } @Override public long getMaxBackOff ### 回答2: 使用Flume采集某个接口的代码写法如下: 首先,需要安装和配置Flume,确保Flume的相关环境已经设置好。 1. 创建一个Flume配置文件:例如,命名为`flume_config.conf`。 2. 在配置文件中定义一个数据源,通常使用HTTP Source来获取接口数据。配置示例如下: ``` # 配置Source sourceAgent.sources = httpSource sourceAgent.sources.httpSource.type = org.apache.flume.source.http.HTTPSource sourceAgent.sources.httpSource.bind = 0.0.0.0 sourceAgent.sources.httpSource.port = <监听端口> ``` 3. 配置Sink,将获取的数据传输到相应的目标位置,这里可以选择将数据写入到文件、Kafka、HDFS等。以下是写入到文件Sink的示例配置: ``` # 配置Sink sourceAgent.sinks = fileSink sourceAgent.sinks.fileSink.type = hdfs sourceAgent.sinks.fileSink.hdfs.path = <目标文件路径> ``` 4. 配置Channel,用于在Source和Sink之间缓存接收到的数据。 ``` # 配置Channel sourceAgent.channels = memoryChannel sourceAgent.channels.memoryChannel.type = memory sourceAgent.channels.memoryChannel.capacity = <缓存容量> sourceAgent.channels.memoryChannel.transactionCapacity = <事务容量> ``` 5. 将Source和Sink以及Channel进行连接: ``` # 将Source与Sink以及Channel连接 sourceAgent.sources.httpSource.channels = memoryChannel sourceAgent.sinks.fileSink.channel = memoryChannel ``` 6. 启动Flume agent,并指定配置文件路径: ``` $ bin/flume-ng agent --conf conf --conf-file <配置文件路径> --name sourceAgent -Dflume.root.logger=INFO,console ``` 以上就是通过Flume采集某个接口的代码编写步骤。根据实际需求,需要根据具体情况调整配置文件中的参数和定义更多的Source、Sink和Channel。 ### 回答3: 使用Flume采集某个接口的代码可以按照以下步骤进行编写: 1. 引入所需的Flume依赖库,如Flume的核心库、日志库等。 2. 创建一个Flume配置文件,其中指定数据源、数据目的地和数据传输方式等配置项。 3. 在Flume配置文件中定义数据源,可以使用Flume提供的HTTP Source组件,通过监听特定端口获取接口数据。 4. 在Flume配置文件中定义数据目的地,可以是本地文件、HDFS、Kafka等存储方式,根据需求选择适合的目的地。 5. 在Flume配置文件中定义数据传输方式,可以是使用Flume提供的Sink组件,将数据传输到目的地。 6. 根据Flume配置文件的配置,编写Java代码,创建一个Flume Agent实例,并将配置文件路径作为参数传递。 7. 启动Flume Agent,它将根据配置文件的定义,采集特定接口的数据,并将其传输到指定的目的地。 8. 监控Flume Agent的采集情况和数据传输情况,根据需要进行日志记录、错误处理等操作。 需要注意以下几点: - 确保Flume依赖库正确引入,并且版本兼容。 - 需要根据具体接口的数据格式和传输要求,进行Flume配置文件的编写。可以参考Flume官方文档进行配置项的定义。 - 在编写Java代码时,应根据Flume的API文档,了解如何创建Flume Agent实例、启动Agent等操作。 - 在启动Flume Agent之前,要确保接口服务正常运行,并且Flume所监听的端口没有被其他程序占用。 以上是一个基本的框架,根据具体需求和接口特点,还可以进行配置文件的其他定制化设置,如添加过滤器、数据转换等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值