解决方案:streamset hive到mysql_如何使用StreamSets实时采集K

优采云 发布时间: 2022-10-20 21:17

  解决方案:streamset hive到mysql_如何使用StreamSets实时采集K

  1. 文档目的

  内容概述

  1. 测试环境准备

  2. 配置流集

  3. 创建点线并进行测试

  4. 总结

  测试环境

  1.红帽7.3

  2.CM 和 CDH 版本是 cdh5.13.3

  3.卡夫卡2.2.0(0.10.0)

  4.流集3.3.0

  前提 条件

  1. 集群已启用哨兵

  2. 测试环境准备

  1. 为测试准备 JSON 数据

  {

  “学校”:1,

  “地址”:2,

  “否”:“页面”,

  “类”:3,

  “学生”:[{

  “名称”:“第 1 页”,

  “老师”:“拉里”,

  “年龄”:40

  },{

  “名称”:“第2页”,

  “老师”:“拉里”,

  “年龄”:50

  },{

  “名称”:“第3页”,

  “老师”:“拉里”,

  “年龄”:51

  }]

  }

  (向左和向右滑动)。

  2. 授权 SDC 用户

  由于集群已启用 Sentry,因此需要在此处对 sdc 用户进行授权,否则 sdc 用户无法创建表并将数据写入 Hive 数据库

  3. 为流集创建点画线

  1. 登录到流集并创建kafka2hive_json点画线

  

  2. 添加卡夫卡消费者作为源,并在点子线流程中配置卡夫卡基本信息

  配置与 Kafka 相关的信息,如经纪人、ZK、组、主题和 Kerberos 信息

  配置数据格式化方法,写入 Kafka 的数据采用 JSON 格式,因此请在此处选择 JSON 格式

  3. 增加脚本赋值器模块,主要用于处理嵌套的 JSON 数据

  编写 JSON 数据解析代码,将嵌套的 JSON 解析为多个记录,并将其传输到蜂巢元数据

  解析脚本如下:

  对于(可变 = 0; i

  尝试{

  学生=记录[i].值['学生'];

  日志错误(“---------++++++++------”+学生长度);

  对于(varj=0; j

  (“============”+学生[0].姓名]

  varnewRecord=sdcFunctions.createRecord(true);

  varstudentMap=sdcFunctions.createMap(true);

  学生地图 no=记录 [i].value ['no'];

  学生地图学校=记录[i].值['学校'];

  学生地图.class=记录[i].值['类'];

  学生地图地址=记录[i].值['地址'];

  学生地图名称=学生姓名;

  学生地图教师=学生[j].教师;

  学生地图年龄=学生年龄;;

  新记录值=学生地图;

  (“-------------”+新记录值['学校'])

  输出写入(新记录);

  }

  }捕获(e){

  //Sendrecordtoerror

  错误写入(记录[i],e);

  }

  }

  (向左和向右滑动)。

  4. 添加 Hive 元数据中间处理模块,并选择相应的 CDH 版本

  配置蜂巢的 JDBC 信息

  配置 Hive 的表信息,并指定表名和数据库名称

  指定数据格式,指定 Avro,在

  

  选项,但在后处理中不支持拼花格式

  5. 增加Hadoop FS处理模块,主要用于将蜂巢元数据写入HDFS

  配置 Hadoop FS,配置 HDFS 网址并启用 Kerberos 身份验证

  为 Hadoop FS 配置输出文件

  注意:选中“标头中的目录”会导致 HDFS 使用该目录

  在上一步写入数据时由 Hive 元数据模块传递,“空闲超时”主要用于指定 Hadoop FS 模块空闲多长时间以将数据刷新到 HDFS 数据目录。

  配置“延迟记录”参数并使用默认参数

  指定写入 HDFS 的数据的格式

  6. 将主要用于创建表的 Hive 元存储模块添加到 Hive 库中

  配置配置单元信息和 JDBC 访问 URL

  配置单元元存储的高级配置

  7. 点击验证流程,如下图所示,流程正常

  到目前为止,卡夫卡数据到Hive的流程配置已经完成。

  4. 工艺测试验证

  1. 启动kafka2hive_json的点线,成功启动如下图所示

  2. 使用 Kafka 的制作人脚本生成消息以kafka_hive_topic

  卡夫卡-控制台-制作人\

  --topickafka_hive_topic\

  :9092,:9092,:9092

  (向左和向右滑动)。

  3. 检查流集中kafka2hive_json的管道操作

  4. 使用 SDC 用户登录 Hue 以查看ods_user表数据

  将嵌套的 JSON 数据解析为 3 条数据,并将其插入到ods_user表中。

  5. 总结

  1. 使用流集的 Kafka 消费者模块访问 Kafka 的嵌套 JSON 数据后,您无法直接将数据存储到 Hive 中,您需要解析嵌套的 JSON 数据,您可以使用此处的赋值器模块,流集支持多种评估器语言(例如:JavaScprit、Jython、Groovy、表达式和 Spark)。

  2. 由于集群中启用了 Sentry,因此默认情况下 StreamSet 使用 sdc 用户访问蜂巢,当您要在 Hive 数据库中创建表时,您需要对 sdc 用户进行授权,否则将报告权限异常。

  3. 在配置 Hive 的 JDBC 时,我们需要在 JDBC URL 之后指定用户和密码,否则会报告匿名用户没有访问权限的问题,请注意您必须携带密码。

  4. 高清帧模块是

  接收到HiveMetadata模块的数据后生成为临时文件,数据不会立即写入HDFS,并且可以通过“空闲超时”参数控制将数据刷新到HDFS的频率。

  经验:容器日志管理的最佳实践

  摘要:本文以Docker为例,结合阿里云日志服务团队在日志领域多年积累的丰富经验,介绍容器日志处理的通用方法和最佳实践。

  背景

  自2013年dotCloud开源Docker以来,以Docker为代表的容器产品以隔离性好、可移植性高、资源占用少、启动快等特点迅速风靡全球。下图显示了 2013 年以来 Docker 和 OpenStack 的搜索趋势。

  容器技术在部署、交付等环节给人们带来了很多便利,但在日志处理领域也带来了很多新的挑战,包括:

  如果日志保存在容器内,在容器销毁时会被删除。由于容器的生命周期与虚拟机相比大大缩短,创建和销毁都是正常的,所以需要一种持久化日志的方式;

  进入容器时代后,需要管理的目标对象远多于虚拟机或物理机。登录目标容器排查问题会变得更加复杂和不经济;

  容器的出现让微服务更容易实现,引入更多组件的同时也给我们的系统带来了松耦合。因此,我们需要一种既能帮助我们全局了解系统运行情况,又能快速定位问题现场、还原上下文的技术。

  日志处理流程

  本文以Docker为例,介绍容器日志处理的一般方法和最佳实践,包括:

  容器日志实时采集;

  查询分析和可视化;

  日志上下文分析;

  LiveTail - 云上的 tail -f。

  容器实时日志采集

  容器日志分类

  采集Logs 首先,我们需要找出日志存在的位置。这里以两个常见的容器 Nginx 和 Tomcat 为例进行分析。

  Nginx 生成的日志包括 access.log 和 error.log。根据 nginx Dockerfile,access.log 和 error.log 分别被重定向到 STDOUT 和 STDERR。

  Tomcat 会生成很多日志,包括 catalina.log、access.log、manager.log、host-manager.log 等。tomcat Dockerfile 不会将这些日志重定向到标准输出,它们存在于容器内部。

  容器产生的大部分日志都可以归结为上述情况。在这里,我们不妨将容器日志分为以下两类。

  标准输出

  使用日志记录驱动程序

  容器的标准输出会被日志驱动统一处理。如下图所示,不同的日志驱动程序会将标准输出写入不同的目的地。

  通过日志记录驱动程序 采集 的容器标准输出的优点是使用简单,例如:

  缺点

  使用 json-file 和 journald 以外的其他日志记录驱动程序将使 docker logs API 不可用。比如当你在宿主机上使用portainer管理容器,并且使用上述两种以外的日志驱动时,你会发现无法通过UI界面观察到容器的标准输出。

  使用 docker 日志 API

  对于那些使用默认日志驱动的容器,我们可以通过向 docker daemon 发送 docker logs 命令来获取容器的标准输出。使用这种方法采集log的工具有logspout、sematext-agent-docker等。下面例子中的命令意思是获取容器自2018-01-01T15:00:00以来的最新5条日志。

  缺点

  当日志量较大时,这种方式会给 docker daemon 带来很大的压力,导致 docker daemon 无法及时响应创建容器、销毁容器等命令。

  采集 json 文件文件

  默认的日志驱动程序会将日志以json格式写入主机文件,文件路径为/var/lib/docker/containers//-json.log。这样,采集容器标准输出的目的就可以通过直接采集host文件来实现。

  推荐这种方案,因为它既不会使 docker logs API 不可用,也不会影响 docker daemon,而且现在很多工具都原生支持 采集host 文件,例如 filebeat、logtail 等。

  文本日志

  挂载主机目录

  采集容器中文本日志最简单的方法是在启动容器时通过bind mounts或者volumes将宿主目录挂载到容器日志所在目录,如下图。

  

  对于tomcat容器的访问日志,使用命令docker run -it -v /tmp/app/vol1:/usr/local/tomcat/logs tomcat挂载主机目录/tmp/app/vol1到访问日志中容器在目录/usr/local/tomcat/logs上,通过采集主机目录/tmp/app/vol1下的日志实现采集tomcat访问日志的目的。

  计算容器rootfs挂载点

  使用挂载宿主目录采集log的方法会侵入应用程序,因为它需要容器在启动时收录mount命令。如果 采集 进程对用户是透明的,那就太好了。实际上,这可以通过计算容器 rootfs 挂载点来实现。

  与容器 rootfs 挂载点密不可分的一个概念是存储驱动程序。在实际使用中,用户往往会根据Linux版本、文件系统类型、容器读写条件等因素来选择合适的存储驱动。在不同的存储驱动下,容器的rootfs挂载点遵循一定的规则,所以我们可以根据存储驱动的类型来推断容器的rootfs挂载点,然后采集容器的内部日志。下表显示了某些存储驱动程序的 rootfs 挂载点以及如何计算它们。

  Logtail解决方案

  在充分对比采集容器日志的各种方法,综合梳理用户的反馈和诉求后,日志服务团队推出了容器日志的一站式解决方案。

  特征

  logtail解决方案包括以下功能:

  支持主机上容器的采集主机文件和日志(包括标准输出和日志文件);

  支持容器的自动发现,即当你配置了一个采集目标时,每当有满足条件的容器被创建时,容器上的目标日志就会自动采集;

  支持通过docker标签和环境变量过滤指定容器,支持白名单和黑名单机制;

  采集数据自动标记,即在采集的日志中自动添加容器名称、容器IP、文件路径等信息标识数据源;

  支持 采集 K8s 容器日志。

  核心优势

  通过检查点机制和部署额外的监控流程来保证至少一次语义;

  经过多次双11和双12的测试,以及阿里巴巴集团内部百万级的部署规模,稳定性和性能非常有保障。

  K8s 容器日志采集

  与K8s生态深度融合,非常方便采集 K8s容器日志是日志服务logtail解决方案的另一大特色。

  采集配置管理:

  支持采集通过WEB控制台进行配置管理;

  支持采集通过CRD(CustomResourceDefinition)方式进行配置管理(这种方式更容易与K8s部署发布流程集成)。

  采集模式:

  通过DaemonSet方式支持采集K8s容器日志,即在每个节点上运行一个采集客户端logtail,适用于单功能集群;

  通过Sidecar方式支持采集K8s容器日志,即在每个Pod中以容器的形式运行一个采集客户端logtail,适用于大型、混合、PAAS集群。

  关于Logtail方案的详细说明,请参考文章综合改进、阿里云Docker/Kubernetes(K8S)日志方案及选型对比。

  查询分析和可视化

  完成日志采集工作后,下一步就是对这些日志进行查询、分析和可视化。以Tomcat访问日志为例,介绍日志服务提供的强大的查询、分析、可视化功能。

  快速搜索

  当容器日志为采集时,会携带容器名称、容器IP、目标文件路径等信息,所以在查询的时候可以通过这些信息快速定位目标容器和文件。查询功能的详细介绍请参考文档查询语法。

  实时分析

  日志服务的实时分析功能兼容SQL语法,提供200多种聚合功能。如果您有使用 SQL 的经验,您可以轻松编写满足您业务需求的分析语句。例如:

  计算访问的前 10 个 uri。

  统计当前 15 分钟内网络流量相对于前一小时的变化。

  该语句使用同比链函数计算不同时间段的网络流量。

  可视化

  为了让数据更加生动,您可以使用日志服务内置的各种图表将 SQL 计算结果可视化,并将图表组合成一个仪表板。

  

  下图是一个基于Tomcat访问日志的dashboard,展示了不良请求率、网络流量、状态码随时间变化趋势等信息。此仪表板显示多个 Tomcat 容器的聚合数据。您可以使用仪表盘过滤功能,通过指定容器名称来查看单个容器的数据。

  日志上下文分析

  查询分析、仪表盘等功能可以帮助我们掌握全局信息,了解系统的整体运行情况,但定位具体问题往往需要上下文信息的帮助。

  上下文定义

  上下文是指围绕问题的线索,例如日志中错误的上下文。上下文由两个元素组成:

  下表显示了不同数据源的最小区分粒度。

  上下文查询的挑战

  在集中式日志存储的情况下,采集 端和服务器端都很难保证日志的原创顺序:

  在客户端层面,一个主机上运行着多个容器,每个容器都会有多个需要采集的目标文件。log采集软件需要利用机器的多个CPU核对日志进行解析和预处理,通过多线程并发或单线程异步回调处理网络发送的IO慢问题。这可以防止日志数据按照机器上事件的生成顺序到达服务器。

  在服务器层面,由于采用水平可扩展的多机负载均衡架构,同一客户端机器的日志会分散在多个存储节点上。根据分散的日志很难恢复原来的顺序。

  原则

  日志服务通过在每条日志中附加一些额外的信息以及服务器的关键词查询能力巧妙地解决了上述问题。原理如下图所示。

  当日志为采集时,用于标识日志源的信息(即上面提到的最小区分粒度)会自动添加为source_id。对于容器场景,信息包括容器名称、文件路径等;

  日志服务的各种采集客户端一般都会选择批量上传日志,多条日志形成一个数据包。客户端会向这些包写入一个单调递增的package_id,包中的每条日志在包内都有一个偏移量;

  服务器会将 source_id、package_id 和 offset 组合为一个字段并为其构建索引。这样,即使各种日志在服务器上以混合状态存储,我们也可以根据source_id、package_id和offset,精确定位到一条日志。

  如果想详细了解上下文分析的功能,请参考文章上下文查询,分布式系统日志上下文查询功能。

  LiveTail - 云尾 -f

  除了查看日志的上下文信息,有时我们还希望能够持续观察容器的输出。

  传统方式

  下表展示了如何在传统模式下实时监控容器日志。

  痛点

  通过传统方式监控容器日志有以下痛点:

  当容器较多时,定位目标容器耗时耗力;

  不同类型的容器日志需要不同的观察方式,增加了使用成本;

  关键信息查询展示不够简单直观。

  功能与原理

  针对这些问题,日志服务推出了LiveTail功能。与传统模式相比,具有以下优点:

  可根据单个日志或日志服务的查询分析功能快速定位目标容器;

  在不进入目标容器的情况下,统一观察不同类型的容器日志;

  支持关键词过滤;

  支持设置键列。

  在实现方面,LiveTail 主要是利用上一章提到的上下文查询原理来快速定位目标容器和目标文件。然后,客户端定期向服务器发送请求以提取最新数据。

  也可以观看视频进一步了解采集的功能,容器日志的查询、分析和可视化。

  “视频”可在公众号回复“阿里巴巴云日志”获取。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线