1 摘要
Flume 是一个分布式的日志收集系统,它可以将应用服务器产生的日志、消息中间件 (比如 kafka) 的消息等其他数 据串联起来发送到指定的存储以供数据分析使用。EMR 是腾讯云提供的托管 Hadoop 服务,相比自建 hadoop 集群 EMR 提供了完善的集群管理、服务监控、安全管理、以及存储分离等特性,区别于自建 EMR 在计算存储分离方便 做了大量优化工作以降低在使用 Hadoop 相关服务时候的成本,本文核心介绍如何使用 Flume、EMR、对象存储
(COS)来构建低成本数据仓库应用, 总体应用架构图如下:
如果上图所示,需要分析的数据可能来自如下几个地方:
1. 应用服务产生的日志 2. kafka 等消息中间件 3. 其他数据源比如 http,或者网络服务器
flume 在接受到这些数据之后可以根据您的需要选择输出目的目的地,本篇文章主要介绍三种类型的存储
• HDFS 常规的分布式文件系统 • COS 对象存储 • CFS 文件存储
如果您对成本非常敏感,建议您设置输出目的地为 COS,本文也会着重介绍如何将基于 COS 的 Sink 设置。
2 安装 Flume
2.1 下载 Flume 您可以使用如下命令来获取 Flume,本文以 1.7.0 为例
代码语言:javascript复制 git clone -b release-1.7.0 https://github.com/apache/flume.git
2.2 编译安装 Flume 使用如下命令编译 Flume,因为 EMR 的 hadoop 是 2.7.3,因此在编译的时候需要指定基于 hadoop2 进行编译。
代码语言:shell复制 mvn package -Dmaven.javadoc.skip=true -DskipTests -Dtar -Dhadoop2.version=2.7.3 -Phadoop-2
编译成功后将 flume-ng-dist/target/apache-flume-1.7.0-bin.tar.gz 解压到安装目录
2.3 兼容性处理
进入到 flume 的目录后执行如下命令
代码语言:javascript复制rm -rf ./lib/httpclient-4.2.1.jar
rm -rf ./lib/httpcore-4.1.3.jar
删除这两个 jar 的原因是会和 hadoop 中的 httpclient 库冲突,当然您也可以删除前备份这两个 jar
3 配置 Flume
3.1 拷贝 Hadoop 登录任意一台 EMR 集群节点,将 hadoop 拷贝到 Flume 所在的服务器
代码语言:shell复制#JDK路径,EMR使用的JDK强制在该路径下
ls -al /usr/local/jdk/
#在Flume节点执行如下命令
mkdir -p /data/emr/hdfs/logs
mkdir -p /data/emr/hdfs/tmp
#hadoop 在EMR所在路径为
ls -al /usr/local/service/hadoop
拷贝过来后务必确认以下要点: • JDK 路径和 EMR 节点保持完全一致 • 创建/data/emr/hdfs/logs 和/data/emr/hdfs/tmp 目录 • hadoop 路径务必和 EMR 节点路径一致在/usr/local/service/hadoop
3.2 确认 COS 配置项 在 hadoop 相关软件拷贝成功后,确认 hadoop 中的 cos 配置文件中存在以下配置,具体路径为:/usr/local/service/hadoop/etc/hadoop/core-site.xml
代码语言:html复制 <property>
<name>fs.cos.userinfo.secretId</name>
<value>秘钥</value>
</property>
<property>
<name>fs.cos.userinfo.appid</name>
<value>账户ID</value>
</property>
<property>
<name>fs.cos.userinfo.secretKey</name>
<value>秘钥key</value>
</property>
<property>
<name>fs.cosn.block.size</name>
<value>1048576</value>
</property>
<property>
<name>fs.cosn.impl</name>
<value>org.apache.hadoop.fs.cosnative.NativeCosFileSystem</value>
</property>
<property>
<name>fs.cosn.userinfo.region</name>
<value>ap-guangzhou</value>
</property>
<property>
<name>fs.cosn.local_block_size</name>
<value>2097152</value>
</property>
说明:如果在创建 EMR 集群的时候选择了 COS,那么这些配置将会自动生成,具体值项不清楚怎么获取可以提工 单或者咨询客服。
3.3 Flume 配置 在 flume 的 conf 目录下新增加测试配置,demo.conf 内容如下
代码语言:shell复制 #agent and component of agent
search.sources = so
search.sinks = si
search.channels = sc
# Configure a channel that buffers events in memory:
search.channels.sc.type = memory
search.channels.sc.capacity = 20000
search.channels.sc.transactionCapacity = 100
# Configure the source:
search.sources.so.channels = sc
search.sources.so.type = exec
search.sources.so.command = tail -F /data/logs/demo.log
# Describe the sink:
search.sinks.si.channel = sc
search.sinks.si.type = hdfs
search.sinks.si.hdfs.path = cosn://bucketname/demo
search.sinks.si.hdfs.writeFormat = Text
search.sinks.si.hdfs.fileType = DataStream
search.sinks.si.hdfs.rollSize=0
search.sinks.si.hdfs.rollCount = 10000
search.sinks.si.hdfs.batchSize=1000
search.sinks.si.rollInterval=1
更多详细配置,请参考https://flume.apache.org/FlumeUserGuide.html#hdfs-sink
4 启动服务并验证
4.1 启动 flume 的 agent 服务 进入 flume 安装目录,执行如下命令启动服务:
代码语言:shell复制bin/flume-ng agent -c conf -f ./conf/demo.conf --name demo
启动服务后观察日志是否存在异常,如果有如下异常请忽略
4.2 验证日志是否生成成功 在 flume 启动成功后,您可以使用如下命令来查看文件是否生成成功
代码语言:javascript复制 hadoop fs -ls cosn://bucket/demo
5 启动分析任务
在日志推送成功后,您可以通过如下的方式进行数据分析
• 把日志推送到 hive 表的 storageLocation 下进行 ETL
• 直接生产 ORC 格式的数据然后通过 Presto 来进行查询
• 通过 spark 或者 MR 写程序分析