• 关于

    包层模常见问题及解决方法

    的搜索结果

问题

【教程免费下载】R语言数据分析

玄学酱 2019-12-01 22:07:40 1232 浏览量 回答数 0

回答

在工程实践上,为了保障系统的可用性,互联网系统大多将强一致性需求转换成最终一致性的需求,并通过系统执行幂等性的保证,保证数据的最终一致性。但在电商等场景中,对于数据一致性的解决方法和常见的互联网系统(如 MySQL 主从同步)又有一定区别,分成以下 6 种解决方案。(一)规避分布式事务——业务整合业务整合方案主要采用将接口整合到本地执行的方法。拿问题场景来说,则可以将服务 A、B、C 整合为一个服务 D 给业务,这个服务 D 再通过转换为本地事务的方式,比如服务 D 包含本地服务和服务 E,而服务 E 是本地服务 A ~ C 的整合。优点:解决(规避)了分布式事务。缺点:显而易见,把本来规划拆分好的业务,又耦合到了一起,业务职责不清晰,不利于维护。由于这个方法存在明显缺点,通常不建议使用。(二)经典方案 - eBay 模式此方案的核心是将需要分布式处理的任务通过消息日志的方式来异步执行。消息日志可以存储到本地文本、数据库或消息队列,再通过业务规则自动或人工发起重试。人工重试更多的是应用于支付场景,通过对账系统对事后问题的处理。消息日志方案的核心是保证服务接口的幂等性。考虑到网络通讯失败、数据丢包等原因,如果接口不能保证幂等性,数据的唯一性将很难保证。eBay 方式的主要思路如下。Base:一种 Acid 的替代方案此方案是 eBay 的架构师 Dan Pritchett 在 2008 年发表给 ACM 的文章,是一篇解释 BASE 原则,或者说最终一致性的经典文章。文中讨论了 BASE 与 ACID 原则在保证数据一致性的基本差异。如果 ACID 为分区的数据库提供一致性的选择,那么如何实现可用性呢?答案是BASE (basically available, soft state, eventually consistent)BASE 的可用性是通过支持局部故障而不是系统全局故障来实现的。下面是一个简单的例子:如果将用户分区在 5 个数据库服务器上,BASE 设计鼓励类似的处理方式,一个用户数据库的故障只影响这台特定主机那 20% 的用户。这里不涉及任何魔法,不过它确实可以带来更高的可感知的系统可用性。文章中描述了一个最常见的场景,如果产生了一笔交易,需要在交易表增加记录,同时还要修改用户表的金额。这两个表属于不同的远程服务,所以就涉及到分布式事务一致性的问题。文中提出了一个经典的解决方法,将主要修改操作以及更新用户表的消息放在一个本地事务来完成。同时为了避免重复消费用户表消息带来的问题,达到多次重试的幂等性,增加一个更新记录表 updates_applied 来记录已经处理过的消息。基于以上方法,在第一阶段,通过本地的数据库的事务保障,增加了 transaction 表及消息队列 。在第二阶段,分别读出消息队列(但不删除),通过判断更新记录表 updates_applied 来检测相关记录是否被执行,未被执行的记录会修改 user 表,然后增加一条操作记录到 updates_applied,事务执行成功之后再删除队列。通过以上方法,达到了分布式系统的最终一致性。进一步了解 eBay 的方案可以参考文末链接。(三)去哪儿网分布式事务方案随着业务规模不断地扩大,电商网站一般都要面临拆分之路。就是将原来一个单体应用拆分成多个不同职责的子系统。比如以前可能将面向用户、客户和运营的功能都放在一个系统里,现在拆分为订单中心、代理商管理、运营系统、报价中心、库存管理等多个子系统。拆分首先要面临的是什么呢?最开始的单体应用所有功能都在一起,存储也在一起。比如运营要取消某个订单,那直接去更新订单表状态,然后更新库存表就 ok 了。因为是单体应用,库在一起,这些都可以在一个事务里,由关系数据库来保证一致性。但拆分之后就不同了,不同的子系统都有自己的存储。比如订单中心就只管理自己的订单库,而库存管理也有自己的库。那么运营系统取消订单的时候就是通过接口调用等方式来调用订单中心和库存管理的服务了,而不是直接去操作库。这就涉及一个『分布式事务』的问题。分布式事务有两种解决方式优先使用异步消息。上文已经说过,使用异步消息 Consumer 端需要实现幂等。幂等有两种方式,一种方式是业务逻辑保证幂等。比如接到支付成功的消息订单状态变成支付完成,如果当前状态是支付完成,则再收到一个支付成功的消息则说明消息重复了,直接作为消息成功处理。另外一种方式如果业务逻辑无法保证幂等,则要增加一个去重表或者类似的实现。对于 producer 端在业务数据库的同实例上放一个消息库,发消息和业务操作在同一个本地事务里。发消息的时候消息并不立即发出,而是向消息库插入一条消息记录,然后在事务提交的时候再异步将消息发出,发送消息如果成功则将消息库里的消息删除,如果遇到消息队列服务异常或网络问题,消息没有成功发出那么消息就留在这里了,会有另外一个服务不断地将这些消息扫出重新发送。有的业务不适合异步消息的方式,事务的各个参与方都需要同步的得到结果。这种情况的实现方式其实和上面类似,每个参与方的本地业务库的同实例上面放一个事务记录库。比如 A 同步调用 B,C。A 本地事务成功的时候更新本地事务记录状态,B 和 C 同样。如果有一次 A 调用 B 失败了,这个失败可能是 B 真的失败了,也可能是调用超时,实际 B 成功。则由一个中心服务对比三方的事务记录表,做一个最终决定。假设现在三方的事务记录是 A 成功,B 失败,C 成功。那么最终决定有两种方式,根据具体场景:重试 B,直到 B 成功,事务记录表里记录了各项调用参数等信息;执行 A 和 B 的补偿操作(一种可行的补偿方式是回滚)。对 b 场景做一个特殊说明:比如 B 是扣库存服务,在第一次调用的时候因为某种原因失败了,但是重试的时候库存已经变为 0,无法重试成功,这个时候只有回滚 A 和 C 了。那么可能有人觉得在业务库的同实例里放消息库或事务记录库,会对业务侵入,业务还要关心这个库,是否一个合理的设计?实际上可以依靠运维的手段来简化开发的侵入,我们的方法是让 DBA 在公司所有 MySQL 实例上预初始化这个库,通过框架层(消息的客户端或事务 RPC 框架)透明的在背后操作这个库,业务开发人员只需要关心自己的业务逻辑,不需要直接访问这个库。总结起来,其实两种方式的根本原理是类似的,也就是将分布式事务转换为多个本地事务,然后依靠重试等方式达到最终一致性。(四)蘑菇街交易创建过程中的分布式一致性方案交易创建的一般性流程我们把交易创建流程抽象出一系列可扩展的功能点,每个功能点都可以有多个实现(具体的实现之间有组合/互斥关系)。把各个功能点按照一定流程串起来,就完成了交易创建的过程。面临的问题每个功能点的实现都可能会依赖外部服务。那么如何保证各个服务之间的数据是一致的呢?比如锁定优惠券服务调用超时了,不能确定到底有没有锁券成功,该如何处理?再比如锁券成功了,但是扣减库存失败了,该如何处理?方案选型服务依赖过多,会带来管理复杂性增加和稳定性风险增大的问题。试想如果我们强依赖 10 个服务,9 个都执行成功了,最后一个执行失败了,那么是不是前面 9 个都要回滚掉?这个成本还是非常高的。所以在拆分大的流程为多个小的本地事务的前提下,对于非实时、非强一致性的关联业务写入,在本地事务执行成功后,我们选择发消息通知、关联事务异步化执行的方案。消息通知往往不能保证 100% 成功;且消息通知后,接收方业务是否能执行成功还是未知数。前者问题可以通过重试解决;后者可以选用事务消息来保证。但是事务消息框架本身会给业务代码带来侵入性和复杂性,所以我们选择基于 DB 事件变化通知到 MQ 的方式做系统间解耦,通过订阅方消费 MQ 消息时的 ACK 机制,保证消息一定消费成功,达到最终一致性。由于消息可能会被重发,消息订阅方业务逻辑处理要做好幂等保证。所以目前只剩下需要实时同步做、有强一致性要求的业务场景了。在交易创建过程中,锁券和扣减库存是这样的两个典型场景。要保证多个系统间数据一致,乍一看,必须要引入分布式事务框架才能解决。但引入非常重的类似二阶段提交分布式事务框架会带来复杂性的急剧上升;在电商领域,绝对的强一致是过于理想化的,我们可以选择准实时的最终一致性。我们在交易创建流程中,首先创建一个不可见订单,然后在同步调用锁券和扣减库存时,针对调用异常(失败或者超时),发出废单消息到MQ。如果消息发送失败,本地会做时间阶梯式的异步重试;优惠券系统和库存系统收到消息后,会进行判断是否需要做业务回滚,这样就准实时地保证了多个本地事务的最终一致性。(五)支付宝及蚂蚁金融云的分布式服务 DTS 方案业界常用的还有支付宝的一种 xts 方案,由支付宝在 2PC 的基础上改进而来。主要思路如下,大部分信息引用自官方网站。分布式事务服务简介分布式事务服务 (Distributed Transaction Service, DTS) 是一个分布式事务框架,用来保障在大规模分布式环境下事务的最终一致性。DTS 从架构上分为 xts-client 和 xts-server 两部分,前者是一个嵌入客户端应用的 JAR 包,主要负责事务数据的写入和处理;后者是一个独立的系统,主要负责异常事务的恢复。核心特性传统关系型数据库的事务模型必须遵守 ACID 原则。在单数据库模式下,ACID 模型能有效保障数据的完整性,但是在大规模分布式环境下,一个业务往往会跨越多个数据库,如何保证这多个数据库之间的数据一致性,需要其他行之有效的策略。在 JavaEE 规范中使用 2PC (2 Phase Commit, 两阶段提交) 来处理跨 DB 环境下的事务问题,但是 2PC 是反可伸缩模式,也就是说,在事务处理过程中,参与者需要一直持有资源直到整个分布式事务结束。这样,当业务规模达到千万级以上时,2PC 的局限性就越来越明显,系统可伸缩性会变得很差。基于此,我们采用 BASE 的思想实现了一套类似 2PC 的分布式事务方案,这就是 DTS。DTS在充分保障分布式环境下高可用性、高可靠性的同时兼顾数据一致性的要求,其最大的特点是保证数据最终一致 (Eventually consistent)。简单的说,DTS 框架有如下特性:最终一致:事务处理过程中,会有短暂不一致的情况,但通过恢复系统,可以让事务的数据达到最终一致的目标。协议简单:DTS 定义了类似 2PC 的标准两阶段接口,业务系统只需要实现对应的接口就可以使用 DTS 的事务功能。与 RPC 服务协议无关:在 SOA 架构下,一个或多个 DB 操作往往被包装成一个一个的 Service,Service 与 Service 之间通过 RPC 协议通信。DTS 框架构建在 SOA 架构上,与底层协议无关。与底层事务实现无关: DTS 是一个抽象的基于 Service 层的概念,与底层事务实现无关,也就是说在 DTS 的范围内,无论是关系型数据库 MySQL,Oracle,还是 KV 存储 MemCache,或者列存数据库 HBase,只要将对其的操作包装成 DTS 的参与者,就可以接入到 DTS 事务范围内。一个完整的业务活动由一个主业务服务与若干从业务服务组成。主业务服务负责发起并完成整个业务活动。从业务服务提供 TCC 型业务操作。业务活动管理器控制业务活动的一致性,它登记业务活动中的操作,并在活动提交时确认所有的两阶段事务的 confirm 操作,在业务活动取消时调用所有两阶段事务的 cancel 操作。”与 2PC 协议比较,没有单独的 Prepare 阶段,降低协议成本。系统故障容忍度高,恢复简单(六)农信网数据一致性方案电商业务公司的支付部门,通过接入其它第三方支付系统来提供支付服务给业务部门,支付服务是一个基于 Dubbo 的 RPC 服务。对于业务部门来说,电商部门的订单支付,需要调用支付平台的支付接口来处理订单;同时需要调用积分中心的接口,按照业务规则,给用户增加积分。从业务规则上需要同时保证业务数据的实时性和一致性,也就是支付成功必须加积分。我们采用的方式是同步调用,首先处理本地事务业务。考虑到积分业务比较单一且业务影响低于支付,由积分平台提供增加与回撤接口。具体的流程是先调用积分平台增加用户积分,再调用支付平台进行支付处理,如果处理失败,catch 方法调用积分平台的回撤方法,将本次处理的积分订单回撤。用户信息变更公司的用户信息,统一由用户中心维护,而用户信息的变更需要同步给各业务子系统,业务子系统再根据变更内容,处理各自业务。用户中心作为 MQ 的 producer,添加通知给 MQ。APP Server 订阅该消息,同步本地数据信息,再处理相关业务比如 APP 退出下线等。我们采用异步消息通知机制,目前主要使用 ActiveMQ,基于 Virtual Topic 的订阅方式,保证单个业务集群订阅的单次消费。总结分布式服务对衍生的配套系统要求比较多,特别是我们基于消息、日志的最终一致性方案,需要考虑消息的积压、消费情况、监控、报警等。

小川游鱼 2019-12-02 01:46:40 0 浏览量 回答数 0

问题

【精品问答】Java必备核心知识1000+(附源码)

问问小秘 2019-12-01 22:00:28 870 浏览量 回答数 1

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

问题

【精品问答】PHP常见面试题50问(附答案)

珍宝珠 2019-12-01 21:59:27 1373 浏览量 回答数 1

回答

HTTPS基本原理 一、http为什么不安全。 http协议没有任何的加密以及身份验证的机制,非常容易遭遇窃听、劫持、篡改,因此会造成个人隐私泄露,恶意的流量劫持等严重的安全问题。 国外很多网站都支持了全站https,国内方面目前百度已经在年初完成了搜索的全站https,其他大型的网站也在跟进中,百度最先完成全站https的最大原因就是百度作为国内最大的流量入口,劫持也必然是首当其冲的,造成的有形的和无形的损失也就越大。关于流量劫持问题,我在另一篇文章中也有提到,基本上是互联网企业的共同难题,https也是目前公认的比较好的解决方法。但是https也会带来很多性能以及访问速度上的牺牲,很多互联网公司在做大的时候都会遇到这个问题:https成本高,速度又慢,规模小的时候在涉及到登录和交易用上就够了,做大以后遇到信息泄露和劫持,想整体换,代价又很高。 2、https如何保证安全 要解决上面的问题,就要引入加密以及身份验证的机制。 这时我们引入了非对称加密的概念,我们知道非对称加密如果是公钥加密的数据私钥才能解密,所以我只要把公钥发给你,你就可以用这个公钥来加密未来我们进行数据交换的秘钥,发给我时,即使中间的人截取了信息,也无法解密,因为私钥在我这里,只有我才能解密,我拿到你的信息后用私钥解密后拿到加密数据用的对称秘钥,通过这个对称密钥来进行后续的数据加密。除此之外,非对称加密可以很好的管理秘钥,保证每次数据加密的对称密钥都是不相同的。 但是这样似乎还不够,如果中间人在收到我的给你公钥后并没有发给你,而是自己伪造了一个公钥发给你,这是你把对称密钥用这个公钥加密发回经过中间人,他可以用私钥解密并拿到对称密钥,此时他在把此对称密钥用我的公钥加密发回给我,这样中间人就拿到了对称密钥,可以解密传输的数据了。为了解决此问题,我们引入了数字证书的概念。我首先生成公私钥,将公钥提供给相关机构(CA),CA将公钥放入数字证书并将数字证书颁布给我,此时我就不是简单的把公钥给你,而是给你一个数字证书,数字证书中加入了一些数字签名的机制,保证了数字证书一定是我给你的。 所以综合以上三点: 非对称加密算法(公钥和私钥)交换秘钥 + 数字证书验证身份(验证公钥是否是伪造的) + 利用秘钥对称加密算法加密数据 = 安全 3、https协议简介 为什么是协议简介呢。因为https涉及的东西实在太多了,尤其是一些加密算法,非常的复杂,对于这些算法面的东西就不去深入研究了,这部分仅仅是梳理一下一些关于https最基本的原理,为后面分解https的连接建立以及https优化等内容打下理论基础。 3.1 对称加密算法 对称加密是指加密和解密使用相同密钥的加密算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信至关重要。 对称加密又分为两种模式:流加密和分组加密。 流加密是将消息作为位流对待,并且使用数学函数分别作用在每一个位上,使用流加密时,每加密一次,相同的明文位会转换成不同的密文位。流加密使用了密钥流生成器,它生成的位流与明文位进行异或,从而生成密文。现在常用的就是RC4,不过RC4已经不再安全,微软也建议网络尽量不要使用RC4流加密。 分组加密是将消息划分为若干位分组,这些分组随后会通过数学函数进行处理,每次一个分组。假设需要加密发生给对端的消息,并且使用的是64位的分组密码,此时如果消息长度为640位,就会被划分成10个64位的分组,每个分组都用一系列数学公式公式进行处理,最后得到10个加密文本分组。然后,将这条密文消息发送给对端。对端必须拥有相同的分组密码,以相反的顺序对10个密文分组使用前面的算法解密,最终得到明文的消息。比较常用的分组加密算法有DES、3DES、AES。其中DES是比较老的加密算法,现在已经被证明不安全。而3DES是一个过渡的加密算法,相当于在DES基础上进行三重运算来提高安全性,但其本质上还是和DES算法一致。而AES是DES算法的替代算法,是现在最安全的对称加密算法之一。分组加密算法除了算法本身外还存在很多种不同的运算方式,比如ECB、CBC、CFB、OFB、CTR等,这些不同的模式可能只针对特定功能的环境中有效,所以要了解各种不同的模式以及每种模式的用途。这个部分后面的文章中会详细讲。 对称加密算法的优、缺点: 优点:算法公开、计算量小、加密速度快、加密效率高。 缺点:(1)交易双方都使用同样钥匙,安全性得不到保证; (2)每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。 (3)能提供机密性,但是不能提供验证和不可否认性。 3.2 非对称加密算法 在非对称密钥交换算法出现以前,对称加密一个很大的问题就是不知道如何安全生成和保管密钥。非对称密钥交换过程主要就是为了解决这个问题,使得对称密钥的生成和使用更加安全。 密钥交换算法本身非常复杂,密钥交换过程涉及到随机数生成,模指数运算,空白补齐,加密,签名等操作。 常见的密钥交换算法有RSA,ECDHE,DH,DHE等算法。涉及到比较复杂的数学问题,下面就简单介绍下最经典的RSA算法。RSA:算法实现简单,诞生于1977年,历史悠久,经过了长时间的破解测试,安全性高。缺点就是需要比较大的素数也就是质数(目前常用的是2048位)来保证安全强度,很消耗CPU运算资源。RSA是目前唯一一个既能用于密钥交换又能用于证书签名的算法。我觉得RSA可以算是最经典的非对称加密算法了,虽然算法本身都是数学的东西,但是作为最经典的算法,我自己也花了点时间对算法进行了研究,后面会详细介绍。 非对称加密相比对称加密更加安全,但也存在两个明显缺点: 1,CPU计算资源消耗非常大。一次完全TLS握手,密钥交换时的非对称解密计算量占整个握手过程的90%以上。而对称加密的计算量只相当于非对称加密的0.1%,如果应用层数据也使用非对称加解密,性能开销太大,无法承受。 2,非对称加密算法对加密内容的长度有限制,不能超过公钥长度。比如现在常用的公钥长度是2048位,意味着待加密内容不能超过256个字节。 所以公钥加密(极端消耗CPU资源)目前只能用来作密钥交换或者内容签名,不适合用来做应用层传输内容的加解密。 3.3 身份认证 https协议中身份认证的部分是由数字证书来完成的,证书由公钥、证书主体、数字签名等内容组成,在客户端发起SSL请求后,服务端会将数字证书发给客户端,客户端会对证书进行验证(验证查看这张证书是否是伪造的。也就是公钥是否是伪造的),并获取用于秘钥交换的非对称密钥(获取公钥)。 数字证书有两个作用: 1,身份授权。确保浏览器访问的网站是经过CA验证的可信任的网站。 2,分发公钥。每个数字证书都包含了注册者生成的公钥(验证确保是合法的,非伪造的公钥)。在SSL握手时会通过certificate消息传输给客户端。 申请一个受信任的数字证书通常有如下流程: 1,终端实体(可以是一个终端硬件或者网站)生成公私钥和证书请求。 2,RA(证书注册及审核机构)检查实体的合法性。如果个人或者小网站,这一步不是必须的。 3,CA(证书签发机构)签发证书,发送给申请者。 4,证书更新到repository(负责数字证书及CRL内容存储和分发),终端后续从repository更新证书,查询证书状态等。 数字证书验证: 申请者拿到CA的证书并部署在网站服务器端,那浏览器发起握手接收到证书后,如何确认这个证书就是CA签发的呢。怎样避免第三方伪造这个证书。答案就是数字签名(digital signature)。数字签名是证书的防伪标签,目前使用最广泛的SHA-RSA(SHA用于哈希算法,RSA用于非对称加密算法)数字签名的制作和验证过程如下: 1,数字签名的签发。首先是使用哈希函数对待签名内容进行安全哈希,生成消息摘要,然后使用CA自己的私钥对消息摘要进行加密。 2,数字签名的校验。使用CA的公钥解密签名,然后使用相同的签名函数对待签名证书内容进行签名并和服务端数字签名里的签名内容进行比较,如果相同就认为校验成功。 需要注意的是: 1)数字签名签发和校验使用的密钥对是CA自己的公私密钥,跟证书申请者提交的公钥没有关系。 2)数字签名的签发过程跟公钥加密的过程刚好相反,即是用私钥加密,公钥解密。 3)现在大的CA都会有证书链,证书链的好处一是安全,保持根CA的私钥离线使用。第二个好处是方便部署和撤销,即如果证书出现问题,只需要撤销相应级别的证书,根证书依然安全。 4)根CA证书都是自签名,即用自己的公钥和私钥完成了签名的制作和验证。而证书链上的证书签名都是使用上一级证书的密钥对完成签名和验证的。 5)怎样获取根CA和多级CA的密钥对。它们是否可信。当然可信,因为这些厂商跟浏览器和操作系统都有合作,它们的公钥都默认装到了浏览器或者操作系统环境里。 3.4 数据完整性验证 数据传输过程中的完整性使用MAC算法来保证。为了避免网络中传输的数据被非法篡改,SSL利用基于MD5或SHA的MAC算法来保证消息的完整性。 MAC算法是在密钥参与下的数据摘要算法,能将密钥和任意长度的数据转换为固定长度的数据。发送者在密钥的参与下,利用MAC算法计算出消息的MAC值,并将其加在消息之后发送给接收者。接收者利用同样的密钥和MAC算法计算出消息的MAC值,并与接收到的MAC值比较。如果二者相同,则报文没有改变;否则,报文在传输过程中被修改,接收者将丢弃该报文。 由于MD5在实际应用中存在冲突的可能性比较大,所以尽量别采用MD5来验证内容一致性。SHA也不能使用SHA0和SHA1,中国山东大学的王小云教授在2005年就宣布破解了 SHA-1完整版算法。微软和google都已经宣布16年及17年之后不再支持sha1签名证书。MAC算法涉及到很多复杂的数学问题,这里就不多讲细节了。 专题二--【实际抓包分析】 抓包结果: fiddler: wireshark: 可以看到,百度和我们公司一样,也采用以下策略: (1)对于高版本浏览器,如果支持 https,且加解密算法在TLS1.0 以上的,都将所有 http请求重定向到 https请求 (2)对于https请求,则不变。 【以下只解读https请求】 1、TCP三次握手 可以看到,我们访问的是 http://www.baidu.com/ , 在初次建立 三次握手的时候, 用户是去 连接 8080端口的(因为公司办公网做了代理,因此,我们实际和代理机做的三次握手,公司代理机再帮我们去连接百度服务器的80端口) 2、CONNECT 建立 由于公司办公网访问非腾讯域名,会做代理,因此,在进行https访问的时候,我们的电脑需要和公司代理机做 " CONNECT " 连接(关于 " CONNECT " 连接, 可以理解为虽然后续的https请求都是公司代理机和百度服务器进行公私钥连接和对称秘钥通信,但是,有了 " CONNECT " 连接之后,可以认为我们也在直接和百度服务器进行公私钥连接和对称秘钥通信。 ) fiddler抓包结果: CONNECT之后, 后面所有的通信过程,可以看做是我们的机器和百度服务器在直接通信 3、 client hello 整个 Secure Socket Layer只包含了: TLS1.2 Record Layer内容 (1)随机数 在客户端问候中,有四个字节以Unix时间格式记录了客户端的协调世界时间(UTC)。协调世界时间是从1970年1月1日开始到当前时刻所经历的秒数。在这个例子中,0x2516b84b就是协调世界时间。在他后面有28字节的随机数( random_C ),在后面的过程中我们会用到这个随机数。 (2)SID(Session ID) 如果出于某种原因,对话中断,就需要重新握手。为了避免重新握手而造成的访问效率低下,这时候引入了session ID的概念, session ID的思想很简单,就是每一次对话都有一个编号(session ID)。如果对话中断,下次重连的时候,只要客户端给出这个编号,且服务器有这个编号的记录,双方就可以重新使用已有的"对话密钥",而不必重新生成一把。 因为我们抓包的时候,是几个小时内第一次访问 https://www.baodu.com 首页,因此,这里并没有 Session ID. (稍会儿我们会看到隔了半分钟,第二次抓包就有这个Session ID) session ID是目前所有浏览器都支持的方法,但是它的缺点在于session ID往往只保留在一台服务器上。所以,如果客户端的请求发到另一台服务器,就无法恢复对话。session ticket就是为了解决这个问题而诞生的,目前只有Firefox和Chrome浏览器支持。 (3) 密文族(Cipher Suites): RFC2246中建议了很多中组合,一般写法是"密钥交换算法-对称加密算法-哈希算法,以“TLS_RSA_WITH_AES_256_CBC_SHA”为例: (a) TLS为协议,RSA为密钥交换的算法; (b) AES_256_CBC是对称加密算法(其中256是密钥长度,CBC是分组方式); (c) SHA是哈希的算法。 浏览器支持的加密算法一般会比较多,而服务端会根据自身的业务情况选择比较适合的加密组合发给客户端。(比如综合安全性以及速度、性能等因素) (4) Server_name扩展:( 一般浏览器也支持 SNI(Server Name Indication)) 当我们去访问一个站点时,一定是先通过DNS解析出站点对应的ip地址,通过ip地址来访问站点,由于很多时候一个ip地址是给很多的站点公用,因此如果没有server_name这个字段,server是无法给与客户端相应的数字证书的,Server_name扩展则允许服务器对浏览器的请求授予相对应的证书。 还有一个很好的功能: SNI(Server Name Indication)。这个的功能比较好,为了解决一个服务器使用多个域名和证书的SSL/TLS扩展。一句话简述它的工作原理就是,在连接到服务器建立SSL连接之前先发送要访问站点的域名(Hostname),这样服务器根据这个域名返回一个合适的CA证书。目前,大多数操作系统和浏览器都已经很好地支持SNI扩展,OpenSSL 0.9.8已经内置这一功能,据说新版的nginx也支持SNI。) 4、 服务器回复(包括 Server Hello, Certificate, Certificate Status) 服务器在收到client hello后,会回复三个数据包,下面分别看一下: 1)Server Hello 1、我们得到了服务器的以Unix时间格式记录的UTC和28字节的随机数 (random_S)。 2、Seesion ID,服务端对于session ID一般会有三种选择 (稍会儿我们会看到隔了半分钟,第二次抓包就有这个Session ID) : 1)恢复的session ID:我们之前在client hello里面已经提到,如果client hello里面的session ID在服务端有缓存,服务端会尝试恢复这个session; 2)新的session ID:这里又分两种情况,第一种是client hello里面的session ID是空值,此时服务端会给客户端一个新的session ID,第二种是client hello里面的session ID此服务器并没有找到对应的缓存,此时也会回一个新的session ID给客户端; 3)NULL:服务端不希望此session被恢复,因此session ID为空。 3、我们记得在client hello里面,客户端给出了21种加密族,而在我们所提供的21个加密族中,服务端挑选了“TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256”。 (a) TLS为协议,RSA为密钥交换的算法; (b) AES_256_CBC是对称加密算法(其中256是密钥长度,CBC是分组方式); (c) SHA是哈希的算法。 这就意味着服务端会使用ECDHE-RSA算法进行密钥交换,通过AES_128_GCM对称加密算法来加密数据,利用SHA256哈希算法来确保数据完整性。这是百度综合了安全、性能、访问速度等多方面后选取的加密组合。 2)Certificate 在前面的https原理研究中,我们知道为了安全的将公钥发给客户端,服务端会把公钥放入数字证书中并发给客户端(数字证书可以自签发,但是一般为了保证安全会有一个专门的CA机构签发),所以这个报文就是数字证书,4097 bytes就是证书的长度。 我们打开这个证书,可以看到证书的具体信息,这个具体信息通过抓包报文的方式不是太直观,可以在浏览器上直接看。 (点击 chrome 浏览器 左上方的 绿色 锁型按钮) 3)Server Hello Done 我们抓的包是将 Server Hello Done 和 server key exchage 合并的包: 4)客户端验证证书真伪性 客户端验证证书的合法性,如果验证通过才会进行后续通信,否则根据错误情况不同做出提示和操作,合法性验证包括如下: 证书链的可信性trusted certificate path,方法如前文所述; 证书是否吊销revocation,有两类方式离线CRL与在线OCSP,不同的客户端行为会不同; 有效期expiry date,证书是否在有效时间范围; 域名domain,核查证书域名是否与当前的访问域名匹配,匹配规则后续分析; 5)秘钥交换 这个过程非常复杂,大概总结一下: (1)首先,其利用非对称加密实现身份认证和密钥协商,利用非对称加密,协商好加解密数据的 对称秘钥(外加CA认证,防止中间人窃取 对称秘钥) (2)然后,对称加密算法采用协商的密钥对数据加密,客户端和服务器利用 对称秘钥 进行通信; (3)最后,基于散列函数验证信息的完整性,确保通信数据不会被中间人恶意篡改。 此时客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数random_C和random_S与自己计算产生的Pre-master(由客户端和服务器的 pubkey生成的一串随机数),计算得到协商对称密钥; enc_key=Fuc(random_C, random_S, Pre-Master) 6)生成 session ticket 如果出于某种原因,对话中断,就需要重新握手。为了避免重新握手而造成的访问效率低下,这时候引入了session ID的概念, session ID的思想很简单,就是每一次对话都有一个编号(session ID)。如果对话中断,下次重连的时候,只要客户端给出这个编号,且服务器有这个编号的记录,双方就可以重新使用已有的"对话密钥",而不必重新生成一把。 因为我们抓包的时候,是几个小时内第一次访问 https://www.baodu.com 首页,因此,这里并没有 Session ID. (稍会儿我们会看到隔了半分钟,第二次抓包就有这个Session ID) session ID是目前所有浏览器都支持的方法,但是它的缺点在于session ID往往只保留在一台服务器上。所以,如果客户端的请求发到另一台服务器,就无法恢复对话。session ticket就是为了解决这个问题而诞生的,目前只有Firefox和Chrome浏览器支持。 后续建立新的https会话,就可以利用 session ID 或者 session Tickets , 对称秘钥可以再次使用,从而免去了 https 公私钥交换、CA认证等等过程,极大地缩短 https 会话连接时间。 7) 利用对称秘钥传输数据 【半分钟后,再次访问百度】: 有这些大的不同: 由于服务器和浏览器缓存了 Session ID 和 Session Tickets,不需要再进行 公钥证书传递,CA认证,生成 对称秘钥等过程,直接利用半分钟前的 对称秘钥 加解密数据进行会话。 1)Client Hello 2)Server Hello

玄学酱 2019-12-02 01:27:08 0 浏览量 回答数 0

问题

编辑器测试

养狐狸的猫 2019-12-01 22:01:10 72 浏览量 回答数 0

问题

【精品问答】Java技术1000问(1)

问问小秘 2019-12-01 21:57:43 39155 浏览量 回答数 15

问题

【精品问答】python技术1000问(1)

问问小秘 2019-12-01 21:57:48 455812 浏览量 回答数 21

问题

MaxCompute百问集锦(持续更新20171011)

隐林 2019-12-01 20:19:23 38430 浏览量 回答数 18

问题

投递日志到MaxCompute有什么意义?

轩墨 2019-12-01 21:57:02 1275 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 投递日志到 MaxCompute 是日志服务的一个功能,能够帮助您最大化数据价值。您可以自己决定对某个日志库是否启用该功能。一旦启用该功能,日志服务后台会定时把写入到该日志库内的日志投递到 MaxCompute 对应的表格中。 使用限制 数加控制台创建、修改投递配置必须由主账号完成,不支持子账号操作。 投递MaxCompute是批量任务,请谨慎设置分区列:保证一个同步任务内处理的数据分区数小于512个;用作分区列的字段值不能包括/等MaxCompute保留字段 。配置细节请参考下文投递配置说明。 不支持海外Region的MaxCompute投递,海外Region的MaxCompute请使用dataworks进行数据同步。国内Region投递支持如下: 日志服务Region MaxCompute Region 华北1 华东2 华北2 华北2、华东2 华北3 华东2 华北5 华东2 华东1 华东2 华东2 华东2 华南1 华南1、华东2 香港 华东2 功能优势 日志服务收集的日志除了可以被实时查询外,还可以把日志数据投递到大数据计算服务MaxCompute(原ODPS),进一步进行个性化BI分析及数据挖掘。通过日志服务投递日志数据到MaxCompute具有如下优势: 使用便捷 您只需要完成2步配置即可以把日志服务Logstore的日志数据迁移到MaxCompute中。 避免重复收集工作 由于日志服务的日志收集过程已经完成不同机器上的日志集中化,无需重复在不同机器上收集一遍日志数据后再导入到MaxCompute。 充分复用日志服务内的日志分类管理工作 用户可让日志服务中不同类型的日志(存在不同Logstore中)、不同Project的日志自动投递到不同的MaxCompute表格,方便管理及分析MaxCompute内的日志数据。 说明 一般情况下日志数据在写入Logstore后的1个小时导入到MaxCompute,您可以在控制台投递任务管理查看导入状态。导入成功后即可在MaxCompute内查看到相关日志数据。判断数据是否已完全投递请参考文档。 结合日志服务的实时消费,投递日志数据到MaxCompute的数据通道以及日志索引功能,可以让用户按照不同的场景和需求、以不同的方式复用数据,充分发挥日志数据的价值。 配置流程 举例日志服务的一条日志如下: 16年01月27日20时50分13秒 10.10.*.* ip:10.10.*.* status:200 thread:414579208 time:27/Jan/2016:20:50:13 +0800 url:POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1 user-agent:aliyun-sdk-java 日志左侧的ip、status、thread、time、url、user-agent等是日志服务数据的字段名称,需要在下方配置中应用到。 步骤1 初始化数加平台 在日志服务的控制台Logstore列表单击日志投递列的MaxCompute。 自动跳转到初始化数加平台的页面。MaxCompute默认为按量付费模式,具体参见MaxCompute文档说明。 查看服务协议和条款后单击确定,初始化数加平台。 初始化开通需10~20秒左右,请耐心等待。如果已经开通数加及大数据计算服务MaxCompute(原ODPS),将直接跳过该步骤。 步骤2 数据模型映射在日志服务和大数据计算服务MaxCompute(原ODPS)之间同步数据,涉及两个服务的数据模型映射问题。您可以参考日志服务日志数据结构了解数据结构。 将样例日志导入MaxCompute,分别定义MaxCompute数据列、分区列与日志服务字段的映射关系: MaxCompute 列类型 MaxCompute 列名(可自定义) MaxCompute 列类型(可自定义) 日志服务字段名(投递配置里填写) 日志服务字段类型 日志服务字段语义 数据列 log_source string __source__ 系统保留字段 日志来源的机器 IP。 log_time bigint __time__ 系统保留字段 日志的 Unix 时间戳(是从1970 年 1 月 1 日开始所经过的秒数),由用户日志的 time 字段计算得到。 log_topic string __topic__ 系统保留字段 日志主题。 time string time 日志内容字段 解析自日志。 ip string ip 日志内容字段 解析自日志。 thread string thread 日志内容字段 解析自日志。 log_extract_others string __extract_others__ 系统保留字段 未在配置中进行映射的其他日志内字段会通过 key-value 序列化到json,该 json 是一层结构,不支持字段内部 json 嵌套。 分区列 log_partition_time string __partition_time__ 系统保留字段 由日志的 time 字段对齐计算而得,分区粒度可配置,在配置项部分详述。 status string status 日志内容字段 解析自日志,该字段取值应该是可以枚举的,保证分区数目不会超出上限。 MaxCompute 表至少包含一个数据列、一个分区列。 系统保留字段中建议使用 __partition_time__,__source__,__topic__。 MaxCompute 单表有分区数目 6 万的限制,分区数超出后无法再写入数据,所以日志服务导入 MaxCompute表至多支持3个分区列。请谨慎选择自定义字段作为分区列,保证其值是可枚举的。 系统保留字段 __extract_others__ 历史上曾用名 _extract_others_,填写后者也是兼容的。 MaxCompute 分区列的值不支持”/“等特殊字符,这些是 MaxCompute 的保留字段。 MaxCompute 分区列取值不支持空,所以映射到分区列的字段必须要在日志里存在,空分区列的日志会在投递中被丢弃。 步骤3 配置投递规则 开启投递。 初始化数加平台之后,根据页面提示进入LogHub —— 数据投递页面,选择需要投递的Logstore,并单击开启投递。 您也可以在MaxCompute(原ODPS)投递管理页面选择需要投递的Logstore,并单击开启投递以进入LogHub —— 数据投递页面。 图 1. 开启投递 配置投递规则。 在 LogHub —— 数据投递页面配置 字段关联等相关内容。 图 2. 配置投递规则 配置项含义: 参数 语义 投递名称 自定义一个投递的名称,方便后续管理。 MaxCompute Project MaxCompute项目名称,该项默认为新创建的Project,如果已经是MaxCompute老客户,可以下拉选择已创建其他Project。 MaxCompute Table MaxCompute表名称,请输入自定义的新建的MaxCompute表名称或者选择已有的MaxCompute表。 MaxCompute 普通列 按序,左边填写与MaxCompute表数据列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 MaxCompute 分区列 按序,左边填写与MaxCompute表分区列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 分区时间格式 __partition_time__输出的日期格式,参考 Java SimpleDateFormat。 导入MaxCompute间隔 MaxCompute数据投递间隔,默认1800,单位:秒。 该步会默认为客户创建好新的MaxCompute Project和Table,其中如果已经是MaxCompute老客户,可以下拉选择其他已创建Project。 日志服务投递MaxCompute功能按照字段与列的顺序进行映射,修改MaxCompute表列名不影响数据导入,如更改MaxCompute表schema,请重新配置字段与列映射关系。 日志服务数据的一个字段最多允许映射到一个MaxCompute表的列(数据列或分区列),不支持字段冗余。 参考信息 __partition_time__ 格式 将日志时间作为分区字段,通过日期来筛选数据是MaxCompute常见的过滤数据方法。 __partition_time__ 是根据日志time字段值计算得到(不是日志写入服务端时间,也不是日志投递时间),结合分区时间格式,向下取整(为避免触发MaxCompute单表分区数目的限制,日期分区列的值会按照导入MaxCompute间隔对齐)计算出日期作为分区列。 举例来说,日志提取的time字段是“27/Jan/2016:20:50:13 +0800”,日志服务据此计算出保留字段__time__为1453899013(Unix时间戳),不同配置下的时间分区列取值如下: 导入MaxCompute间隔 分区时间格式 __partition_time__ 1800 yyyy_MM_dd_HH_mm_00 2016_01_27_20_30_00 1800 yyyy-MM-dd HH:mm 2016-01-27 20:30 1800 yyyyMMdd 20160127 3600 yyyyMMddHHmm 201601272000 3600 yyyy_MM_dd_HH 2016_01_27_20 请勿使用精确到秒的日期格式:1. 很容易导致单表的分区数目超过限制(6万);2. 单次投递任务的数据分区数目必须在512以内。 以上分区时间格式是测试通过的样例,您也可以参考Java SimpleDateFormat自己定义日期格式,但是该格式不得包含斜线字符”/“(这是MaxCompute的保留字段)。 __partition_time__ 使用方法 使用MaxCompute的字符串比较筛选数据,可以避免全表扫描。比如查询2016年1月26日一天内日志数据: select * from {ODPS_TABLE_NAME} where log_partition_time >= "2015_01_26" and log_partition_time < "2016_01_27"; __extract_others__使用方法 log_extract_others为一个json字符串,如果想获取该字段的user-agent内容,可以进行如下查询: select get_json_object(sls_extract_others, "$.user-agent") from {ODPS_TABLE_NAME} limit 10; 说明 get_json_object是MaxCompute提供的标准UDF。请联系MaxCompute团队开通使用该标准UDF的权限。 示例供参考,请以MaxCompute产品建议为最终标准。 其他操作 编辑投递配置 在Logstore列表投递项,单击“修改”即可针对之前的配置信息进行编辑。其中如果想新增列,可以在大数据计算服务MaxCompute(原ODPS)修改投递的数据表列信息,则点击“修改”后会加载最新的数据表信息。 投递任务管理 在启动投递功能后,日志服务后台会定期启动离线投递任务。用户可以在控制台上看到这些投递任务的状态和错误信息。具体请参考管理日志投递任务。 如果投递任务出现错误,控制台上会显示相应的错误信息: 错误信息 建议方案 MaxCompute项目空间不存在 在MaxCompute控制台中确认配置的MaxCompute项目是否存在,如果不存在则需要重新创建或配置。 MaxCompute表不存在 在MaxCompute控制台中确认配置的MaxCompute表是否存在,如果不存在则需要重新创建或配置。 MaxCompute项目空间或表没有向日志服务授权 在MaxCompute控制台中确认授权给日志服务账号的权限是否还存在,如果不存在则需要重新添加上相应权限。 MaxCompute错误 显示投递任务收到的MaxCompute错误,请参考MaxCompute相关文档或联系MaxCompute团队解决。日志服务会自动重试最近两天时间的失败任务。 日志服务导入字段配置无法匹配MaxCompute表的列 重新配置MaxCompute表格的列与日志服务数据字段的映射配置。 当投递任务发生错误时,请查看错误信息,问题解决后可以通过云控制台中“日志投递任务管理”或SDK来重试失败任务。 MaxCompute中消费日志 MaxCompute用户表中示例数据如下: | log_source | log_time | log_topic | time | ip | thread | log_extract_others | log_partition_time | status | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ | 10.10.*.* | 1453899013 | | 27/Jan/2016:20:50:13 +0800 | 10.10.*.* | 414579208 | {"url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1","user-agent":"aliyun-sdk-java"} | 2016_01_27_20_50 | 200 | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ 同时,我们推荐您直接使用已经与MaxCompute绑定的大数据开发Data IDE来进行可视化的BI分析及数据挖掘,这将提高数据加工的效率。 授予MaxCompute数据投递权限 如果在数加平台执行表删除重建动作,会导致默认授权失效。请手动重新为日志服务投递数据授权。 在MaxCompute项目空间下添加用户: ADD USER aliyun$shennong_open@aliyun.com; shennong_open@aliyun.com 是日志服务系统账号(请不要用自己的账号),授权目的是为了能将数据写入到MaxCompute MaxCompute项目空间Read/List权限授予: GRANT Read, List ON PROJECT {ODPS_PROJECT_NAME} TO USER aliyun$shennong_open@aliyun.com; MaxCompute项目空间的表Describe/Alter/Update权限授予: GRANT Describe, Alter, Update ON TABLE {ODPS_TABLE_NAME} TO USER aliyun$shennong_open@aliyun.com; 确认MaxCompute授权是否成功: SHOW GRANTS FOR aliyun$shennong_open@aliyun.com; A projects/{ODPS_PROJECT_NAME}: List | Read A projects/{ODPS_PROJECT_NAME}/tables/{ODPS_TABLE_NAME}: Describe | Alter | Update

2019-12-01 23:11:17 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 投递日志到 MaxCompute 是日志服务的一个功能,能够帮助您最大化数据价值。您可以自己决定对某个日志库是否启用该功能。一旦启用该功能,日志服务后台会定时把写入到该日志库内的日志投递到 MaxCompute 对应的表格中。 使用限制 数加控制台创建、修改投递配置必须由主账号完成,不支持子账号操作。 投递MaxCompute是批量任务,请谨慎设置分区列:保证一个同步任务内处理的数据分区数小于512个;用作分区列的字段值不能包括/等MaxCompute保留字段 。配置细节请参考下文投递配置说明。 不支持海外Region的MaxCompute投递,海外Region的MaxCompute请使用dataworks进行数据同步。国内Region投递支持如下: 日志服务Region MaxCompute Region 华北1 华东2 华北2 华北2、华东2 华北3 华东2 华北5 华东2 华东1 华东2 华东2 华东2 华南1 华南1、华东2 香港 华东2 功能优势 日志服务收集的日志除了可以被实时查询外,还可以把日志数据投递到大数据计算服务MaxCompute(原ODPS),进一步进行个性化BI分析及数据挖掘。通过日志服务投递日志数据到MaxCompute具有如下优势: 使用便捷 您只需要完成2步配置即可以把日志服务Logstore的日志数据迁移到MaxCompute中。 避免重复收集工作 由于日志服务的日志收集过程已经完成不同机器上的日志集中化,无需重复在不同机器上收集一遍日志数据后再导入到MaxCompute。 充分复用日志服务内的日志分类管理工作 用户可让日志服务中不同类型的日志(存在不同Logstore中)、不同Project的日志自动投递到不同的MaxCompute表格,方便管理及分析MaxCompute内的日志数据。 说明 一般情况下日志数据在写入Logstore后的1个小时导入到MaxCompute,您可以在控制台投递任务管理查看导入状态。导入成功后即可在MaxCompute内查看到相关日志数据。判断数据是否已完全投递请参考文档。 结合日志服务的实时消费,投递日志数据到MaxCompute的数据通道以及日志索引功能,可以让用户按照不同的场景和需求、以不同的方式复用数据,充分发挥日志数据的价值。 配置流程 举例日志服务的一条日志如下: 16年01月27日20时50分13秒 10.10.*.* ip:10.10.*.* status:200 thread:414579208 time:27/Jan/2016:20:50:13 +0800 url:POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1 user-agent:aliyun-sdk-java 日志左侧的ip、status、thread、time、url、user-agent等是日志服务数据的字段名称,需要在下方配置中应用到。 步骤1 初始化数加平台 在日志服务的控制台Logstore列表单击日志投递列的MaxCompute。 自动跳转到初始化数加平台的页面。MaxCompute默认为按量付费模式,具体参见MaxCompute文档说明。 查看服务协议和条款后单击确定,初始化数加平台。 初始化开通需10~20秒左右,请耐心等待。如果已经开通数加及大数据计算服务MaxCompute(原ODPS),将直接跳过该步骤。 步骤2 数据模型映射在日志服务和大数据计算服务MaxCompute(原ODPS)之间同步数据,涉及两个服务的数据模型映射问题。您可以参考日志服务日志数据结构了解数据结构。 将样例日志导入MaxCompute,分别定义MaxCompute数据列、分区列与日志服务字段的映射关系: MaxCompute 列类型 MaxCompute 列名(可自定义) MaxCompute 列类型(可自定义) 日志服务字段名(投递配置里填写) 日志服务字段类型 日志服务字段语义 数据列 log_source string __source__ 系统保留字段 日志来源的机器 IP。 log_time bigint __time__ 系统保留字段 日志的 Unix 时间戳(是从1970 年 1 月 1 日开始所经过的秒数),由用户日志的 time 字段计算得到。 log_topic string __topic__ 系统保留字段 日志主题。 time string time 日志内容字段 解析自日志。 ip string ip 日志内容字段 解析自日志。 thread string thread 日志内容字段 解析自日志。 log_extract_others string __extract_others__ 系统保留字段 未在配置中进行映射的其他日志内字段会通过 key-value 序列化到json,该 json 是一层结构,不支持字段内部 json 嵌套。 分区列 log_partition_time string __partition_time__ 系统保留字段 由日志的 time 字段对齐计算而得,分区粒度可配置,在配置项部分详述。 status string status 日志内容字段 解析自日志,该字段取值应该是可以枚举的,保证分区数目不会超出上限。 MaxCompute 表至少包含一个数据列、一个分区列。 系统保留字段中建议使用 __partition_time__,__source__,__topic__。 MaxCompute 单表有分区数目 6 万的限制,分区数超出后无法再写入数据,所以日志服务导入 MaxCompute表至多支持3个分区列。请谨慎选择自定义字段作为分区列,保证其值是可枚举的。 系统保留字段 __extract_others__ 历史上曾用名 _extract_others_,填写后者也是兼容的。 MaxCompute 分区列的值不支持”/“等特殊字符,这些是 MaxCompute 的保留字段。 MaxCompute 分区列取值不支持空,所以映射到分区列的字段必须要在日志里存在,空分区列的日志会在投递中被丢弃。 步骤3 配置投递规则 开启投递。 初始化数加平台之后,根据页面提示进入LogHub —— 数据投递页面,选择需要投递的Logstore,并单击开启投递。 您也可以在MaxCompute(原ODPS)投递管理页面选择需要投递的Logstore,并单击开启投递以进入LogHub —— 数据投递页面。 图 1. 开启投递 配置投递规则。 在 LogHub —— 数据投递页面配置 字段关联等相关内容。 图 2. 配置投递规则 配置项含义: 参数 语义 投递名称 自定义一个投递的名称,方便后续管理。 MaxCompute Project MaxCompute项目名称,该项默认为新创建的Project,如果已经是MaxCompute老客户,可以下拉选择已创建其他Project。 MaxCompute Table MaxCompute表名称,请输入自定义的新建的MaxCompute表名称或者选择已有的MaxCompute表。 MaxCompute 普通列 按序,左边填写与MaxCompute表数据列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 MaxCompute 分区列 按序,左边填写与MaxCompute表分区列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 分区时间格式 __partition_time__输出的日期格式,参考 Java SimpleDateFormat。 导入MaxCompute间隔 MaxCompute数据投递间隔,默认1800,单位:秒。 该步会默认为客户创建好新的MaxCompute Project和Table,其中如果已经是MaxCompute老客户,可以下拉选择其他已创建Project。 日志服务投递MaxCompute功能按照字段与列的顺序进行映射,修改MaxCompute表列名不影响数据导入,如更改MaxCompute表schema,请重新配置字段与列映射关系。 日志服务数据的一个字段最多允许映射到一个MaxCompute表的列(数据列或分区列),不支持字段冗余。 参考信息 __partition_time__ 格式 将日志时间作为分区字段,通过日期来筛选数据是MaxCompute常见的过滤数据方法。 __partition_time__ 是根据日志time字段值计算得到(不是日志写入服务端时间,也不是日志投递时间),结合分区时间格式,向下取整(为避免触发MaxCompute单表分区数目的限制,日期分区列的值会按照导入MaxCompute间隔对齐)计算出日期作为分区列。 举例来说,日志提取的time字段是“27/Jan/2016:20:50:13 +0800”,日志服务据此计算出保留字段__time__为1453899013(Unix时间戳),不同配置下的时间分区列取值如下: 导入MaxCompute间隔 分区时间格式 __partition_time__ 1800 yyyy_MM_dd_HH_mm_00 2016_01_27_20_30_00 1800 yyyy-MM-dd HH:mm 2016-01-27 20:30 1800 yyyyMMdd 20160127 3600 yyyyMMddHHmm 201601272000 3600 yyyy_MM_dd_HH 2016_01_27_20 请勿使用精确到秒的日期格式:1. 很容易导致单表的分区数目超过限制(6万);2. 单次投递任务的数据分区数目必须在512以内。 以上分区时间格式是测试通过的样例,您也可以参考Java SimpleDateFormat自己定义日期格式,但是该格式不得包含斜线字符”/“(这是MaxCompute的保留字段)。 __partition_time__ 使用方法 使用MaxCompute的字符串比较筛选数据,可以避免全表扫描。比如查询2016年1月26日一天内日志数据: select * from {ODPS_TABLE_NAME} where log_partition_time >= "2015_01_26" and log_partition_time < "2016_01_27"; __extract_others__使用方法 log_extract_others为一个json字符串,如果想获取该字段的user-agent内容,可以进行如下查询: select get_json_object(sls_extract_others, "$.user-agent") from {ODPS_TABLE_NAME} limit 10; 说明 get_json_object是MaxCompute提供的标准UDF。请联系MaxCompute团队开通使用该标准UDF的权限。 示例供参考,请以MaxCompute产品建议为最终标准。 其他操作 编辑投递配置 在Logstore列表投递项,单击“修改”即可针对之前的配置信息进行编辑。其中如果想新增列,可以在大数据计算服务MaxCompute(原ODPS)修改投递的数据表列信息,则点击“修改”后会加载最新的数据表信息。 投递任务管理 在启动投递功能后,日志服务后台会定期启动离线投递任务。用户可以在控制台上看到这些投递任务的状态和错误信息。具体请参考管理日志投递任务。 如果投递任务出现错误,控制台上会显示相应的错误信息: 错误信息 建议方案 MaxCompute项目空间不存在 在MaxCompute控制台中确认配置的MaxCompute项目是否存在,如果不存在则需要重新创建或配置。 MaxCompute表不存在 在MaxCompute控制台中确认配置的MaxCompute表是否存在,如果不存在则需要重新创建或配置。 MaxCompute项目空间或表没有向日志服务授权 在MaxCompute控制台中确认授权给日志服务账号的权限是否还存在,如果不存在则需要重新添加上相应权限。 MaxCompute错误 显示投递任务收到的MaxCompute错误,请参考MaxCompute相关文档或联系MaxCompute团队解决。日志服务会自动重试最近两天时间的失败任务。 日志服务导入字段配置无法匹配MaxCompute表的列 重新配置MaxCompute表格的列与日志服务数据字段的映射配置。 当投递任务发生错误时,请查看错误信息,问题解决后可以通过云控制台中“日志投递任务管理”或SDK来重试失败任务。 MaxCompute中消费日志 MaxCompute用户表中示例数据如下: | log_source | log_time | log_topic | time | ip | thread | log_extract_others | log_partition_time | status | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ | 10.10.*.* | 1453899013 | | 27/Jan/2016:20:50:13 +0800 | 10.10.*.* | 414579208 | {"url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1","user-agent":"aliyun-sdk-java"} | 2016_01_27_20_50 | 200 | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ 同时,我们推荐您直接使用已经与MaxCompute绑定的大数据开发Data IDE来进行可视化的BI分析及数据挖掘,这将提高数据加工的效率。 授予MaxCompute数据投递权限 如果在数加平台执行表删除重建动作,会导致默认授权失效。请手动重新为日志服务投递数据授权。 在MaxCompute项目空间下添加用户: ADD USER aliyun$shennong_open@aliyun.com; shennong_open@aliyun.com 是日志服务系统账号(请不要用自己的账号),授权目的是为了能将数据写入到MaxCompute MaxCompute项目空间Read/List权限授予: GRANT Read, List ON PROJECT {ODPS_PROJECT_NAME} TO USER aliyun$shennong_open@aliyun.com; MaxCompute项目空间的表Describe/Alter/Update权限授予: GRANT Describe, Alter, Update ON TABLE {ODPS_TABLE_NAME} TO USER aliyun$shennong_open@aliyun.com; 确认MaxCompute授权是否成功: SHOW GRANTS FOR aliyun$shennong_open@aliyun.com; A projects/{ODPS_PROJECT_NAME}: List | Read A projects/{ODPS_PROJECT_NAME}/tables/{ODPS_TABLE_NAME}: Describe | Alter | Update

2019-12-01 23:11:17 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 投递日志到 MaxCompute 是日志服务的一个功能,能够帮助您最大化数据价值。您可以自己决定对某个日志库是否启用该功能。一旦启用该功能,日志服务后台会定时把写入到该日志库内的日志投递到 MaxCompute 对应的表格中。 使用限制 数加控制台创建、修改投递配置必须由主账号完成,不支持子账号操作。 投递MaxCompute是批量任务,请谨慎设置分区列:保证一个同步任务内处理的数据分区数小于512个;用作分区列的字段值不能包括/等MaxCompute保留字段 。配置细节请参考下文投递配置说明。 不支持海外Region的MaxCompute投递,海外Region的MaxCompute请使用dataworks进行数据同步。国内Region投递支持如下: 日志服务Region MaxCompute Region 华北1 华东2 华北2 华北2、华东2 华北3 华东2 华北5 华东2 华东1 华东2 华东2 华东2 华南1 华南1、华东2 香港 华东2 功能优势 日志服务收集的日志除了可以被实时查询外,还可以把日志数据投递到大数据计算服务MaxCompute(原ODPS),进一步进行个性化BI分析及数据挖掘。通过日志服务投递日志数据到MaxCompute具有如下优势: 使用便捷 您只需要完成2步配置即可以把日志服务Logstore的日志数据迁移到MaxCompute中。 避免重复收集工作 由于日志服务的日志收集过程已经完成不同机器上的日志集中化,无需重复在不同机器上收集一遍日志数据后再导入到MaxCompute。 充分复用日志服务内的日志分类管理工作 用户可让日志服务中不同类型的日志(存在不同Logstore中)、不同Project的日志自动投递到不同的MaxCompute表格,方便管理及分析MaxCompute内的日志数据。 说明 一般情况下日志数据在写入Logstore后的1个小时导入到MaxCompute,您可以在控制台投递任务管理查看导入状态。导入成功后即可在MaxCompute内查看到相关日志数据。判断数据是否已完全投递请参考文档。 结合日志服务的实时消费,投递日志数据到MaxCompute的数据通道以及日志索引功能,可以让用户按照不同的场景和需求、以不同的方式复用数据,充分发挥日志数据的价值。 配置流程 举例日志服务的一条日志如下: 16年01月27日20时50分13秒 10.10.*.* ip:10.10.*.* status:200 thread:414579208 time:27/Jan/2016:20:50:13 +0800 url:POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1 user-agent:aliyun-sdk-java 日志左侧的ip、status、thread、time、url、user-agent等是日志服务数据的字段名称,需要在下方配置中应用到。 步骤1 初始化数加平台 在日志服务的控制台Logstore列表单击日志投递列的MaxCompute。 自动跳转到初始化数加平台的页面。MaxCompute默认为按量付费模式,具体参见MaxCompute文档说明。 查看服务协议和条款后单击确定,初始化数加平台。 初始化开通需10~20秒左右,请耐心等待。如果已经开通数加及大数据计算服务MaxCompute(原ODPS),将直接跳过该步骤。 步骤2 数据模型映射在日志服务和大数据计算服务MaxCompute(原ODPS)之间同步数据,涉及两个服务的数据模型映射问题。您可以参考日志服务日志数据结构了解数据结构。 将样例日志导入MaxCompute,分别定义MaxCompute数据列、分区列与日志服务字段的映射关系: MaxCompute 列类型 MaxCompute 列名(可自定义) MaxCompute 列类型(可自定义) 日志服务字段名(投递配置里填写) 日志服务字段类型 日志服务字段语义 数据列 log_source string __source__ 系统保留字段 日志来源的机器 IP。 log_time bigint __time__ 系统保留字段 日志的 Unix 时间戳(是从1970 年 1 月 1 日开始所经过的秒数),由用户日志的 time 字段计算得到。 log_topic string __topic__ 系统保留字段 日志主题。 time string time 日志内容字段 解析自日志。 ip string ip 日志内容字段 解析自日志。 thread string thread 日志内容字段 解析自日志。 log_extract_others string __extract_others__ 系统保留字段 未在配置中进行映射的其他日志内字段会通过 key-value 序列化到json,该 json 是一层结构,不支持字段内部 json 嵌套。 分区列 log_partition_time string __partition_time__ 系统保留字段 由日志的 time 字段对齐计算而得,分区粒度可配置,在配置项部分详述。 status string status 日志内容字段 解析自日志,该字段取值应该是可以枚举的,保证分区数目不会超出上限。 MaxCompute 表至少包含一个数据列、一个分区列。 系统保留字段中建议使用 __partition_time__,__source__,__topic__。 MaxCompute 单表有分区数目 6 万的限制,分区数超出后无法再写入数据,所以日志服务导入 MaxCompute表至多支持3个分区列。请谨慎选择自定义字段作为分区列,保证其值是可枚举的。 系统保留字段 __extract_others__ 历史上曾用名 _extract_others_,填写后者也是兼容的。 MaxCompute 分区列的值不支持”/“等特殊字符,这些是 MaxCompute 的保留字段。 MaxCompute 分区列取值不支持空,所以映射到分区列的字段必须要在日志里存在,空分区列的日志会在投递中被丢弃。 步骤3 配置投递规则 开启投递。 初始化数加平台之后,根据页面提示进入LogHub —— 数据投递页面,选择需要投递的Logstore,并单击开启投递。 您也可以在MaxCompute(原ODPS)投递管理页面选择需要投递的Logstore,并单击开启投递以进入LogHub —— 数据投递页面。 图 1. 开启投递 配置投递规则。 在 LogHub —— 数据投递页面配置 字段关联等相关内容。 图 2. 配置投递规则 配置项含义: 参数 语义 投递名称 自定义一个投递的名称,方便后续管理。 MaxCompute Project MaxCompute项目名称,该项默认为新创建的Project,如果已经是MaxCompute老客户,可以下拉选择已创建其他Project。 MaxCompute Table MaxCompute表名称,请输入自定义的新建的MaxCompute表名称或者选择已有的MaxCompute表。 MaxCompute 普通列 按序,左边填写与MaxCompute表数据列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 MaxCompute 分区列 按序,左边填写与MaxCompute表分区列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 分区时间格式 __partition_time__输出的日期格式,参考 Java SimpleDateFormat。 导入MaxCompute间隔 MaxCompute数据投递间隔,默认1800,单位:秒。 该步会默认为客户创建好新的MaxCompute Project和Table,其中如果已经是MaxCompute老客户,可以下拉选择其他已创建Project。 日志服务投递MaxCompute功能按照字段与列的顺序进行映射,修改MaxCompute表列名不影响数据导入,如更改MaxCompute表schema,请重新配置字段与列映射关系。 日志服务数据的一个字段最多允许映射到一个MaxCompute表的列(数据列或分区列),不支持字段冗余。 参考信息 __partition_time__ 格式 将日志时间作为分区字段,通过日期来筛选数据是MaxCompute常见的过滤数据方法。 __partition_time__ 是根据日志time字段值计算得到(不是日志写入服务端时间,也不是日志投递时间),结合分区时间格式,向下取整(为避免触发MaxCompute单表分区数目的限制,日期分区列的值会按照导入MaxCompute间隔对齐)计算出日期作为分区列。 举例来说,日志提取的time字段是“27/Jan/2016:20:50:13 +0800”,日志服务据此计算出保留字段__time__为1453899013(Unix时间戳),不同配置下的时间分区列取值如下: 导入MaxCompute间隔 分区时间格式 __partition_time__ 1800 yyyy_MM_dd_HH_mm_00 2016_01_27_20_30_00 1800 yyyy-MM-dd HH:mm 2016-01-27 20:30 1800 yyyyMMdd 20160127 3600 yyyyMMddHHmm 201601272000 3600 yyyy_MM_dd_HH 2016_01_27_20 请勿使用精确到秒的日期格式:1. 很容易导致单表的分区数目超过限制(6万);2. 单次投递任务的数据分区数目必须在512以内。 以上分区时间格式是测试通过的样例,您也可以参考Java SimpleDateFormat自己定义日期格式,但是该格式不得包含斜线字符”/“(这是MaxCompute的保留字段)。 __partition_time__ 使用方法 使用MaxCompute的字符串比较筛选数据,可以避免全表扫描。比如查询2016年1月26日一天内日志数据: select * from {ODPS_TABLE_NAME} where log_partition_time >= "2015_01_26" and log_partition_time < "2016_01_27"; __extract_others__使用方法 log_extract_others为一个json字符串,如果想获取该字段的user-agent内容,可以进行如下查询: select get_json_object(sls_extract_others, "$.user-agent") from {ODPS_TABLE_NAME} limit 10; 说明 get_json_object是MaxCompute提供的标准UDF。请联系MaxCompute团队开通使用该标准UDF的权限。 示例供参考,请以MaxCompute产品建议为最终标准。 其他操作 编辑投递配置 在Logstore列表投递项,单击“修改”即可针对之前的配置信息进行编辑。其中如果想新增列,可以在大数据计算服务MaxCompute(原ODPS)修改投递的数据表列信息,则点击“修改”后会加载最新的数据表信息。 投递任务管理 在启动投递功能后,日志服务后台会定期启动离线投递任务。用户可以在控制台上看到这些投递任务的状态和错误信息。具体请参考管理日志投递任务。 如果投递任务出现错误,控制台上会显示相应的错误信息: 错误信息 建议方案 MaxCompute项目空间不存在 在MaxCompute控制台中确认配置的MaxCompute项目是否存在,如果不存在则需要重新创建或配置。 MaxCompute表不存在 在MaxCompute控制台中确认配置的MaxCompute表是否存在,如果不存在则需要重新创建或配置。 MaxCompute项目空间或表没有向日志服务授权 在MaxCompute控制台中确认授权给日志服务账号的权限是否还存在,如果不存在则需要重新添加上相应权限。 MaxCompute错误 显示投递任务收到的MaxCompute错误,请参考MaxCompute相关文档或联系MaxCompute团队解决。日志服务会自动重试最近两天时间的失败任务。 日志服务导入字段配置无法匹配MaxCompute表的列 重新配置MaxCompute表格的列与日志服务数据字段的映射配置。 当投递任务发生错误时,请查看错误信息,问题解决后可以通过云控制台中“日志投递任务管理”或SDK来重试失败任务。 MaxCompute中消费日志 MaxCompute用户表中示例数据如下: | log_source | log_time | log_topic | time | ip | thread | log_extract_others | log_partition_time | status | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ | 10.10.*.* | 1453899013 | | 27/Jan/2016:20:50:13 +0800 | 10.10.*.* | 414579208 | {"url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1","user-agent":"aliyun-sdk-java"} | 2016_01_27_20_50 | 200 | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ 同时,我们推荐您直接使用已经与MaxCompute绑定的大数据开发Data IDE来进行可视化的BI分析及数据挖掘,这将提高数据加工的效率。 授予MaxCompute数据投递权限 如果在数加平台执行表删除重建动作,会导致默认授权失效。请手动重新为日志服务投递数据授权。 在MaxCompute项目空间下添加用户: ADD USER aliyun$shennong_open@aliyun.com; shennong_open@aliyun.com 是日志服务系统账号(请不要用自己的账号),授权目的是为了能将数据写入到MaxCompute MaxCompute项目空间Read/List权限授予: GRANT Read, List ON PROJECT {ODPS_PROJECT_NAME} TO USER aliyun$shennong_open@aliyun.com; MaxCompute项目空间的表Describe/Alter/Update权限授予: GRANT Describe, Alter, Update ON TABLE {ODPS_TABLE_NAME} TO USER aliyun$shennong_open@aliyun.com; 确认MaxCompute授权是否成功: SHOW GRANTS FOR aliyun$shennong_open@aliyun.com; A projects/{ODPS_PROJECT_NAME}: List | Read A projects/{ODPS_PROJECT_NAME}/tables/{ODPS_TABLE_NAME}: Describe | Alter | Update

2019-12-01 23:11:17 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 投递日志到 MaxCompute 是日志服务的一个功能,能够帮助您最大化数据价值。您可以自己决定对某个日志库是否启用该功能。一旦启用该功能,日志服务后台会定时把写入到该日志库内的日志投递到 MaxCompute 对应的表格中。 使用限制 数加控制台创建、修改投递配置必须由主账号完成,不支持子账号操作。 投递MaxCompute是批量任务,请谨慎设置分区列:保证一个同步任务内处理的数据分区数小于512个;用作分区列的字段值不能包括/等MaxCompute保留字段 。配置细节请参考下文投递配置说明。 不支持海外Region的MaxCompute投递,海外Region的MaxCompute请使用dataworks进行数据同步。国内Region投递支持如下: 日志服务Region MaxCompute Region 华北1 华东2 华北2 华北2、华东2 华北3 华东2 华北5 华东2 华东1 华东2 华东2 华东2 华南1 华南1、华东2 香港 华东2 功能优势 日志服务收集的日志除了可以被实时查询外,还可以把日志数据投递到大数据计算服务MaxCompute(原ODPS),进一步进行个性化BI分析及数据挖掘。通过日志服务投递日志数据到MaxCompute具有如下优势: 使用便捷 您只需要完成2步配置即可以把日志服务Logstore的日志数据迁移到MaxCompute中。 避免重复收集工作 由于日志服务的日志收集过程已经完成不同机器上的日志集中化,无需重复在不同机器上收集一遍日志数据后再导入到MaxCompute。 充分复用日志服务内的日志分类管理工作 用户可让日志服务中不同类型的日志(存在不同Logstore中)、不同Project的日志自动投递到不同的MaxCompute表格,方便管理及分析MaxCompute内的日志数据。 说明 一般情况下日志数据在写入Logstore后的1个小时导入到MaxCompute,您可以在控制台投递任务管理查看导入状态。导入成功后即可在MaxCompute内查看到相关日志数据。判断数据是否已完全投递请参考文档。 结合日志服务的实时消费,投递日志数据到MaxCompute的数据通道以及日志索引功能,可以让用户按照不同的场景和需求、以不同的方式复用数据,充分发挥日志数据的价值。 配置流程 举例日志服务的一条日志如下: 16年01月27日20时50分13秒 10.10.*.* ip:10.10.*.* status:200 thread:414579208 time:27/Jan/2016:20:50:13 +0800 url:POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1 user-agent:aliyun-sdk-java 日志左侧的ip、status、thread、time、url、user-agent等是日志服务数据的字段名称,需要在下方配置中应用到。 步骤1 初始化数加平台 在日志服务的控制台Logstore列表单击日志投递列的MaxCompute。 自动跳转到初始化数加平台的页面。MaxCompute默认为按量付费模式,具体参见MaxCompute文档说明。 查看服务协议和条款后单击确定,初始化数加平台。 初始化开通需10~20秒左右,请耐心等待。如果已经开通数加及大数据计算服务MaxCompute(原ODPS),将直接跳过该步骤。 步骤2 数据模型映射在日志服务和大数据计算服务MaxCompute(原ODPS)之间同步数据,涉及两个服务的数据模型映射问题。您可以参考日志服务日志数据结构了解数据结构。 将样例日志导入MaxCompute,分别定义MaxCompute数据列、分区列与日志服务字段的映射关系: MaxCompute 列类型 MaxCompute 列名(可自定义) MaxCompute 列类型(可自定义) 日志服务字段名(投递配置里填写) 日志服务字段类型 日志服务字段语义 数据列 log_source string __source__ 系统保留字段 日志来源的机器 IP。 log_time bigint __time__ 系统保留字段 日志的 Unix 时间戳(是从1970 年 1 月 1 日开始所经过的秒数),由用户日志的 time 字段计算得到。 log_topic string __topic__ 系统保留字段 日志主题。 time string time 日志内容字段 解析自日志。 ip string ip 日志内容字段 解析自日志。 thread string thread 日志内容字段 解析自日志。 log_extract_others string __extract_others__ 系统保留字段 未在配置中进行映射的其他日志内字段会通过 key-value 序列化到json,该 json 是一层结构,不支持字段内部 json 嵌套。 分区列 log_partition_time string __partition_time__ 系统保留字段 由日志的 time 字段对齐计算而得,分区粒度可配置,在配置项部分详述。 status string status 日志内容字段 解析自日志,该字段取值应该是可以枚举的,保证分区数目不会超出上限。 MaxCompute 表至少包含一个数据列、一个分区列。 系统保留字段中建议使用 __partition_time__,__source__,__topic__。 MaxCompute 单表有分区数目 6 万的限制,分区数超出后无法再写入数据,所以日志服务导入 MaxCompute表至多支持3个分区列。请谨慎选择自定义字段作为分区列,保证其值是可枚举的。 系统保留字段 __extract_others__ 历史上曾用名 _extract_others_,填写后者也是兼容的。 MaxCompute 分区列的值不支持”/“等特殊字符,这些是 MaxCompute 的保留字段。 MaxCompute 分区列取值不支持空,所以映射到分区列的字段必须要在日志里存在,空分区列的日志会在投递中被丢弃。 步骤3 配置投递规则 开启投递。 初始化数加平台之后,根据页面提示进入LogHub —— 数据投递页面,选择需要投递的Logstore,并单击开启投递。 您也可以在MaxCompute(原ODPS)投递管理页面选择需要投递的Logstore,并单击开启投递以进入LogHub —— 数据投递页面。 图 1. 开启投递 配置投递规则。 在 LogHub —— 数据投递页面配置 字段关联等相关内容。 图 2. 配置投递规则 配置项含义: 参数 语义 投递名称 自定义一个投递的名称,方便后续管理。 MaxCompute Project MaxCompute项目名称,该项默认为新创建的Project,如果已经是MaxCompute老客户,可以下拉选择已创建其他Project。 MaxCompute Table MaxCompute表名称,请输入自定义的新建的MaxCompute表名称或者选择已有的MaxCompute表。 MaxCompute 普通列 按序,左边填写与MaxCompute表数据列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 MaxCompute 分区列 按序,左边填写与MaxCompute表分区列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 分区时间格式 __partition_time__输出的日期格式,参考 Java SimpleDateFormat。 导入MaxCompute间隔 MaxCompute数据投递间隔,默认1800,单位:秒。 该步会默认为客户创建好新的MaxCompute Project和Table,其中如果已经是MaxCompute老客户,可以下拉选择其他已创建Project。 日志服务投递MaxCompute功能按照字段与列的顺序进行映射,修改MaxCompute表列名不影响数据导入,如更改MaxCompute表schema,请重新配置字段与列映射关系。 日志服务数据的一个字段最多允许映射到一个MaxCompute表的列(数据列或分区列),不支持字段冗余。 参考信息 __partition_time__ 格式 将日志时间作为分区字段,通过日期来筛选数据是MaxCompute常见的过滤数据方法。 __partition_time__ 是根据日志time字段值计算得到(不是日志写入服务端时间,也不是日志投递时间),结合分区时间格式,向下取整(为避免触发MaxCompute单表分区数目的限制,日期分区列的值会按照导入MaxCompute间隔对齐)计算出日期作为分区列。 举例来说,日志提取的time字段是“27/Jan/2016:20:50:13 +0800”,日志服务据此计算出保留字段__time__为1453899013(Unix时间戳),不同配置下的时间分区列取值如下: 导入MaxCompute间隔 分区时间格式 __partition_time__ 1800 yyyy_MM_dd_HH_mm_00 2016_01_27_20_30_00 1800 yyyy-MM-dd HH:mm 2016-01-27 20:30 1800 yyyyMMdd 20160127 3600 yyyyMMddHHmm 201601272000 3600 yyyy_MM_dd_HH 2016_01_27_20 请勿使用精确到秒的日期格式:1. 很容易导致单表的分区数目超过限制(6万);2. 单次投递任务的数据分区数目必须在512以内。 以上分区时间格式是测试通过的样例,您也可以参考Java SimpleDateFormat自己定义日期格式,但是该格式不得包含斜线字符”/“(这是MaxCompute的保留字段)。 __partition_time__ 使用方法 使用MaxCompute的字符串比较筛选数据,可以避免全表扫描。比如查询2016年1月26日一天内日志数据: select * from {ODPS_TABLE_NAME} where log_partition_time >= "2015_01_26" and log_partition_time < "2016_01_27"; __extract_others__使用方法 log_extract_others为一个json字符串,如果想获取该字段的user-agent内容,可以进行如下查询: select get_json_object(sls_extract_others, "$.user-agent") from {ODPS_TABLE_NAME} limit 10; 说明 get_json_object是MaxCompute提供的标准UDF。请联系MaxCompute团队开通使用该标准UDF的权限。 示例供参考,请以MaxCompute产品建议为最终标准。 其他操作 编辑投递配置 在Logstore列表投递项,单击“修改”即可针对之前的配置信息进行编辑。其中如果想新增列,可以在大数据计算服务MaxCompute(原ODPS)修改投递的数据表列信息,则点击“修改”后会加载最新的数据表信息。 投递任务管理 在启动投递功能后,日志服务后台会定期启动离线投递任务。用户可以在控制台上看到这些投递任务的状态和错误信息。具体请参考管理日志投递任务。 如果投递任务出现错误,控制台上会显示相应的错误信息: 错误信息 建议方案 MaxCompute项目空间不存在 在MaxCompute控制台中确认配置的MaxCompute项目是否存在,如果不存在则需要重新创建或配置。 MaxCompute表不存在 在MaxCompute控制台中确认配置的MaxCompute表是否存在,如果不存在则需要重新创建或配置。 MaxCompute项目空间或表没有向日志服务授权 在MaxCompute控制台中确认授权给日志服务账号的权限是否还存在,如果不存在则需要重新添加上相应权限。 MaxCompute错误 显示投递任务收到的MaxCompute错误,请参考MaxCompute相关文档或联系MaxCompute团队解决。日志服务会自动重试最近两天时间的失败任务。 日志服务导入字段配置无法匹配MaxCompute表的列 重新配置MaxCompute表格的列与日志服务数据字段的映射配置。 当投递任务发生错误时,请查看错误信息,问题解决后可以通过云控制台中“日志投递任务管理”或SDK来重试失败任务。 MaxCompute中消费日志 MaxCompute用户表中示例数据如下: | log_source | log_time | log_topic | time | ip | thread | log_extract_others | log_partition_time | status | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ | 10.10.*.* | 1453899013 | | 27/Jan/2016:20:50:13 +0800 | 10.10.*.* | 414579208 | {"url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1","user-agent":"aliyun-sdk-java"} | 2016_01_27_20_50 | 200 | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ 同时,我们推荐您直接使用已经与MaxCompute绑定的大数据开发Data IDE来进行可视化的BI分析及数据挖掘,这将提高数据加工的效率。 授予MaxCompute数据投递权限 如果在数加平台执行表删除重建动作,会导致默认授权失效。请手动重新为日志服务投递数据授权。 在MaxCompute项目空间下添加用户: ADD USER aliyun$shennong_open@aliyun.com; shennong_open@aliyun.com 是日志服务系统账号(请不要用自己的账号),授权目的是为了能将数据写入到MaxCompute MaxCompute项目空间Read/List权限授予: GRANT Read, List ON PROJECT {ODPS_PROJECT_NAME} TO USER aliyun$shennong_open@aliyun.com; MaxCompute项目空间的表Describe/Alter/Update权限授予: GRANT Describe, Alter, Update ON TABLE {ODPS_TABLE_NAME} TO USER aliyun$shennong_open@aliyun.com; 确认MaxCompute授权是否成功: SHOW GRANTS FOR aliyun$shennong_open@aliyun.com; A projects/{ODPS_PROJECT_NAME}: List | Read A projects/{ODPS_PROJECT_NAME}/tables/{ODPS_TABLE_NAME}: Describe | Alter | Update

2019-12-01 23:11:16 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 投递日志到 MaxCompute 是日志服务的一个功能,能够帮助您最大化数据价值。您可以自己决定对某个日志库是否启用该功能。一旦启用该功能,日志服务后台会定时把写入到该日志库内的日志投递到 MaxCompute 对应的表格中。 使用限制 数加控制台创建、修改投递配置必须由主账号完成,不支持子账号操作。 投递MaxCompute是批量任务,请谨慎设置分区列:保证一个同步任务内处理的数据分区数小于512个;用作分区列的字段值不能包括/等MaxCompute保留字段 。配置细节请参考下文投递配置说明。 不支持海外Region的MaxCompute投递,海外Region的MaxCompute请使用dataworks进行数据同步。国内Region投递支持如下: 日志服务Region MaxCompute Region 华北1 华东2 华北2 华北2、华东2 华北3 华东2 华北5 华东2 华东1 华东2 华东2 华东2 华南1 华南1、华东2 香港 华东2 功能优势 日志服务收集的日志除了可以被实时查询外,还可以把日志数据投递到大数据计算服务MaxCompute(原ODPS),进一步进行个性化BI分析及数据挖掘。通过日志服务投递日志数据到MaxCompute具有如下优势: 使用便捷 您只需要完成2步配置即可以把日志服务Logstore的日志数据迁移到MaxCompute中。 避免重复收集工作 由于日志服务的日志收集过程已经完成不同机器上的日志集中化,无需重复在不同机器上收集一遍日志数据后再导入到MaxCompute。 充分复用日志服务内的日志分类管理工作 用户可让日志服务中不同类型的日志(存在不同Logstore中)、不同Project的日志自动投递到不同的MaxCompute表格,方便管理及分析MaxCompute内的日志数据。 说明 一般情况下日志数据在写入Logstore后的1个小时导入到MaxCompute,您可以在控制台投递任务管理查看导入状态。导入成功后即可在MaxCompute内查看到相关日志数据。判断数据是否已完全投递请参考文档。 结合日志服务的实时消费,投递日志数据到MaxCompute的数据通道以及日志索引功能,可以让用户按照不同的场景和需求、以不同的方式复用数据,充分发挥日志数据的价值。 配置流程 举例日志服务的一条日志如下: 16年01月27日20时50分13秒 10.10.*.* ip:10.10.*.* status:200 thread:414579208 time:27/Jan/2016:20:50:13 +0800 url:POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1 user-agent:aliyun-sdk-java 日志左侧的ip、status、thread、time、url、user-agent等是日志服务数据的字段名称,需要在下方配置中应用到。 步骤1 初始化数加平台 在日志服务的控制台Logstore列表单击日志投递列的MaxCompute。 自动跳转到初始化数加平台的页面。MaxCompute默认为按量付费模式,具体参见MaxCompute文档说明。 查看服务协议和条款后单击确定,初始化数加平台。 初始化开通需10~20秒左右,请耐心等待。如果已经开通数加及大数据计算服务MaxCompute(原ODPS),将直接跳过该步骤。 步骤2 数据模型映射在日志服务和大数据计算服务MaxCompute(原ODPS)之间同步数据,涉及两个服务的数据模型映射问题。您可以参考日志服务日志数据结构了解数据结构。 将样例日志导入MaxCompute,分别定义MaxCompute数据列、分区列与日志服务字段的映射关系: MaxCompute 列类型 MaxCompute 列名(可自定义) MaxCompute 列类型(可自定义) 日志服务字段名(投递配置里填写) 日志服务字段类型 日志服务字段语义 数据列 log_source string __source__ 系统保留字段 日志来源的机器 IP。 log_time bigint __time__ 系统保留字段 日志的 Unix 时间戳(是从1970 年 1 月 1 日开始所经过的秒数),由用户日志的 time 字段计算得到。 log_topic string __topic__ 系统保留字段 日志主题。 time string time 日志内容字段 解析自日志。 ip string ip 日志内容字段 解析自日志。 thread string thread 日志内容字段 解析自日志。 log_extract_others string __extract_others__ 系统保留字段 未在配置中进行映射的其他日志内字段会通过 key-value 序列化到json,该 json 是一层结构,不支持字段内部 json 嵌套。 分区列 log_partition_time string __partition_time__ 系统保留字段 由日志的 time 字段对齐计算而得,分区粒度可配置,在配置项部分详述。 status string status 日志内容字段 解析自日志,该字段取值应该是可以枚举的,保证分区数目不会超出上限。 MaxCompute 表至少包含一个数据列、一个分区列。 系统保留字段中建议使用 __partition_time__,__source__,__topic__。 MaxCompute 单表有分区数目 6 万的限制,分区数超出后无法再写入数据,所以日志服务导入 MaxCompute表至多支持3个分区列。请谨慎选择自定义字段作为分区列,保证其值是可枚举的。 系统保留字段 __extract_others__ 历史上曾用名 _extract_others_,填写后者也是兼容的。 MaxCompute 分区列的值不支持”/“等特殊字符,这些是 MaxCompute 的保留字段。 MaxCompute 分区列取值不支持空,所以映射到分区列的字段必须要在日志里存在,空分区列的日志会在投递中被丢弃。 步骤3 配置投递规则 开启投递。 初始化数加平台之后,根据页面提示进入LogHub —— 数据投递页面,选择需要投递的Logstore,并单击开启投递。 您也可以在MaxCompute(原ODPS)投递管理页面选择需要投递的Logstore,并单击开启投递以进入LogHub —— 数据投递页面。 图 1. 开启投递 配置投递规则。 在 LogHub —— 数据投递页面配置 字段关联等相关内容。 图 2. 配置投递规则 配置项含义: 参数 语义 投递名称 自定义一个投递的名称,方便后续管理。 MaxCompute Project MaxCompute项目名称,该项默认为新创建的Project,如果已经是MaxCompute老客户,可以下拉选择已创建其他Project。 MaxCompute Table MaxCompute表名称,请输入自定义的新建的MaxCompute表名称或者选择已有的MaxCompute表。 MaxCompute 普通列 按序,左边填写与MaxCompute表数据列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 MaxCompute 分区列 按序,左边填写与MaxCompute表分区列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 分区时间格式 __partition_time__输出的日期格式,参考 Java SimpleDateFormat。 导入MaxCompute间隔 MaxCompute数据投递间隔,默认1800,单位:秒。 该步会默认为客户创建好新的MaxCompute Project和Table,其中如果已经是MaxCompute老客户,可以下拉选择其他已创建Project。 日志服务投递MaxCompute功能按照字段与列的顺序进行映射,修改MaxCompute表列名不影响数据导入,如更改MaxCompute表schema,请重新配置字段与列映射关系。 日志服务数据的一个字段最多允许映射到一个MaxCompute表的列(数据列或分区列),不支持字段冗余。 参考信息 __partition_time__ 格式 将日志时间作为分区字段,通过日期来筛选数据是MaxCompute常见的过滤数据方法。 __partition_time__ 是根据日志time字段值计算得到(不是日志写入服务端时间,也不是日志投递时间),结合分区时间格式,向下取整(为避免触发MaxCompute单表分区数目的限制,日期分区列的值会按照导入MaxCompute间隔对齐)计算出日期作为分区列。 举例来说,日志提取的time字段是“27/Jan/2016:20:50:13 +0800”,日志服务据此计算出保留字段__time__为1453899013(Unix时间戳),不同配置下的时间分区列取值如下: 导入MaxCompute间隔 分区时间格式 __partition_time__ 1800 yyyy_MM_dd_HH_mm_00 2016_01_27_20_30_00 1800 yyyy-MM-dd HH:mm 2016-01-27 20:30 1800 yyyyMMdd 20160127 3600 yyyyMMddHHmm 201601272000 3600 yyyy_MM_dd_HH 2016_01_27_20 请勿使用精确到秒的日期格式:1. 很容易导致单表的分区数目超过限制(6万);2. 单次投递任务的数据分区数目必须在512以内。 以上分区时间格式是测试通过的样例,您也可以参考Java SimpleDateFormat自己定义日期格式,但是该格式不得包含斜线字符”/“(这是MaxCompute的保留字段)。 __partition_time__ 使用方法 使用MaxCompute的字符串比较筛选数据,可以避免全表扫描。比如查询2016年1月26日一天内日志数据: select * from {ODPS_TABLE_NAME} where log_partition_time >= "2015_01_26" and log_partition_time < "2016_01_27"; __extract_others__使用方法 log_extract_others为一个json字符串,如果想获取该字段的user-agent内容,可以进行如下查询: select get_json_object(sls_extract_others, "$.user-agent") from {ODPS_TABLE_NAME} limit 10; 说明 get_json_object是MaxCompute提供的标准UDF。请联系MaxCompute团队开通使用该标准UDF的权限。 示例供参考,请以MaxCompute产品建议为最终标准。 其他操作 编辑投递配置 在Logstore列表投递项,单击“修改”即可针对之前的配置信息进行编辑。其中如果想新增列,可以在大数据计算服务MaxCompute(原ODPS)修改投递的数据表列信息,则点击“修改”后会加载最新的数据表信息。 投递任务管理 在启动投递功能后,日志服务后台会定期启动离线投递任务。用户可以在控制台上看到这些投递任务的状态和错误信息。具体请参考管理日志投递任务。 如果投递任务出现错误,控制台上会显示相应的错误信息: 错误信息 建议方案 MaxCompute项目空间不存在 在MaxCompute控制台中确认配置的MaxCompute项目是否存在,如果不存在则需要重新创建或配置。 MaxCompute表不存在 在MaxCompute控制台中确认配置的MaxCompute表是否存在,如果不存在则需要重新创建或配置。 MaxCompute项目空间或表没有向日志服务授权 在MaxCompute控制台中确认授权给日志服务账号的权限是否还存在,如果不存在则需要重新添加上相应权限。 MaxCompute错误 显示投递任务收到的MaxCompute错误,请参考MaxCompute相关文档或联系MaxCompute团队解决。日志服务会自动重试最近两天时间的失败任务。 日志服务导入字段配置无法匹配MaxCompute表的列 重新配置MaxCompute表格的列与日志服务数据字段的映射配置。 当投递任务发生错误时,请查看错误信息,问题解决后可以通过云控制台中“日志投递任务管理”或SDK来重试失败任务。 MaxCompute中消费日志 MaxCompute用户表中示例数据如下: | log_source | log_time | log_topic | time | ip | thread | log_extract_others | log_partition_time | status | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ | 10.10.*.* | 1453899013 | | 27/Jan/2016:20:50:13 +0800 | 10.10.*.* | 414579208 | {"url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1","user-agent":"aliyun-sdk-java"} | 2016_01_27_20_50 | 200 | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ 同时,我们推荐您直接使用已经与MaxCompute绑定的大数据开发Data IDE来进行可视化的BI分析及数据挖掘,这将提高数据加工的效率。 授予MaxCompute数据投递权限 如果在数加平台执行表删除重建动作,会导致默认授权失效。请手动重新为日志服务投递数据授权。 在MaxCompute项目空间下添加用户: ADD USER aliyun$shennong_open@aliyun.com; shennong_open@aliyun.com 是日志服务系统账号(请不要用自己的账号),授权目的是为了能将数据写入到MaxCompute MaxCompute项目空间Read/List权限授予: GRANT Read, List ON PROJECT {ODPS_PROJECT_NAME} TO USER aliyun$shennong_open@aliyun.com; MaxCompute项目空间的表Describe/Alter/Update权限授予: GRANT Describe, Alter, Update ON TABLE {ODPS_TABLE_NAME} TO USER aliyun$shennong_open@aliyun.com; 确认MaxCompute授权是否成功: SHOW GRANTS FOR aliyun$shennong_open@aliyun.com; A projects/{ODPS_PROJECT_NAME}: List | Read A projects/{ODPS_PROJECT_NAME}/tables/{ODPS_TABLE_NAME}: Describe | Alter | Update

2019-12-01 23:11:18 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 投递日志到 MaxCompute 是日志服务的一个功能,能够帮助您最大化数据价值。您可以自己决定对某个日志库是否启用该功能。一旦启用该功能,日志服务后台会定时把写入到该日志库内的日志投递到 MaxCompute 对应的表格中。 使用限制 数加控制台创建、修改投递配置必须由主账号完成,不支持子账号操作。 投递MaxCompute是批量任务,请谨慎设置分区列:保证一个同步任务内处理的数据分区数小于512个;用作分区列的字段值不能包括/等MaxCompute保留字段 。配置细节请参考下文投递配置说明。 不支持海外Region的MaxCompute投递,海外Region的MaxCompute请使用dataworks进行数据同步。国内Region投递支持如下: 日志服务Region MaxCompute Region 华北1 华东2 华北2 华北2、华东2 华北3 华东2 华北5 华东2 华东1 华东2 华东2 华东2 华南1 华南1、华东2 香港 华东2 功能优势 日志服务收集的日志除了可以被实时查询外,还可以把日志数据投递到大数据计算服务MaxCompute(原ODPS),进一步进行个性化BI分析及数据挖掘。通过日志服务投递日志数据到MaxCompute具有如下优势: 使用便捷 您只需要完成2步配置即可以把日志服务Logstore的日志数据迁移到MaxCompute中。 避免重复收集工作 由于日志服务的日志收集过程已经完成不同机器上的日志集中化,无需重复在不同机器上收集一遍日志数据后再导入到MaxCompute。 充分复用日志服务内的日志分类管理工作 用户可让日志服务中不同类型的日志(存在不同Logstore中)、不同Project的日志自动投递到不同的MaxCompute表格,方便管理及分析MaxCompute内的日志数据。 说明 一般情况下日志数据在写入Logstore后的1个小时导入到MaxCompute,您可以在控制台投递任务管理查看导入状态。导入成功后即可在MaxCompute内查看到相关日志数据。判断数据是否已完全投递请参考文档。 结合日志服务的实时消费,投递日志数据到MaxCompute的数据通道以及日志索引功能,可以让用户按照不同的场景和需求、以不同的方式复用数据,充分发挥日志数据的价值。 配置流程 举例日志服务的一条日志如下: 16年01月27日20时50分13秒 10.10.*.* ip:10.10.*.* status:200 thread:414579208 time:27/Jan/2016:20:50:13 +0800 url:POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1 user-agent:aliyun-sdk-java 日志左侧的ip、status、thread、time、url、user-agent等是日志服务数据的字段名称,需要在下方配置中应用到。 步骤1 初始化数加平台 在日志服务的控制台Logstore列表单击日志投递列的MaxCompute。 自动跳转到初始化数加平台的页面。MaxCompute默认为按量付费模式,具体参见MaxCompute文档说明。 查看服务协议和条款后单击确定,初始化数加平台。 初始化开通需10~20秒左右,请耐心等待。如果已经开通数加及大数据计算服务MaxCompute(原ODPS),将直接跳过该步骤。 步骤2 数据模型映射在日志服务和大数据计算服务MaxCompute(原ODPS)之间同步数据,涉及两个服务的数据模型映射问题。您可以参考日志服务日志数据结构了解数据结构。 将样例日志导入MaxCompute,分别定义MaxCompute数据列、分区列与日志服务字段的映射关系: MaxCompute 列类型 MaxCompute 列名(可自定义) MaxCompute 列类型(可自定义) 日志服务字段名(投递配置里填写) 日志服务字段类型 日志服务字段语义 数据列 log_source string __source__ 系统保留字段 日志来源的机器 IP。 log_time bigint __time__ 系统保留字段 日志的 Unix 时间戳(是从1970 年 1 月 1 日开始所经过的秒数),由用户日志的 time 字段计算得到。 log_topic string __topic__ 系统保留字段 日志主题。 time string time 日志内容字段 解析自日志。 ip string ip 日志内容字段 解析自日志。 thread string thread 日志内容字段 解析自日志。 log_extract_others string __extract_others__ 系统保留字段 未在配置中进行映射的其他日志内字段会通过 key-value 序列化到json,该 json 是一层结构,不支持字段内部 json 嵌套。 分区列 log_partition_time string __partition_time__ 系统保留字段 由日志的 time 字段对齐计算而得,分区粒度可配置,在配置项部分详述。 status string status 日志内容字段 解析自日志,该字段取值应该是可以枚举的,保证分区数目不会超出上限。 MaxCompute 表至少包含一个数据列、一个分区列。 系统保留字段中建议使用 __partition_time__,__source__,__topic__。 MaxCompute 单表有分区数目 6 万的限制,分区数超出后无法再写入数据,所以日志服务导入 MaxCompute表至多支持3个分区列。请谨慎选择自定义字段作为分区列,保证其值是可枚举的。 系统保留字段 __extract_others__ 历史上曾用名 _extract_others_,填写后者也是兼容的。 MaxCompute 分区列的值不支持”/“等特殊字符,这些是 MaxCompute 的保留字段。 MaxCompute 分区列取值不支持空,所以映射到分区列的字段必须要在日志里存在,空分区列的日志会在投递中被丢弃。 步骤3 配置投递规则 开启投递。 初始化数加平台之后,根据页面提示进入LogHub —— 数据投递页面,选择需要投递的Logstore,并单击开启投递。 您也可以在MaxCompute(原ODPS)投递管理页面选择需要投递的Logstore,并单击开启投递以进入LogHub —— 数据投递页面。 图 1. 开启投递 配置投递规则。 在 LogHub —— 数据投递页面配置 字段关联等相关内容。 图 2. 配置投递规则 配置项含义: 参数 语义 投递名称 自定义一个投递的名称,方便后续管理。 MaxCompute Project MaxCompute项目名称,该项默认为新创建的Project,如果已经是MaxCompute老客户,可以下拉选择已创建其他Project。 MaxCompute Table MaxCompute表名称,请输入自定义的新建的MaxCompute表名称或者选择已有的MaxCompute表。 MaxCompute 普通列 按序,左边填写与MaxCompute表数据列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 MaxCompute 分区列 按序,左边填写与MaxCompute表分区列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 分区时间格式 __partition_time__输出的日期格式,参考 Java SimpleDateFormat。 导入MaxCompute间隔 MaxCompute数据投递间隔,默认1800,单位:秒。 该步会默认为客户创建好新的MaxCompute Project和Table,其中如果已经是MaxCompute老客户,可以下拉选择其他已创建Project。 日志服务投递MaxCompute功能按照字段与列的顺序进行映射,修改MaxCompute表列名不影响数据导入,如更改MaxCompute表schema,请重新配置字段与列映射关系。 日志服务数据的一个字段最多允许映射到一个MaxCompute表的列(数据列或分区列),不支持字段冗余。 参考信息 __partition_time__ 格式 将日志时间作为分区字段,通过日期来筛选数据是MaxCompute常见的过滤数据方法。 __partition_time__ 是根据日志time字段值计算得到(不是日志写入服务端时间,也不是日志投递时间),结合分区时间格式,向下取整(为避免触发MaxCompute单表分区数目的限制,日期分区列的值会按照导入MaxCompute间隔对齐)计算出日期作为分区列。 举例来说,日志提取的time字段是“27/Jan/2016:20:50:13 +0800”,日志服务据此计算出保留字段__time__为1453899013(Unix时间戳),不同配置下的时间分区列取值如下: 导入MaxCompute间隔 分区时间格式 __partition_time__ 1800 yyyy_MM_dd_HH_mm_00 2016_01_27_20_30_00 1800 yyyy-MM-dd HH:mm 2016-01-27 20:30 1800 yyyyMMdd 20160127 3600 yyyyMMddHHmm 201601272000 3600 yyyy_MM_dd_HH 2016_01_27_20 请勿使用精确到秒的日期格式:1. 很容易导致单表的分区数目超过限制(6万);2. 单次投递任务的数据分区数目必须在512以内。 以上分区时间格式是测试通过的样例,您也可以参考Java SimpleDateFormat自己定义日期格式,但是该格式不得包含斜线字符”/“(这是MaxCompute的保留字段)。 __partition_time__ 使用方法 使用MaxCompute的字符串比较筛选数据,可以避免全表扫描。比如查询2016年1月26日一天内日志数据: select * from {ODPS_TABLE_NAME} where log_partition_time >= "2015_01_26" and log_partition_time < "2016_01_27"; __extract_others__使用方法 log_extract_others为一个json字符串,如果想获取该字段的user-agent内容,可以进行如下查询: select get_json_object(sls_extract_others, "$.user-agent") from {ODPS_TABLE_NAME} limit 10; 说明 get_json_object是MaxCompute提供的标准UDF。请联系MaxCompute团队开通使用该标准UDF的权限。 示例供参考,请以MaxCompute产品建议为最终标准。 其他操作 编辑投递配置 在Logstore列表投递项,单击“修改”即可针对之前的配置信息进行编辑。其中如果想新增列,可以在大数据计算服务MaxCompute(原ODPS)修改投递的数据表列信息,则点击“修改”后会加载最新的数据表信息。 投递任务管理 在启动投递功能后,日志服务后台会定期启动离线投递任务。用户可以在控制台上看到这些投递任务的状态和错误信息。具体请参考管理日志投递任务。 如果投递任务出现错误,控制台上会显示相应的错误信息: 错误信息 建议方案 MaxCompute项目空间不存在 在MaxCompute控制台中确认配置的MaxCompute项目是否存在,如果不存在则需要重新创建或配置。 MaxCompute表不存在 在MaxCompute控制台中确认配置的MaxCompute表是否存在,如果不存在则需要重新创建或配置。 MaxCompute项目空间或表没有向日志服务授权 在MaxCompute控制台中确认授权给日志服务账号的权限是否还存在,如果不存在则需要重新添加上相应权限。 MaxCompute错误 显示投递任务收到的MaxCompute错误,请参考MaxCompute相关文档或联系MaxCompute团队解决。日志服务会自动重试最近两天时间的失败任务。 日志服务导入字段配置无法匹配MaxCompute表的列 重新配置MaxCompute表格的列与日志服务数据字段的映射配置。 当投递任务发生错误时,请查看错误信息,问题解决后可以通过云控制台中“日志投递任务管理”或SDK来重试失败任务。 MaxCompute中消费日志 MaxCompute用户表中示例数据如下: | log_source | log_time | log_topic | time | ip | thread | log_extract_others | log_partition_time | status | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ | 10.10.*.* | 1453899013 | | 27/Jan/2016:20:50:13 +0800 | 10.10.*.* | 414579208 | {"url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1","user-agent":"aliyun-sdk-java"} | 2016_01_27_20_50 | 200 | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ 同时,我们推荐您直接使用已经与MaxCompute绑定的大数据开发Data IDE来进行可视化的BI分析及数据挖掘,这将提高数据加工的效率。 授予MaxCompute数据投递权限 如果在数加平台执行表删除重建动作,会导致默认授权失效。请手动重新为日志服务投递数据授权。 在MaxCompute项目空间下添加用户: ADD USER aliyun$shennong_open@aliyun.com; shennong_open@aliyun.com 是日志服务系统账号(请不要用自己的账号),授权目的是为了能将数据写入到MaxCompute MaxCompute项目空间Read/List权限授予: GRANT Read, List ON PROJECT {ODPS_PROJECT_NAME} TO USER aliyun$shennong_open@aliyun.com; MaxCompute项目空间的表Describe/Alter/Update权限授予: GRANT Describe, Alter, Update ON TABLE {ODPS_TABLE_NAME} TO USER aliyun$shennong_open@aliyun.com; 确认MaxCompute授权是否成功: SHOW GRANTS FOR aliyun$shennong_open@aliyun.com; A projects/{ODPS_PROJECT_NAME}: List | Read A projects/{ODPS_PROJECT_NAME}/tables/{ODPS_TABLE_NAME}: Describe | Alter | Update

2019-12-01 23:11:17 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 投递日志到 MaxCompute 是日志服务的一个功能,能够帮助您最大化数据价值。您可以自己决定对某个日志库是否启用该功能。一旦启用该功能,日志服务后台会定时把写入到该日志库内的日志投递到 MaxCompute 对应的表格中。 使用限制 数加控制台创建、修改投递配置必须由主账号完成,不支持子账号操作。 投递MaxCompute是批量任务,请谨慎设置分区列:保证一个同步任务内处理的数据分区数小于512个;用作分区列的字段值不能包括/等MaxCompute保留字段 。配置细节请参考下文投递配置说明。 不支持海外Region的MaxCompute投递,海外Region的MaxCompute请使用dataworks进行数据同步。国内Region投递支持如下: 日志服务Region MaxCompute Region 华北1 华东2 华北2 华北2、华东2 华北3 华东2 华北5 华东2 华东1 华东2 华东2 华东2 华南1 华南1、华东2 香港 华东2 功能优势 日志服务收集的日志除了可以被实时查询外,还可以把日志数据投递到大数据计算服务MaxCompute(原ODPS),进一步进行个性化BI分析及数据挖掘。通过日志服务投递日志数据到MaxCompute具有如下优势: 使用便捷 您只需要完成2步配置即可以把日志服务Logstore的日志数据迁移到MaxCompute中。 避免重复收集工作 由于日志服务的日志收集过程已经完成不同机器上的日志集中化,无需重复在不同机器上收集一遍日志数据后再导入到MaxCompute。 充分复用日志服务内的日志分类管理工作 用户可让日志服务中不同类型的日志(存在不同Logstore中)、不同Project的日志自动投递到不同的MaxCompute表格,方便管理及分析MaxCompute内的日志数据。 说明 一般情况下日志数据在写入Logstore后的1个小时导入到MaxCompute,您可以在控制台投递任务管理查看导入状态。导入成功后即可在MaxCompute内查看到相关日志数据。判断数据是否已完全投递请参考文档。 结合日志服务的实时消费,投递日志数据到MaxCompute的数据通道以及日志索引功能,可以让用户按照不同的场景和需求、以不同的方式复用数据,充分发挥日志数据的价值。 配置流程 举例日志服务的一条日志如下: 16年01月27日20时50分13秒 10.10.*.* ip:10.10.*.* status:200 thread:414579208 time:27/Jan/2016:20:50:13 +0800 url:POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1 user-agent:aliyun-sdk-java 日志左侧的ip、status、thread、time、url、user-agent等是日志服务数据的字段名称,需要在下方配置中应用到。 步骤1 初始化数加平台 在日志服务的控制台Logstore列表单击日志投递列的MaxCompute。 自动跳转到初始化数加平台的页面。MaxCompute默认为按量付费模式,具体参见MaxCompute文档说明。 查看服务协议和条款后单击确定,初始化数加平台。 初始化开通需10~20秒左右,请耐心等待。如果已经开通数加及大数据计算服务MaxCompute(原ODPS),将直接跳过该步骤。 步骤2 数据模型映射在日志服务和大数据计算服务MaxCompute(原ODPS)之间同步数据,涉及两个服务的数据模型映射问题。您可以参考日志服务日志数据结构了解数据结构。 将样例日志导入MaxCompute,分别定义MaxCompute数据列、分区列与日志服务字段的映射关系: MaxCompute 列类型 MaxCompute 列名(可自定义) MaxCompute 列类型(可自定义) 日志服务字段名(投递配置里填写) 日志服务字段类型 日志服务字段语义 数据列 log_source string __source__ 系统保留字段 日志来源的机器 IP。 log_time bigint __time__ 系统保留字段 日志的 Unix 时间戳(是从1970 年 1 月 1 日开始所经过的秒数),由用户日志的 time 字段计算得到。 log_topic string __topic__ 系统保留字段 日志主题。 time string time 日志内容字段 解析自日志。 ip string ip 日志内容字段 解析自日志。 thread string thread 日志内容字段 解析自日志。 log_extract_others string __extract_others__ 系统保留字段 未在配置中进行映射的其他日志内字段会通过 key-value 序列化到json,该 json 是一层结构,不支持字段内部 json 嵌套。 分区列 log_partition_time string __partition_time__ 系统保留字段 由日志的 time 字段对齐计算而得,分区粒度可配置,在配置项部分详述。 status string status 日志内容字段 解析自日志,该字段取值应该是可以枚举的,保证分区数目不会超出上限。 MaxCompute 表至少包含一个数据列、一个分区列。 系统保留字段中建议使用 __partition_time__,__source__,__topic__。 MaxCompute 单表有分区数目 6 万的限制,分区数超出后无法再写入数据,所以日志服务导入 MaxCompute表至多支持3个分区列。请谨慎选择自定义字段作为分区列,保证其值是可枚举的。 系统保留字段 __extract_others__ 历史上曾用名 _extract_others_,填写后者也是兼容的。 MaxCompute 分区列的值不支持”/“等特殊字符,这些是 MaxCompute 的保留字段。 MaxCompute 分区列取值不支持空,所以映射到分区列的字段必须要在日志里存在,空分区列的日志会在投递中被丢弃。 步骤3 配置投递规则 开启投递。 初始化数加平台之后,根据页面提示进入LogHub —— 数据投递页面,选择需要投递的Logstore,并单击开启投递。 您也可以在MaxCompute(原ODPS)投递管理页面选择需要投递的Logstore,并单击开启投递以进入LogHub —— 数据投递页面。 图 1. 开启投递 配置投递规则。 在 LogHub —— 数据投递页面配置 字段关联等相关内容。 图 2. 配置投递规则 配置项含义: 参数 语义 投递名称 自定义一个投递的名称,方便后续管理。 MaxCompute Project MaxCompute项目名称,该项默认为新创建的Project,如果已经是MaxCompute老客户,可以下拉选择已创建其他Project。 MaxCompute Table MaxCompute表名称,请输入自定义的新建的MaxCompute表名称或者选择已有的MaxCompute表。 MaxCompute 普通列 按序,左边填写与MaxCompute表数据列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 MaxCompute 分区列 按序,左边填写与MaxCompute表分区列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 分区时间格式 __partition_time__输出的日期格式,参考 Java SimpleDateFormat。 导入MaxCompute间隔 MaxCompute数据投递间隔,默认1800,单位:秒。 该步会默认为客户创建好新的MaxCompute Project和Table,其中如果已经是MaxCompute老客户,可以下拉选择其他已创建Project。 日志服务投递MaxCompute功能按照字段与列的顺序进行映射,修改MaxCompute表列名不影响数据导入,如更改MaxCompute表schema,请重新配置字段与列映射关系。 日志服务数据的一个字段最多允许映射到一个MaxCompute表的列(数据列或分区列),不支持字段冗余。 参考信息 __partition_time__ 格式 将日志时间作为分区字段,通过日期来筛选数据是MaxCompute常见的过滤数据方法。 __partition_time__ 是根据日志time字段值计算得到(不是日志写入服务端时间,也不是日志投递时间),结合分区时间格式,向下取整(为避免触发MaxCompute单表分区数目的限制,日期分区列的值会按照导入MaxCompute间隔对齐)计算出日期作为分区列。 举例来说,日志提取的time字段是“27/Jan/2016:20:50:13 +0800”,日志服务据此计算出保留字段__time__为1453899013(Unix时间戳),不同配置下的时间分区列取值如下: 导入MaxCompute间隔 分区时间格式 __partition_time__ 1800 yyyy_MM_dd_HH_mm_00 2016_01_27_20_30_00 1800 yyyy-MM-dd HH:mm 2016-01-27 20:30 1800 yyyyMMdd 20160127 3600 yyyyMMddHHmm 201601272000 3600 yyyy_MM_dd_HH 2016_01_27_20 请勿使用精确到秒的日期格式:1. 很容易导致单表的分区数目超过限制(6万);2. 单次投递任务的数据分区数目必须在512以内。 以上分区时间格式是测试通过的样例,您也可以参考Java SimpleDateFormat自己定义日期格式,但是该格式不得包含斜线字符”/“(这是MaxCompute的保留字段)。 __partition_time__ 使用方法 使用MaxCompute的字符串比较筛选数据,可以避免全表扫描。比如查询2016年1月26日一天内日志数据: select * from {ODPS_TABLE_NAME} where log_partition_time >= "2015_01_26" and log_partition_time < "2016_01_27"; __extract_others__使用方法 log_extract_others为一个json字符串,如果想获取该字段的user-agent内容,可以进行如下查询: select get_json_object(sls_extract_others, "$.user-agent") from {ODPS_TABLE_NAME} limit 10; 说明 get_json_object是MaxCompute提供的标准UDF。请联系MaxCompute团队开通使用该标准UDF的权限。 示例供参考,请以MaxCompute产品建议为最终标准。 其他操作 编辑投递配置 在Logstore列表投递项,单击“修改”即可针对之前的配置信息进行编辑。其中如果想新增列,可以在大数据计算服务MaxCompute(原ODPS)修改投递的数据表列信息,则点击“修改”后会加载最新的数据表信息。 投递任务管理 在启动投递功能后,日志服务后台会定期启动离线投递任务。用户可以在控制台上看到这些投递任务的状态和错误信息。具体请参考管理日志投递任务。 如果投递任务出现错误,控制台上会显示相应的错误信息: 错误信息 建议方案 MaxCompute项目空间不存在 在MaxCompute控制台中确认配置的MaxCompute项目是否存在,如果不存在则需要重新创建或配置。 MaxCompute表不存在 在MaxCompute控制台中确认配置的MaxCompute表是否存在,如果不存在则需要重新创建或配置。 MaxCompute项目空间或表没有向日志服务授权 在MaxCompute控制台中确认授权给日志服务账号的权限是否还存在,如果不存在则需要重新添加上相应权限。 MaxCompute错误 显示投递任务收到的MaxCompute错误,请参考MaxCompute相关文档或联系MaxCompute团队解决。日志服务会自动重试最近两天时间的失败任务。 日志服务导入字段配置无法匹配MaxCompute表的列 重新配置MaxCompute表格的列与日志服务数据字段的映射配置。 当投递任务发生错误时,请查看错误信息,问题解决后可以通过云控制台中“日志投递任务管理”或SDK来重试失败任务。 MaxCompute中消费日志 MaxCompute用户表中示例数据如下: | log_source | log_time | log_topic | time | ip | thread | log_extract_others | log_partition_time | status | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ | 10.10.*.* | 1453899013 | | 27/Jan/2016:20:50:13 +0800 | 10.10.*.* | 414579208 | {"url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1","user-agent":"aliyun-sdk-java"} | 2016_01_27_20_50 | 200 | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ 同时,我们推荐您直接使用已经与MaxCompute绑定的大数据开发Data IDE来进行可视化的BI分析及数据挖掘,这将提高数据加工的效率。 授予MaxCompute数据投递权限 如果在数加平台执行表删除重建动作,会导致默认授权失效。请手动重新为日志服务投递数据授权。 在MaxCompute项目空间下添加用户: ADD USER aliyun$shennong_open@aliyun.com; shennong_open@aliyun.com 是日志服务系统账号(请不要用自己的账号),授权目的是为了能将数据写入到MaxCompute MaxCompute项目空间Read/List权限授予: GRANT Read, List ON PROJECT {ODPS_PROJECT_NAME} TO USER aliyun$shennong_open@aliyun.com; MaxCompute项目空间的表Describe/Alter/Update权限授予: GRANT Describe, Alter, Update ON TABLE {ODPS_TABLE_NAME} TO USER aliyun$shennong_open@aliyun.com; 确认MaxCompute授权是否成功: SHOW GRANTS FOR aliyun$shennong_open@aliyun.com; A projects/{ODPS_PROJECT_NAME}: List | Read A projects/{ODPS_PROJECT_NAME}/tables/{ODPS_TABLE_NAME}: Describe | Alter | Update

2019-12-01 23:11:16 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 投递日志到 MaxCompute 是日志服务的一个功能,能够帮助您最大化数据价值。您可以自己决定对某个日志库是否启用该功能。一旦启用该功能,日志服务后台会定时把写入到该日志库内的日志投递到 MaxCompute 对应的表格中。 使用限制 数加控制台创建、修改投递配置必须由主账号完成,不支持子账号操作。 投递MaxCompute是批量任务,请谨慎设置分区列:保证一个同步任务内处理的数据分区数小于512个;用作分区列的字段值不能包括/等MaxCompute保留字段 。配置细节请参考下文投递配置说明。 不支持海外Region的MaxCompute投递,海外Region的MaxCompute请使用dataworks进行数据同步。国内Region投递支持如下: 日志服务Region MaxCompute Region 华北1 华东2 华北2 华北2、华东2 华北3 华东2 华北5 华东2 华东1 华东2 华东2 华东2 华南1 华南1、华东2 香港 华东2 功能优势 日志服务收集的日志除了可以被实时查询外,还可以把日志数据投递到大数据计算服务MaxCompute(原ODPS),进一步进行个性化BI分析及数据挖掘。通过日志服务投递日志数据到MaxCompute具有如下优势: 使用便捷 您只需要完成2步配置即可以把日志服务Logstore的日志数据迁移到MaxCompute中。 避免重复收集工作 由于日志服务的日志收集过程已经完成不同机器上的日志集中化,无需重复在不同机器上收集一遍日志数据后再导入到MaxCompute。 充分复用日志服务内的日志分类管理工作 用户可让日志服务中不同类型的日志(存在不同Logstore中)、不同Project的日志自动投递到不同的MaxCompute表格,方便管理及分析MaxCompute内的日志数据。 说明 一般情况下日志数据在写入Logstore后的1个小时导入到MaxCompute,您可以在控制台投递任务管理查看导入状态。导入成功后即可在MaxCompute内查看到相关日志数据。判断数据是否已完全投递请参考文档。 结合日志服务的实时消费,投递日志数据到MaxCompute的数据通道以及日志索引功能,可以让用户按照不同的场景和需求、以不同的方式复用数据,充分发挥日志数据的价值。 配置流程 举例日志服务的一条日志如下: 16年01月27日20时50分13秒 10.10.*.* ip:10.10.*.* status:200 thread:414579208 time:27/Jan/2016:20:50:13 +0800 url:POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1 user-agent:aliyun-sdk-java 日志左侧的ip、status、thread、time、url、user-agent等是日志服务数据的字段名称,需要在下方配置中应用到。 步骤1 初始化数加平台 在日志服务的控制台Logstore列表单击日志投递列的MaxCompute。 自动跳转到初始化数加平台的页面。MaxCompute默认为按量付费模式,具体参见MaxCompute文档说明。 查看服务协议和条款后单击确定,初始化数加平台。 初始化开通需10~20秒左右,请耐心等待。如果已经开通数加及大数据计算服务MaxCompute(原ODPS),将直接跳过该步骤。 步骤2 数据模型映射在日志服务和大数据计算服务MaxCompute(原ODPS)之间同步数据,涉及两个服务的数据模型映射问题。您可以参考日志服务日志数据结构了解数据结构。 将样例日志导入MaxCompute,分别定义MaxCompute数据列、分区列与日志服务字段的映射关系: MaxCompute 列类型 MaxCompute 列名(可自定义) MaxCompute 列类型(可自定义) 日志服务字段名(投递配置里填写) 日志服务字段类型 日志服务字段语义 数据列 log_source string __source__ 系统保留字段 日志来源的机器 IP。 log_time bigint __time__ 系统保留字段 日志的 Unix 时间戳(是从1970 年 1 月 1 日开始所经过的秒数),由用户日志的 time 字段计算得到。 log_topic string __topic__ 系统保留字段 日志主题。 time string time 日志内容字段 解析自日志。 ip string ip 日志内容字段 解析自日志。 thread string thread 日志内容字段 解析自日志。 log_extract_others string __extract_others__ 系统保留字段 未在配置中进行映射的其他日志内字段会通过 key-value 序列化到json,该 json 是一层结构,不支持字段内部 json 嵌套。 分区列 log_partition_time string __partition_time__ 系统保留字段 由日志的 time 字段对齐计算而得,分区粒度可配置,在配置项部分详述。 status string status 日志内容字段 解析自日志,该字段取值应该是可以枚举的,保证分区数目不会超出上限。 MaxCompute 表至少包含一个数据列、一个分区列。 系统保留字段中建议使用 __partition_time__,__source__,__topic__。 MaxCompute 单表有分区数目 6 万的限制,分区数超出后无法再写入数据,所以日志服务导入 MaxCompute表至多支持3个分区列。请谨慎选择自定义字段作为分区列,保证其值是可枚举的。 系统保留字段 __extract_others__ 历史上曾用名 _extract_others_,填写后者也是兼容的。 MaxCompute 分区列的值不支持”/“等特殊字符,这些是 MaxCompute 的保留字段。 MaxCompute 分区列取值不支持空,所以映射到分区列的字段必须要在日志里存在,空分区列的日志会在投递中被丢弃。 步骤3 配置投递规则 开启投递。 初始化数加平台之后,根据页面提示进入LogHub —— 数据投递页面,选择需要投递的Logstore,并单击开启投递。 您也可以在MaxCompute(原ODPS)投递管理页面选择需要投递的Logstore,并单击开启投递以进入LogHub —— 数据投递页面。 图 1. 开启投递 配置投递规则。 在 LogHub —— 数据投递页面配置 字段关联等相关内容。 图 2. 配置投递规则 配置项含义: 参数 语义 投递名称 自定义一个投递的名称,方便后续管理。 MaxCompute Project MaxCompute项目名称,该项默认为新创建的Project,如果已经是MaxCompute老客户,可以下拉选择已创建其他Project。 MaxCompute Table MaxCompute表名称,请输入自定义的新建的MaxCompute表名称或者选择已有的MaxCompute表。 MaxCompute 普通列 按序,左边填写与MaxCompute表数据列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 MaxCompute 分区列 按序,左边填写与MaxCompute表分区列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 分区时间格式 __partition_time__输出的日期格式,参考 Java SimpleDateFormat。 导入MaxCompute间隔 MaxCompute数据投递间隔,默认1800,单位:秒。 该步会默认为客户创建好新的MaxCompute Project和Table,其中如果已经是MaxCompute老客户,可以下拉选择其他已创建Project。 日志服务投递MaxCompute功能按照字段与列的顺序进行映射,修改MaxCompute表列名不影响数据导入,如更改MaxCompute表schema,请重新配置字段与列映射关系。 日志服务数据的一个字段最多允许映射到一个MaxCompute表的列(数据列或分区列),不支持字段冗余。 参考信息 __partition_time__ 格式 将日志时间作为分区字段,通过日期来筛选数据是MaxCompute常见的过滤数据方法。 __partition_time__ 是根据日志time字段值计算得到(不是日志写入服务端时间,也不是日志投递时间),结合分区时间格式,向下取整(为避免触发MaxCompute单表分区数目的限制,日期分区列的值会按照导入MaxCompute间隔对齐)计算出日期作为分区列。 举例来说,日志提取的time字段是“27/Jan/2016:20:50:13 +0800”,日志服务据此计算出保留字段__time__为1453899013(Unix时间戳),不同配置下的时间分区列取值如下: 导入MaxCompute间隔 分区时间格式 __partition_time__ 1800 yyyy_MM_dd_HH_mm_00 2016_01_27_20_30_00 1800 yyyy-MM-dd HH:mm 2016-01-27 20:30 1800 yyyyMMdd 20160127 3600 yyyyMMddHHmm 201601272000 3600 yyyy_MM_dd_HH 2016_01_27_20 请勿使用精确到秒的日期格式:1. 很容易导致单表的分区数目超过限制(6万);2. 单次投递任务的数据分区数目必须在512以内。 以上分区时间格式是测试通过的样例,您也可以参考Java SimpleDateFormat自己定义日期格式,但是该格式不得包含斜线字符”/“(这是MaxCompute的保留字段)。 __partition_time__ 使用方法 使用MaxCompute的字符串比较筛选数据,可以避免全表扫描。比如查询2016年1月26日一天内日志数据: select * from {ODPS_TABLE_NAME} where log_partition_time >= "2015_01_26" and log_partition_time < "2016_01_27"; __extract_others__使用方法 log_extract_others为一个json字符串,如果想获取该字段的user-agent内容,可以进行如下查询: select get_json_object(sls_extract_others, "$.user-agent") from {ODPS_TABLE_NAME} limit 10; 说明 get_json_object是MaxCompute提供的标准UDF。请联系MaxCompute团队开通使用该标准UDF的权限。 示例供参考,请以MaxCompute产品建议为最终标准。 其他操作 编辑投递配置 在Logstore列表投递项,单击“修改”即可针对之前的配置信息进行编辑。其中如果想新增列,可以在大数据计算服务MaxCompute(原ODPS)修改投递的数据表列信息,则点击“修改”后会加载最新的数据表信息。 投递任务管理 在启动投递功能后,日志服务后台会定期启动离线投递任务。用户可以在控制台上看到这些投递任务的状态和错误信息。具体请参考管理日志投递任务。 如果投递任务出现错误,控制台上会显示相应的错误信息: 错误信息 建议方案 MaxCompute项目空间不存在 在MaxCompute控制台中确认配置的MaxCompute项目是否存在,如果不存在则需要重新创建或配置。 MaxCompute表不存在 在MaxCompute控制台中确认配置的MaxCompute表是否存在,如果不存在则需要重新创建或配置。 MaxCompute项目空间或表没有向日志服务授权 在MaxCompute控制台中确认授权给日志服务账号的权限是否还存在,如果不存在则需要重新添加上相应权限。 MaxCompute错误 显示投递任务收到的MaxCompute错误,请参考MaxCompute相关文档或联系MaxCompute团队解决。日志服务会自动重试最近两天时间的失败任务。 日志服务导入字段配置无法匹配MaxCompute表的列 重新配置MaxCompute表格的列与日志服务数据字段的映射配置。 当投递任务发生错误时,请查看错误信息,问题解决后可以通过云控制台中“日志投递任务管理”或SDK来重试失败任务。 MaxCompute中消费日志 MaxCompute用户表中示例数据如下: | log_source | log_time | log_topic | time | ip | thread | log_extract_others | log_partition_time | status | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ | 10.10.*.* | 1453899013 | | 27/Jan/2016:20:50:13 +0800 | 10.10.*.* | 414579208 | {"url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1","user-agent":"aliyun-sdk-java"} | 2016_01_27_20_50 | 200 | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ 同时,我们推荐您直接使用已经与MaxCompute绑定的大数据开发Data IDE来进行可视化的BI分析及数据挖掘,这将提高数据加工的效率。 授予MaxCompute数据投递权限 如果在数加平台执行表删除重建动作,会导致默认授权失效。请手动重新为日志服务投递数据授权。 在MaxCompute项目空间下添加用户: ADD USER aliyun$shennong_open@aliyun.com; shennong_open@aliyun.com 是日志服务系统账号(请不要用自己的账号),授权目的是为了能将数据写入到MaxCompute MaxCompute项目空间Read/List权限授予: GRANT Read, List ON PROJECT {ODPS_PROJECT_NAME} TO USER aliyun$shennong_open@aliyun.com; MaxCompute项目空间的表Describe/Alter/Update权限授予: GRANT Describe, Alter, Update ON TABLE {ODPS_TABLE_NAME} TO USER aliyun$shennong_open@aliyun.com; 确认MaxCompute授权是否成功: SHOW GRANTS FOR aliyun$shennong_open@aliyun.com; A projects/{ODPS_PROJECT_NAME}: List | Read A projects/{ODPS_PROJECT_NAME}/tables/{ODPS_TABLE_NAME}: Describe | Alter | Update

2019-12-01 23:11:15 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 投递日志到 MaxCompute 是日志服务的一个功能,能够帮助您最大化数据价值。您可以自己决定对某个日志库是否启用该功能。一旦启用该功能,日志服务后台会定时把写入到该日志库内的日志投递到 MaxCompute 对应的表格中。 使用限制 数加控制台创建、修改投递配置必须由主账号完成,不支持子账号操作。 投递MaxCompute是批量任务,请谨慎设置分区列:保证一个同步任务内处理的数据分区数小于512个;用作分区列的字段值不能包括/等MaxCompute保留字段 。配置细节请参考下文投递配置说明。 不支持海外Region的MaxCompute投递,海外Region的MaxCompute请使用dataworks进行数据同步。国内Region投递支持如下: 日志服务Region MaxCompute Region 华北1 华东2 华北2 华北2、华东2 华北3 华东2 华北5 华东2 华东1 华东2 华东2 华东2 华南1 华南1、华东2 香港 华东2 功能优势 日志服务收集的日志除了可以被实时查询外,还可以把日志数据投递到大数据计算服务MaxCompute(原ODPS),进一步进行个性化BI分析及数据挖掘。通过日志服务投递日志数据到MaxCompute具有如下优势: 使用便捷 您只需要完成2步配置即可以把日志服务Logstore的日志数据迁移到MaxCompute中。 避免重复收集工作 由于日志服务的日志收集过程已经完成不同机器上的日志集中化,无需重复在不同机器上收集一遍日志数据后再导入到MaxCompute。 充分复用日志服务内的日志分类管理工作 用户可让日志服务中不同类型的日志(存在不同Logstore中)、不同Project的日志自动投递到不同的MaxCompute表格,方便管理及分析MaxCompute内的日志数据。 说明 一般情况下日志数据在写入Logstore后的1个小时导入到MaxCompute,您可以在控制台投递任务管理查看导入状态。导入成功后即可在MaxCompute内查看到相关日志数据。判断数据是否已完全投递请参考文档。 结合日志服务的实时消费,投递日志数据到MaxCompute的数据通道以及日志索引功能,可以让用户按照不同的场景和需求、以不同的方式复用数据,充分发挥日志数据的价值。 配置流程 举例日志服务的一条日志如下: 16年01月27日20时50分13秒 10.10.*.* ip:10.10.*.* status:200 thread:414579208 time:27/Jan/2016:20:50:13 +0800 url:POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1 user-agent:aliyun-sdk-java 日志左侧的ip、status、thread、time、url、user-agent等是日志服务数据的字段名称,需要在下方配置中应用到。 步骤1 初始化数加平台 在日志服务的控制台Logstore列表单击日志投递列的MaxCompute。 自动跳转到初始化数加平台的页面。MaxCompute默认为按量付费模式,具体参见MaxCompute文档说明。 查看服务协议和条款后单击确定,初始化数加平台。 初始化开通需10~20秒左右,请耐心等待。如果已经开通数加及大数据计算服务MaxCompute(原ODPS),将直接跳过该步骤。 步骤2 数据模型映射在日志服务和大数据计算服务MaxCompute(原ODPS)之间同步数据,涉及两个服务的数据模型映射问题。您可以参考日志服务日志数据结构了解数据结构。 将样例日志导入MaxCompute,分别定义MaxCompute数据列、分区列与日志服务字段的映射关系: MaxCompute 列类型 MaxCompute 列名(可自定义) MaxCompute 列类型(可自定义) 日志服务字段名(投递配置里填写) 日志服务字段类型 日志服务字段语义 数据列 log_source string __source__ 系统保留字段 日志来源的机器 IP。 log_time bigint __time__ 系统保留字段 日志的 Unix 时间戳(是从1970 年 1 月 1 日开始所经过的秒数),由用户日志的 time 字段计算得到。 log_topic string __topic__ 系统保留字段 日志主题。 time string time 日志内容字段 解析自日志。 ip string ip 日志内容字段 解析自日志。 thread string thread 日志内容字段 解析自日志。 log_extract_others string __extract_others__ 系统保留字段 未在配置中进行映射的其他日志内字段会通过 key-value 序列化到json,该 json 是一层结构,不支持字段内部 json 嵌套。 分区列 log_partition_time string __partition_time__ 系统保留字段 由日志的 time 字段对齐计算而得,分区粒度可配置,在配置项部分详述。 status string status 日志内容字段 解析自日志,该字段取值应该是可以枚举的,保证分区数目不会超出上限。 MaxCompute 表至少包含一个数据列、一个分区列。 系统保留字段中建议使用 __partition_time__,__source__,__topic__。 MaxCompute 单表有分区数目 6 万的限制,分区数超出后无法再写入数据,所以日志服务导入 MaxCompute表至多支持3个分区列。请谨慎选择自定义字段作为分区列,保证其值是可枚举的。 系统保留字段 __extract_others__ 历史上曾用名 _extract_others_,填写后者也是兼容的。 MaxCompute 分区列的值不支持”/“等特殊字符,这些是 MaxCompute 的保留字段。 MaxCompute 分区列取值不支持空,所以映射到分区列的字段必须要在日志里存在,空分区列的日志会在投递中被丢弃。 步骤3 配置投递规则 开启投递。 初始化数加平台之后,根据页面提示进入LogHub —— 数据投递页面,选择需要投递的Logstore,并单击开启投递。 您也可以在MaxCompute(原ODPS)投递管理页面选择需要投递的Logstore,并单击开启投递以进入LogHub —— 数据投递页面。 图 1. 开启投递 配置投递规则。 在 LogHub —— 数据投递页面配置 字段关联等相关内容。 图 2. 配置投递规则 配置项含义: 参数 语义 投递名称 自定义一个投递的名称,方便后续管理。 MaxCompute Project MaxCompute项目名称,该项默认为新创建的Project,如果已经是MaxCompute老客户,可以下拉选择已创建其他Project。 MaxCompute Table MaxCompute表名称,请输入自定义的新建的MaxCompute表名称或者选择已有的MaxCompute表。 MaxCompute 普通列 按序,左边填写与MaxCompute表数据列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 MaxCompute 分区列 按序,左边填写与MaxCompute表分区列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 分区时间格式 __partition_time__输出的日期格式,参考 Java SimpleDateFormat。 导入MaxCompute间隔 MaxCompute数据投递间隔,默认1800,单位:秒。 该步会默认为客户创建好新的MaxCompute Project和Table,其中如果已经是MaxCompute老客户,可以下拉选择其他已创建Project。 日志服务投递MaxCompute功能按照字段与列的顺序进行映射,修改MaxCompute表列名不影响数据导入,如更改MaxCompute表schema,请重新配置字段与列映射关系。 日志服务数据的一个字段最多允许映射到一个MaxCompute表的列(数据列或分区列),不支持字段冗余。 参考信息 __partition_time__ 格式 将日志时间作为分区字段,通过日期来筛选数据是MaxCompute常见的过滤数据方法。 __partition_time__ 是根据日志time字段值计算得到(不是日志写入服务端时间,也不是日志投递时间),结合分区时间格式,向下取整(为避免触发MaxCompute单表分区数目的限制,日期分区列的值会按照导入MaxCompute间隔对齐)计算出日期作为分区列。 举例来说,日志提取的time字段是“27/Jan/2016:20:50:13 +0800”,日志服务据此计算出保留字段__time__为1453899013(Unix时间戳),不同配置下的时间分区列取值如下: 导入MaxCompute间隔 分区时间格式 __partition_time__ 1800 yyyy_MM_dd_HH_mm_00 2016_01_27_20_30_00 1800 yyyy-MM-dd HH:mm 2016-01-27 20:30 1800 yyyyMMdd 20160127 3600 yyyyMMddHHmm 201601272000 3600 yyyy_MM_dd_HH 2016_01_27_20 请勿使用精确到秒的日期格式:1. 很容易导致单表的分区数目超过限制(6万);2. 单次投递任务的数据分区数目必须在512以内。 以上分区时间格式是测试通过的样例,您也可以参考Java SimpleDateFormat自己定义日期格式,但是该格式不得包含斜线字符”/“(这是MaxCompute的保留字段)。 __partition_time__ 使用方法 使用MaxCompute的字符串比较筛选数据,可以避免全表扫描。比如查询2016年1月26日一天内日志数据: select * from {ODPS_TABLE_NAME} where log_partition_time >= "2015_01_26" and log_partition_time < "2016_01_27"; __extract_others__使用方法 log_extract_others为一个json字符串,如果想获取该字段的user-agent内容,可以进行如下查询: select get_json_object(sls_extract_others, "$.user-agent") from {ODPS_TABLE_NAME} limit 10; 说明 get_json_object是MaxCompute提供的标准UDF。请联系MaxCompute团队开通使用该标准UDF的权限。 示例供参考,请以MaxCompute产品建议为最终标准。 其他操作 编辑投递配置 在Logstore列表投递项,单击“修改”即可针对之前的配置信息进行编辑。其中如果想新增列,可以在大数据计算服务MaxCompute(原ODPS)修改投递的数据表列信息,则点击“修改”后会加载最新的数据表信息。 投递任务管理 在启动投递功能后,日志服务后台会定期启动离线投递任务。用户可以在控制台上看到这些投递任务的状态和错误信息。具体请参考管理日志投递任务。 如果投递任务出现错误,控制台上会显示相应的错误信息: 错误信息 建议方案 MaxCompute项目空间不存在 在MaxCompute控制台中确认配置的MaxCompute项目是否存在,如果不存在则需要重新创建或配置。 MaxCompute表不存在 在MaxCompute控制台中确认配置的MaxCompute表是否存在,如果不存在则需要重新创建或配置。 MaxCompute项目空间或表没有向日志服务授权 在MaxCompute控制台中确认授权给日志服务账号的权限是否还存在,如果不存在则需要重新添加上相应权限。 MaxCompute错误 显示投递任务收到的MaxCompute错误,请参考MaxCompute相关文档或联系MaxCompute团队解决。日志服务会自动重试最近两天时间的失败任务。 日志服务导入字段配置无法匹配MaxCompute表的列 重新配置MaxCompute表格的列与日志服务数据字段的映射配置。 当投递任务发生错误时,请查看错误信息,问题解决后可以通过云控制台中“日志投递任务管理”或SDK来重试失败任务。 MaxCompute中消费日志 MaxCompute用户表中示例数据如下: | log_source | log_time | log_topic | time | ip | thread | log_extract_others | log_partition_time | status | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ | 10.10.*.* | 1453899013 | | 27/Jan/2016:20:50:13 +0800 | 10.10.*.* | 414579208 | {"url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1","user-agent":"aliyun-sdk-java"} | 2016_01_27_20_50 | 200 | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ 同时,我们推荐您直接使用已经与MaxCompute绑定的大数据开发Data IDE来进行可视化的BI分析及数据挖掘,这将提高数据加工的效率。 授予MaxCompute数据投递权限 如果在数加平台执行表删除重建动作,会导致默认授权失效。请手动重新为日志服务投递数据授权。 在MaxCompute项目空间下添加用户: ADD USER aliyun$shennong_open@aliyun.com; shennong_open@aliyun.com 是日志服务系统账号(请不要用自己的账号),授权目的是为了能将数据写入到MaxCompute MaxCompute项目空间Read/List权限授予: GRANT Read, List ON PROJECT {ODPS_PROJECT_NAME} TO USER aliyun$shennong_open@aliyun.com; MaxCompute项目空间的表Describe/Alter/Update权限授予: GRANT Describe, Alter, Update ON TABLE {ODPS_TABLE_NAME} TO USER aliyun$shennong_open@aliyun.com; 确认MaxCompute授权是否成功: SHOW GRANTS FOR aliyun$shennong_open@aliyun.com; A projects/{ODPS_PROJECT_NAME}: List | Read A projects/{ODPS_PROJECT_NAME}/tables/{ODPS_TABLE_NAME}: Describe | Alter | Update

2019-12-01 23:11:15 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 投递日志到 MaxCompute 是日志服务的一个功能,能够帮助您最大化数据价值。您可以自己决定对某个日志库是否启用该功能。一旦启用该功能,日志服务后台会定时把写入到该日志库内的日志投递到 MaxCompute 对应的表格中。 使用限制 数加控制台创建、修改投递配置必须由主账号完成,不支持子账号操作。 投递MaxCompute是批量任务,请谨慎设置分区列:保证一个同步任务内处理的数据分区数小于512个;用作分区列的字段值不能包括/等MaxCompute保留字段 。配置细节请参考下文投递配置说明。 不支持海外Region的MaxCompute投递,海外Region的MaxCompute请使用dataworks进行数据同步。国内Region投递支持如下: 日志服务Region MaxCompute Region 华北1 华东2 华北2 华北2、华东2 华北3 华东2 华北5 华东2 华东1 华东2 华东2 华东2 华南1 华南1、华东2 香港 华东2 功能优势 日志服务收集的日志除了可以被实时查询外,还可以把日志数据投递到大数据计算服务MaxCompute(原ODPS),进一步进行个性化BI分析及数据挖掘。通过日志服务投递日志数据到MaxCompute具有如下优势: 使用便捷 您只需要完成2步配置即可以把日志服务Logstore的日志数据迁移到MaxCompute中。 避免重复收集工作 由于日志服务的日志收集过程已经完成不同机器上的日志集中化,无需重复在不同机器上收集一遍日志数据后再导入到MaxCompute。 充分复用日志服务内的日志分类管理工作 用户可让日志服务中不同类型的日志(存在不同Logstore中)、不同Project的日志自动投递到不同的MaxCompute表格,方便管理及分析MaxCompute内的日志数据。 说明 一般情况下日志数据在写入Logstore后的1个小时导入到MaxCompute,您可以在控制台投递任务管理查看导入状态。导入成功后即可在MaxCompute内查看到相关日志数据。判断数据是否已完全投递请参考文档。 结合日志服务的实时消费,投递日志数据到MaxCompute的数据通道以及日志索引功能,可以让用户按照不同的场景和需求、以不同的方式复用数据,充分发挥日志数据的价值。 配置流程 举例日志服务的一条日志如下: 16年01月27日20时50分13秒 10.10.*.* ip:10.10.*.* status:200 thread:414579208 time:27/Jan/2016:20:50:13 +0800 url:POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1 user-agent:aliyun-sdk-java 日志左侧的ip、status、thread、time、url、user-agent等是日志服务数据的字段名称,需要在下方配置中应用到。 步骤1 初始化数加平台 在日志服务的控制台Logstore列表单击日志投递列的MaxCompute。 自动跳转到初始化数加平台的页面。MaxCompute默认为按量付费模式,具体参见MaxCompute文档说明。 查看服务协议和条款后单击确定,初始化数加平台。 初始化开通需10~20秒左右,请耐心等待。如果已经开通数加及大数据计算服务MaxCompute(原ODPS),将直接跳过该步骤。 步骤2 数据模型映射在日志服务和大数据计算服务MaxCompute(原ODPS)之间同步数据,涉及两个服务的数据模型映射问题。您可以参考日志服务日志数据结构了解数据结构。 将样例日志导入MaxCompute,分别定义MaxCompute数据列、分区列与日志服务字段的映射关系: MaxCompute 列类型 MaxCompute 列名(可自定义) MaxCompute 列类型(可自定义) 日志服务字段名(投递配置里填写) 日志服务字段类型 日志服务字段语义 数据列 log_source string __source__ 系统保留字段 日志来源的机器 IP。 log_time bigint __time__ 系统保留字段 日志的 Unix 时间戳(是从1970 年 1 月 1 日开始所经过的秒数),由用户日志的 time 字段计算得到。 log_topic string __topic__ 系统保留字段 日志主题。 time string time 日志内容字段 解析自日志。 ip string ip 日志内容字段 解析自日志。 thread string thread 日志内容字段 解析自日志。 log_extract_others string __extract_others__ 系统保留字段 未在配置中进行映射的其他日志内字段会通过 key-value 序列化到json,该 json 是一层结构,不支持字段内部 json 嵌套。 分区列 log_partition_time string __partition_time__ 系统保留字段 由日志的 time 字段对齐计算而得,分区粒度可配置,在配置项部分详述。 status string status 日志内容字段 解析自日志,该字段取值应该是可以枚举的,保证分区数目不会超出上限。 MaxCompute 表至少包含一个数据列、一个分区列。 系统保留字段中建议使用 __partition_time__,__source__,__topic__。 MaxCompute 单表有分区数目 6 万的限制,分区数超出后无法再写入数据,所以日志服务导入 MaxCompute表至多支持3个分区列。请谨慎选择自定义字段作为分区列,保证其值是可枚举的。 系统保留字段 __extract_others__ 历史上曾用名 _extract_others_,填写后者也是兼容的。 MaxCompute 分区列的值不支持”/“等特殊字符,这些是 MaxCompute 的保留字段。 MaxCompute 分区列取值不支持空,所以映射到分区列的字段必须要在日志里存在,空分区列的日志会在投递中被丢弃。 步骤3 配置投递规则 开启投递。 初始化数加平台之后,根据页面提示进入LogHub —— 数据投递页面,选择需要投递的Logstore,并单击开启投递。 您也可以在MaxCompute(原ODPS)投递管理页面选择需要投递的Logstore,并单击开启投递以进入LogHub —— 数据投递页面。 图 1. 开启投递 配置投递规则。 在 LogHub —— 数据投递页面配置 字段关联等相关内容。 图 2. 配置投递规则 配置项含义: 参数 语义 投递名称 自定义一个投递的名称,方便后续管理。 MaxCompute Project MaxCompute项目名称,该项默认为新创建的Project,如果已经是MaxCompute老客户,可以下拉选择已创建其他Project。 MaxCompute Table MaxCompute表名称,请输入自定义的新建的MaxCompute表名称或者选择已有的MaxCompute表。 MaxCompute 普通列 按序,左边填写与MaxCompute表数据列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 MaxCompute 分区列 按序,左边填写与MaxCompute表分区列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 分区时间格式 __partition_time__输出的日期格式,参考 Java SimpleDateFormat。 导入MaxCompute间隔 MaxCompute数据投递间隔,默认1800,单位:秒。 该步会默认为客户创建好新的MaxCompute Project和Table,其中如果已经是MaxCompute老客户,可以下拉选择其他已创建Project。 日志服务投递MaxCompute功能按照字段与列的顺序进行映射,修改MaxCompute表列名不影响数据导入,如更改MaxCompute表schema,请重新配置字段与列映射关系。 日志服务数据的一个字段最多允许映射到一个MaxCompute表的列(数据列或分区列),不支持字段冗余。 参考信息 __partition_time__ 格式 将日志时间作为分区字段,通过日期来筛选数据是MaxCompute常见的过滤数据方法。 __partition_time__ 是根据日志time字段值计算得到(不是日志写入服务端时间,也不是日志投递时间),结合分区时间格式,向下取整(为避免触发MaxCompute单表分区数目的限制,日期分区列的值会按照导入MaxCompute间隔对齐)计算出日期作为分区列。 举例来说,日志提取的time字段是“27/Jan/2016:20:50:13 +0800”,日志服务据此计算出保留字段__time__为1453899013(Unix时间戳),不同配置下的时间分区列取值如下: 导入MaxCompute间隔 分区时间格式 __partition_time__ 1800 yyyy_MM_dd_HH_mm_00 2016_01_27_20_30_00 1800 yyyy-MM-dd HH:mm 2016-01-27 20:30 1800 yyyyMMdd 20160127 3600 yyyyMMddHHmm 201601272000 3600 yyyy_MM_dd_HH 2016_01_27_20 请勿使用精确到秒的日期格式:1. 很容易导致单表的分区数目超过限制(6万);2. 单次投递任务的数据分区数目必须在512以内。 以上分区时间格式是测试通过的样例,您也可以参考Java SimpleDateFormat自己定义日期格式,但是该格式不得包含斜线字符”/“(这是MaxCompute的保留字段)。 __partition_time__ 使用方法 使用MaxCompute的字符串比较筛选数据,可以避免全表扫描。比如查询2016年1月26日一天内日志数据: select * from {ODPS_TABLE_NAME} where log_partition_time >= "2015_01_26" and log_partition_time < "2016_01_27"; __extract_others__使用方法 log_extract_others为一个json字符串,如果想获取该字段的user-agent内容,可以进行如下查询: select get_json_object(sls_extract_others, "$.user-agent") from {ODPS_TABLE_NAME} limit 10; 说明 get_json_object是MaxCompute提供的标准UDF。请联系MaxCompute团队开通使用该标准UDF的权限。 示例供参考,请以MaxCompute产品建议为最终标准。 其他操作 编辑投递配置 在Logstore列表投递项,单击“修改”即可针对之前的配置信息进行编辑。其中如果想新增列,可以在大数据计算服务MaxCompute(原ODPS)修改投递的数据表列信息,则点击“修改”后会加载最新的数据表信息。 投递任务管理 在启动投递功能后,日志服务后台会定期启动离线投递任务。用户可以在控制台上看到这些投递任务的状态和错误信息。具体请参考管理日志投递任务。 如果投递任务出现错误,控制台上会显示相应的错误信息: 错误信息 建议方案 MaxCompute项目空间不存在 在MaxCompute控制台中确认配置的MaxCompute项目是否存在,如果不存在则需要重新创建或配置。 MaxCompute表不存在 在MaxCompute控制台中确认配置的MaxCompute表是否存在,如果不存在则需要重新创建或配置。 MaxCompute项目空间或表没有向日志服务授权 在MaxCompute控制台中确认授权给日志服务账号的权限是否还存在,如果不存在则需要重新添加上相应权限。 MaxCompute错误 显示投递任务收到的MaxCompute错误,请参考MaxCompute相关文档或联系MaxCompute团队解决。日志服务会自动重试最近两天时间的失败任务。 日志服务导入字段配置无法匹配MaxCompute表的列 重新配置MaxCompute表格的列与日志服务数据字段的映射配置。 当投递任务发生错误时,请查看错误信息,问题解决后可以通过云控制台中“日志投递任务管理”或SDK来重试失败任务。 MaxCompute中消费日志 MaxCompute用户表中示例数据如下: | log_source | log_time | log_topic | time | ip | thread | log_extract_others | log_partition_time | status | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ | 10.10.*.* | 1453899013 | | 27/Jan/2016:20:50:13 +0800 | 10.10.*.* | 414579208 | {"url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1","user-agent":"aliyun-sdk-java"} | 2016_01_27_20_50 | 200 | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ 同时,我们推荐您直接使用已经与MaxCompute绑定的大数据开发Data IDE来进行可视化的BI分析及数据挖掘,这将提高数据加工的效率。 授予MaxCompute数据投递权限 如果在数加平台执行表删除重建动作,会导致默认授权失效。请手动重新为日志服务投递数据授权。 在MaxCompute项目空间下添加用户: ADD USER aliyun$shennong_open@aliyun.com; shennong_open@aliyun.com 是日志服务系统账号(请不要用自己的账号),授权目的是为了能将数据写入到MaxCompute MaxCompute项目空间Read/List权限授予: GRANT Read, List ON PROJECT {ODPS_PROJECT_NAME} TO USER aliyun$shennong_open@aliyun.com; MaxCompute项目空间的表Describe/Alter/Update权限授予: GRANT Describe, Alter, Update ON TABLE {ODPS_TABLE_NAME} TO USER aliyun$shennong_open@aliyun.com; 确认MaxCompute授权是否成功: SHOW GRANTS FOR aliyun$shennong_open@aliyun.com; A projects/{ODPS_PROJECT_NAME}: List | Read A projects/{ODPS_PROJECT_NAME}/tables/{ODPS_TABLE_NAME}: Describe | Alter | Update

2019-12-01 23:11:15 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 投递日志到 MaxCompute 是日志服务的一个功能,能够帮助您最大化数据价值。您可以自己决定对某个日志库是否启用该功能。一旦启用该功能,日志服务后台会定时把写入到该日志库内的日志投递到 MaxCompute 对应的表格中。 使用限制 数加控制台创建、修改投递配置必须由主账号完成,不支持子账号操作。 投递MaxCompute是批量任务,请谨慎设置分区列:保证一个同步任务内处理的数据分区数小于512个;用作分区列的字段值不能包括/等MaxCompute保留字段 。配置细节请参考下文投递配置说明。 不支持海外Region的MaxCompute投递,海外Region的MaxCompute请使用dataworks进行数据同步。国内Region投递支持如下: 日志服务Region MaxCompute Region 华北1 华东2 华北2 华北2、华东2 华北3 华东2 华北5 华东2 华东1 华东2 华东2 华东2 华南1 华南1、华东2 香港 华东2 功能优势 日志服务收集的日志除了可以被实时查询外,还可以把日志数据投递到大数据计算服务MaxCompute(原ODPS),进一步进行个性化BI分析及数据挖掘。通过日志服务投递日志数据到MaxCompute具有如下优势: 使用便捷 您只需要完成2步配置即可以把日志服务Logstore的日志数据迁移到MaxCompute中。 避免重复收集工作 由于日志服务的日志收集过程已经完成不同机器上的日志集中化,无需重复在不同机器上收集一遍日志数据后再导入到MaxCompute。 充分复用日志服务内的日志分类管理工作 用户可让日志服务中不同类型的日志(存在不同Logstore中)、不同Project的日志自动投递到不同的MaxCompute表格,方便管理及分析MaxCompute内的日志数据。 说明 一般情况下日志数据在写入Logstore后的1个小时导入到MaxCompute,您可以在控制台投递任务管理查看导入状态。导入成功后即可在MaxCompute内查看到相关日志数据。判断数据是否已完全投递请参考文档。 结合日志服务的实时消费,投递日志数据到MaxCompute的数据通道以及日志索引功能,可以让用户按照不同的场景和需求、以不同的方式复用数据,充分发挥日志数据的价值。 配置流程 举例日志服务的一条日志如下: 16年01月27日20时50分13秒 10.10.*.* ip:10.10.*.* status:200 thread:414579208 time:27/Jan/2016:20:50:13 +0800 url:POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1 user-agent:aliyun-sdk-java 日志左侧的ip、status、thread、time、url、user-agent等是日志服务数据的字段名称,需要在下方配置中应用到。 步骤1 初始化数加平台 在日志服务的控制台Logstore列表单击日志投递列的MaxCompute。 自动跳转到初始化数加平台的页面。MaxCompute默认为按量付费模式,具体参见MaxCompute文档说明。 查看服务协议和条款后单击确定,初始化数加平台。 初始化开通需10~20秒左右,请耐心等待。如果已经开通数加及大数据计算服务MaxCompute(原ODPS),将直接跳过该步骤。 步骤2 数据模型映射在日志服务和大数据计算服务MaxCompute(原ODPS)之间同步数据,涉及两个服务的数据模型映射问题。您可以参考日志服务日志数据结构了解数据结构。 将样例日志导入MaxCompute,分别定义MaxCompute数据列、分区列与日志服务字段的映射关系: MaxCompute 列类型 MaxCompute 列名(可自定义) MaxCompute 列类型(可自定义) 日志服务字段名(投递配置里填写) 日志服务字段类型 日志服务字段语义 数据列 log_source string __source__ 系统保留字段 日志来源的机器 IP。 log_time bigint __time__ 系统保留字段 日志的 Unix 时间戳(是从1970 年 1 月 1 日开始所经过的秒数),由用户日志的 time 字段计算得到。 log_topic string __topic__ 系统保留字段 日志主题。 time string time 日志内容字段 解析自日志。 ip string ip 日志内容字段 解析自日志。 thread string thread 日志内容字段 解析自日志。 log_extract_others string __extract_others__ 系统保留字段 未在配置中进行映射的其他日志内字段会通过 key-value 序列化到json,该 json 是一层结构,不支持字段内部 json 嵌套。 分区列 log_partition_time string __partition_time__ 系统保留字段 由日志的 time 字段对齐计算而得,分区粒度可配置,在配置项部分详述。 status string status 日志内容字段 解析自日志,该字段取值应该是可以枚举的,保证分区数目不会超出上限。 MaxCompute 表至少包含一个数据列、一个分区列。 系统保留字段中建议使用 __partition_time__,__source__,__topic__。 MaxCompute 单表有分区数目 6 万的限制,分区数超出后无法再写入数据,所以日志服务导入 MaxCompute表至多支持3个分区列。请谨慎选择自定义字段作为分区列,保证其值是可枚举的。 系统保留字段 __extract_others__ 历史上曾用名 _extract_others_,填写后者也是兼容的。 MaxCompute 分区列的值不支持”/“等特殊字符,这些是 MaxCompute 的保留字段。 MaxCompute 分区列取值不支持空,所以映射到分区列的字段必须要在日志里存在,空分区列的日志会在投递中被丢弃。 步骤3 配置投递规则 开启投递。 初始化数加平台之后,根据页面提示进入LogHub —— 数据投递页面,选择需要投递的Logstore,并单击开启投递。 您也可以在MaxCompute(原ODPS)投递管理页面选择需要投递的Logstore,并单击开启投递以进入LogHub —— 数据投递页面。 图 1. 开启投递 配置投递规则。 在 LogHub —— 数据投递页面配置 字段关联等相关内容。 图 2. 配置投递规则 配置项含义: 参数 语义 投递名称 自定义一个投递的名称,方便后续管理。 MaxCompute Project MaxCompute项目名称,该项默认为新创建的Project,如果已经是MaxCompute老客户,可以下拉选择已创建其他Project。 MaxCompute Table MaxCompute表名称,请输入自定义的新建的MaxCompute表名称或者选择已有的MaxCompute表。 MaxCompute 普通列 按序,左边填写与MaxCompute表数据列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 MaxCompute 分区列 按序,左边填写与MaxCompute表分区列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 分区时间格式 __partition_time__输出的日期格式,参考 Java SimpleDateFormat。 导入MaxCompute间隔 MaxCompute数据投递间隔,默认1800,单位:秒。 该步会默认为客户创建好新的MaxCompute Project和Table,其中如果已经是MaxCompute老客户,可以下拉选择其他已创建Project。 日志服务投递MaxCompute功能按照字段与列的顺序进行映射,修改MaxCompute表列名不影响数据导入,如更改MaxCompute表schema,请重新配置字段与列映射关系。 日志服务数据的一个字段最多允许映射到一个MaxCompute表的列(数据列或分区列),不支持字段冗余。 参考信息 __partition_time__ 格式 将日志时间作为分区字段,通过日期来筛选数据是MaxCompute常见的过滤数据方法。 __partition_time__ 是根据日志time字段值计算得到(不是日志写入服务端时间,也不是日志投递时间),结合分区时间格式,向下取整(为避免触发MaxCompute单表分区数目的限制,日期分区列的值会按照导入MaxCompute间隔对齐)计算出日期作为分区列。 举例来说,日志提取的time字段是“27/Jan/2016:20:50:13 +0800”,日志服务据此计算出保留字段__time__为1453899013(Unix时间戳),不同配置下的时间分区列取值如下: 导入MaxCompute间隔 分区时间格式 __partition_time__ 1800 yyyy_MM_dd_HH_mm_00 2016_01_27_20_30_00 1800 yyyy-MM-dd HH:mm 2016-01-27 20:30 1800 yyyyMMdd 20160127 3600 yyyyMMddHHmm 201601272000 3600 yyyy_MM_dd_HH 2016_01_27_20 请勿使用精确到秒的日期格式:1. 很容易导致单表的分区数目超过限制(6万);2. 单次投递任务的数据分区数目必须在512以内。 以上分区时间格式是测试通过的样例,您也可以参考Java SimpleDateFormat自己定义日期格式,但是该格式不得包含斜线字符”/“(这是MaxCompute的保留字段)。 __partition_time__ 使用方法 使用MaxCompute的字符串比较筛选数据,可以避免全表扫描。比如查询2016年1月26日一天内日志数据: select * from {ODPS_TABLE_NAME} where log_partition_time >= "2015_01_26" and log_partition_time < "2016_01_27"; __extract_others__使用方法 log_extract_others为一个json字符串,如果想获取该字段的user-agent内容,可以进行如下查询: select get_json_object(sls_extract_others, "$.user-agent") from {ODPS_TABLE_NAME} limit 10; 说明 get_json_object是MaxCompute提供的标准UDF。请联系MaxCompute团队开通使用该标准UDF的权限。 示例供参考,请以MaxCompute产品建议为最终标准。 其他操作 编辑投递配置 在Logstore列表投递项,单击“修改”即可针对之前的配置信息进行编辑。其中如果想新增列,可以在大数据计算服务MaxCompute(原ODPS)修改投递的数据表列信息,则点击“修改”后会加载最新的数据表信息。 投递任务管理 在启动投递功能后,日志服务后台会定期启动离线投递任务。用户可以在控制台上看到这些投递任务的状态和错误信息。具体请参考管理日志投递任务。 如果投递任务出现错误,控制台上会显示相应的错误信息: 错误信息 建议方案 MaxCompute项目空间不存在 在MaxCompute控制台中确认配置的MaxCompute项目是否存在,如果不存在则需要重新创建或配置。 MaxCompute表不存在 在MaxCompute控制台中确认配置的MaxCompute表是否存在,如果不存在则需要重新创建或配置。 MaxCompute项目空间或表没有向日志服务授权 在MaxCompute控制台中确认授权给日志服务账号的权限是否还存在,如果不存在则需要重新添加上相应权限。 MaxCompute错误 显示投递任务收到的MaxCompute错误,请参考MaxCompute相关文档或联系MaxCompute团队解决。日志服务会自动重试最近两天时间的失败任务。 日志服务导入字段配置无法匹配MaxCompute表的列 重新配置MaxCompute表格的列与日志服务数据字段的映射配置。 当投递任务发生错误时,请查看错误信息,问题解决后可以通过云控制台中“日志投递任务管理”或SDK来重试失败任务。 MaxCompute中消费日志 MaxCompute用户表中示例数据如下: | log_source | log_time | log_topic | time | ip | thread | log_extract_others | log_partition_time | status | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ | 10.10.*.* | 1453899013 | | 27/Jan/2016:20:50:13 +0800 | 10.10.*.* | 414579208 | {"url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1","user-agent":"aliyun-sdk-java"} | 2016_01_27_20_50 | 200 | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ 同时,我们推荐您直接使用已经与MaxCompute绑定的大数据开发Data IDE来进行可视化的BI分析及数据挖掘,这将提高数据加工的效率。 授予MaxCompute数据投递权限 如果在数加平台执行表删除重建动作,会导致默认授权失效。请手动重新为日志服务投递数据授权。 在MaxCompute项目空间下添加用户: ADD USER aliyun$shennong_open@aliyun.com; shennong_open@aliyun.com 是日志服务系统账号(请不要用自己的账号),授权目的是为了能将数据写入到MaxCompute MaxCompute项目空间Read/List权限授予: GRANT Read, List ON PROJECT {ODPS_PROJECT_NAME} TO USER aliyun$shennong_open@aliyun.com; MaxCompute项目空间的表Describe/Alter/Update权限授予: GRANT Describe, Alter, Update ON TABLE {ODPS_TABLE_NAME} TO USER aliyun$shennong_open@aliyun.com; 确认MaxCompute授权是否成功: SHOW GRANTS FOR aliyun$shennong_open@aliyun.com; A projects/{ODPS_PROJECT_NAME}: List | Read A projects/{ODPS_PROJECT_NAME}/tables/{ODPS_TABLE_NAME}: Describe | Alter | Update

2019-12-01 23:11:16 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 投递日志到 MaxCompute 是日志服务的一个功能,能够帮助您最大化数据价值。您可以自己决定对某个日志库是否启用该功能。一旦启用该功能,日志服务后台会定时把写入到该日志库内的日志投递到 MaxCompute 对应的表格中。 使用限制 数加控制台创建、修改投递配置必须由主账号完成,不支持子账号操作。 投递MaxCompute是批量任务,请谨慎设置分区列:保证一个同步任务内处理的数据分区数小于512个;用作分区列的字段值不能包括/等MaxCompute保留字段 。配置细节请参考下文投递配置说明。 不支持海外Region的MaxCompute投递,海外Region的MaxCompute请使用dataworks进行数据同步。国内Region投递支持如下: 日志服务Region MaxCompute Region 华北1 华东2 华北2 华北2、华东2 华北3 华东2 华北5 华东2 华东1 华东2 华东2 华东2 华南1 华南1、华东2 香港 华东2 功能优势 日志服务收集的日志除了可以被实时查询外,还可以把日志数据投递到大数据计算服务MaxCompute(原ODPS),进一步进行个性化BI分析及数据挖掘。通过日志服务投递日志数据到MaxCompute具有如下优势: 使用便捷 您只需要完成2步配置即可以把日志服务Logstore的日志数据迁移到MaxCompute中。 避免重复收集工作 由于日志服务的日志收集过程已经完成不同机器上的日志集中化,无需重复在不同机器上收集一遍日志数据后再导入到MaxCompute。 充分复用日志服务内的日志分类管理工作 用户可让日志服务中不同类型的日志(存在不同Logstore中)、不同Project的日志自动投递到不同的MaxCompute表格,方便管理及分析MaxCompute内的日志数据。 说明 一般情况下日志数据在写入Logstore后的1个小时导入到MaxCompute,您可以在控制台投递任务管理查看导入状态。导入成功后即可在MaxCompute内查看到相关日志数据。判断数据是否已完全投递请参考文档。 结合日志服务的实时消费,投递日志数据到MaxCompute的数据通道以及日志索引功能,可以让用户按照不同的场景和需求、以不同的方式复用数据,充分发挥日志数据的价值。 配置流程 举例日志服务的一条日志如下: 16年01月27日20时50分13秒 10.10.*.* ip:10.10.*.* status:200 thread:414579208 time:27/Jan/2016:20:50:13 +0800 url:POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1 user-agent:aliyun-sdk-java 日志左侧的ip、status、thread、time、url、user-agent等是日志服务数据的字段名称,需要在下方配置中应用到。 步骤1 初始化数加平台 在日志服务的控制台Logstore列表单击日志投递列的MaxCompute。 自动跳转到初始化数加平台的页面。MaxCompute默认为按量付费模式,具体参见MaxCompute文档说明。 查看服务协议和条款后单击确定,初始化数加平台。 初始化开通需10~20秒左右,请耐心等待。如果已经开通数加及大数据计算服务MaxCompute(原ODPS),将直接跳过该步骤。 步骤2 数据模型映射在日志服务和大数据计算服务MaxCompute(原ODPS)之间同步数据,涉及两个服务的数据模型映射问题。您可以参考日志服务日志数据结构了解数据结构。 将样例日志导入MaxCompute,分别定义MaxCompute数据列、分区列与日志服务字段的映射关系: MaxCompute 列类型 MaxCompute 列名(可自定义) MaxCompute 列类型(可自定义) 日志服务字段名(投递配置里填写) 日志服务字段类型 日志服务字段语义 数据列 log_source string __source__ 系统保留字段 日志来源的机器 IP。 log_time bigint __time__ 系统保留字段 日志的 Unix 时间戳(是从1970 年 1 月 1 日开始所经过的秒数),由用户日志的 time 字段计算得到。 log_topic string __topic__ 系统保留字段 日志主题。 time string time 日志内容字段 解析自日志。 ip string ip 日志内容字段 解析自日志。 thread string thread 日志内容字段 解析自日志。 log_extract_others string __extract_others__ 系统保留字段 未在配置中进行映射的其他日志内字段会通过 key-value 序列化到json,该 json 是一层结构,不支持字段内部 json 嵌套。 分区列 log_partition_time string __partition_time__ 系统保留字段 由日志的 time 字段对齐计算而得,分区粒度可配置,在配置项部分详述。 status string status 日志内容字段 解析自日志,该字段取值应该是可以枚举的,保证分区数目不会超出上限。 MaxCompute 表至少包含一个数据列、一个分区列。 系统保留字段中建议使用 __partition_time__,__source__,__topic__。 MaxCompute 单表有分区数目 6 万的限制,分区数超出后无法再写入数据,所以日志服务导入 MaxCompute表至多支持3个分区列。请谨慎选择自定义字段作为分区列,保证其值是可枚举的。 系统保留字段 __extract_others__ 历史上曾用名 _extract_others_,填写后者也是兼容的。 MaxCompute 分区列的值不支持”/“等特殊字符,这些是 MaxCompute 的保留字段。 MaxCompute 分区列取值不支持空,所以映射到分区列的字段必须要在日志里存在,空分区列的日志会在投递中被丢弃。 步骤3 配置投递规则 开启投递。 初始化数加平台之后,根据页面提示进入LogHub —— 数据投递页面,选择需要投递的Logstore,并单击开启投递。 您也可以在MaxCompute(原ODPS)投递管理页面选择需要投递的Logstore,并单击开启投递以进入LogHub —— 数据投递页面。 图 1. 开启投递 配置投递规则。 在 LogHub —— 数据投递页面配置 字段关联等相关内容。 图 2. 配置投递规则 配置项含义: 参数 语义 投递名称 自定义一个投递的名称,方便后续管理。 MaxCompute Project MaxCompute项目名称,该项默认为新创建的Project,如果已经是MaxCompute老客户,可以下拉选择已创建其他Project。 MaxCompute Table MaxCompute表名称,请输入自定义的新建的MaxCompute表名称或者选择已有的MaxCompute表。 MaxCompute 普通列 按序,左边填写与MaxCompute表数据列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 MaxCompute 分区列 按序,左边填写与MaxCompute表分区列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 分区时间格式 __partition_time__输出的日期格式,参考 Java SimpleDateFormat。 导入MaxCompute间隔 MaxCompute数据投递间隔,默认1800,单位:秒。 该步会默认为客户创建好新的MaxCompute Project和Table,其中如果已经是MaxCompute老客户,可以下拉选择其他已创建Project。 日志服务投递MaxCompute功能按照字段与列的顺序进行映射,修改MaxCompute表列名不影响数据导入,如更改MaxCompute表schema,请重新配置字段与列映射关系。 日志服务数据的一个字段最多允许映射到一个MaxCompute表的列(数据列或分区列),不支持字段冗余。 参考信息 __partition_time__ 格式 将日志时间作为分区字段,通过日期来筛选数据是MaxCompute常见的过滤数据方法。 __partition_time__ 是根据日志time字段值计算得到(不是日志写入服务端时间,也不是日志投递时间),结合分区时间格式,向下取整(为避免触发MaxCompute单表分区数目的限制,日期分区列的值会按照导入MaxCompute间隔对齐)计算出日期作为分区列。 举例来说,日志提取的time字段是“27/Jan/2016:20:50:13 +0800”,日志服务据此计算出保留字段__time__为1453899013(Unix时间戳),不同配置下的时间分区列取值如下: 导入MaxCompute间隔 分区时间格式 __partition_time__ 1800 yyyy_MM_dd_HH_mm_00 2016_01_27_20_30_00 1800 yyyy-MM-dd HH:mm 2016-01-27 20:30 1800 yyyyMMdd 20160127 3600 yyyyMMddHHmm 201601272000 3600 yyyy_MM_dd_HH 2016_01_27_20 请勿使用精确到秒的日期格式:1. 很容易导致单表的分区数目超过限制(6万);2. 单次投递任务的数据分区数目必须在512以内。 以上分区时间格式是测试通过的样例,您也可以参考Java SimpleDateFormat自己定义日期格式,但是该格式不得包含斜线字符”/“(这是MaxCompute的保留字段)。 __partition_time__ 使用方法 使用MaxCompute的字符串比较筛选数据,可以避免全表扫描。比如查询2016年1月26日一天内日志数据: select * from {ODPS_TABLE_NAME} where log_partition_time >= "2015_01_26" and log_partition_time < "2016_01_27"; __extract_others__使用方法 log_extract_others为一个json字符串,如果想获取该字段的user-agent内容,可以进行如下查询: select get_json_object(sls_extract_others, "$.user-agent") from {ODPS_TABLE_NAME} limit 10; 说明 get_json_object是MaxCompute提供的标准UDF。请联系MaxCompute团队开通使用该标准UDF的权限。 示例供参考,请以MaxCompute产品建议为最终标准。 其他操作 编辑投递配置 在Logstore列表投递项,单击“修改”即可针对之前的配置信息进行编辑。其中如果想新增列,可以在大数据计算服务MaxCompute(原ODPS)修改投递的数据表列信息,则点击“修改”后会加载最新的数据表信息。 投递任务管理 在启动投递功能后,日志服务后台会定期启动离线投递任务。用户可以在控制台上看到这些投递任务的状态和错误信息。具体请参考管理日志投递任务。 如果投递任务出现错误,控制台上会显示相应的错误信息: 错误信息 建议方案 MaxCompute项目空间不存在 在MaxCompute控制台中确认配置的MaxCompute项目是否存在,如果不存在则需要重新创建或配置。 MaxCompute表不存在 在MaxCompute控制台中确认配置的MaxCompute表是否存在,如果不存在则需要重新创建或配置。 MaxCompute项目空间或表没有向日志服务授权 在MaxCompute控制台中确认授权给日志服务账号的权限是否还存在,如果不存在则需要重新添加上相应权限。 MaxCompute错误 显示投递任务收到的MaxCompute错误,请参考MaxCompute相关文档或联系MaxCompute团队解决。日志服务会自动重试最近两天时间的失败任务。 日志服务导入字段配置无法匹配MaxCompute表的列 重新配置MaxCompute表格的列与日志服务数据字段的映射配置。 当投递任务发生错误时,请查看错误信息,问题解决后可以通过云控制台中“日志投递任务管理”或SDK来重试失败任务。 MaxCompute中消费日志 MaxCompute用户表中示例数据如下: | log_source | log_time | log_topic | time | ip | thread | log_extract_others | log_partition_time | status | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ | 10.10.*.* | 1453899013 | | 27/Jan/2016:20:50:13 +0800 | 10.10.*.* | 414579208 | {"url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1","user-agent":"aliyun-sdk-java"} | 2016_01_27_20_50 | 200 | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ 同时,我们推荐您直接使用已经与MaxCompute绑定的大数据开发Data IDE来进行可视化的BI分析及数据挖掘,这将提高数据加工的效率。 授予MaxCompute数据投递权限 如果在数加平台执行表删除重建动作,会导致默认授权失效。请手动重新为日志服务投递数据授权。 在MaxCompute项目空间下添加用户: ADD USER aliyun$shennong_open@aliyun.com; shennong_open@aliyun.com 是日志服务系统账号(请不要用自己的账号),授权目的是为了能将数据写入到MaxCompute MaxCompute项目空间Read/List权限授予: GRANT Read, List ON PROJECT {ODPS_PROJECT_NAME} TO USER aliyun$shennong_open@aliyun.com; MaxCompute项目空间的表Describe/Alter/Update权限授予: GRANT Describe, Alter, Update ON TABLE {ODPS_TABLE_NAME} TO USER aliyun$shennong_open@aliyun.com; 确认MaxCompute授权是否成功: SHOW GRANTS FOR aliyun$shennong_open@aliyun.com; A projects/{ODPS_PROJECT_NAME}: List | Read A projects/{ODPS_PROJECT_NAME}/tables/{ODPS_TABLE_NAME}: Describe | Alter | Update

2019-12-01 23:11:17 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 投递日志到 MaxCompute 是日志服务的一个功能,能够帮助您最大化数据价值。您可以自己决定对某个日志库是否启用该功能。一旦启用该功能,日志服务后台会定时把写入到该日志库内的日志投递到 MaxCompute 对应的表格中。 使用限制 数加控制台创建、修改投递配置必须由主账号完成,不支持子账号操作。 投递MaxCompute是批量任务,请谨慎设置分区列:保证一个同步任务内处理的数据分区数小于512个;用作分区列的字段值不能包括/等MaxCompute保留字段 。配置细节请参考下文投递配置说明。 不支持海外Region的MaxCompute投递,海外Region的MaxCompute请使用dataworks进行数据同步。国内Region投递支持如下: 日志服务Region MaxCompute Region 华北1 华东2 华北2 华北2、华东2 华北3 华东2 华北5 华东2 华东1 华东2 华东2 华东2 华南1 华南1、华东2 香港 华东2 功能优势 日志服务收集的日志除了可以被实时查询外,还可以把日志数据投递到大数据计算服务MaxCompute(原ODPS),进一步进行个性化BI分析及数据挖掘。通过日志服务投递日志数据到MaxCompute具有如下优势: 使用便捷 您只需要完成2步配置即可以把日志服务Logstore的日志数据迁移到MaxCompute中。 避免重复收集工作 由于日志服务的日志收集过程已经完成不同机器上的日志集中化,无需重复在不同机器上收集一遍日志数据后再导入到MaxCompute。 充分复用日志服务内的日志分类管理工作 用户可让日志服务中不同类型的日志(存在不同Logstore中)、不同Project的日志自动投递到不同的MaxCompute表格,方便管理及分析MaxCompute内的日志数据。 说明 一般情况下日志数据在写入Logstore后的1个小时导入到MaxCompute,您可以在控制台投递任务管理查看导入状态。导入成功后即可在MaxCompute内查看到相关日志数据。判断数据是否已完全投递请参考文档。 结合日志服务的实时消费,投递日志数据到MaxCompute的数据通道以及日志索引功能,可以让用户按照不同的场景和需求、以不同的方式复用数据,充分发挥日志数据的价值。 配置流程 举例日志服务的一条日志如下: 16年01月27日20时50分13秒 10.10.*.* ip:10.10.*.* status:200 thread:414579208 time:27/Jan/2016:20:50:13 +0800 url:POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1 user-agent:aliyun-sdk-java 日志左侧的ip、status、thread、time、url、user-agent等是日志服务数据的字段名称,需要在下方配置中应用到。 步骤1 初始化数加平台 在日志服务的控制台Logstore列表单击日志投递列的MaxCompute。 自动跳转到初始化数加平台的页面。MaxCompute默认为按量付费模式,具体参见MaxCompute文档说明。 查看服务协议和条款后单击确定,初始化数加平台。 初始化开通需10~20秒左右,请耐心等待。如果已经开通数加及大数据计算服务MaxCompute(原ODPS),将直接跳过该步骤。 步骤2 数据模型映射在日志服务和大数据计算服务MaxCompute(原ODPS)之间同步数据,涉及两个服务的数据模型映射问题。您可以参考日志服务日志数据结构了解数据结构。 将样例日志导入MaxCompute,分别定义MaxCompute数据列、分区列与日志服务字段的映射关系: MaxCompute 列类型 MaxCompute 列名(可自定义) MaxCompute 列类型(可自定义) 日志服务字段名(投递配置里填写) 日志服务字段类型 日志服务字段语义 数据列 log_source string __source__ 系统保留字段 日志来源的机器 IP。 log_time bigint __time__ 系统保留字段 日志的 Unix 时间戳(是从1970 年 1 月 1 日开始所经过的秒数),由用户日志的 time 字段计算得到。 log_topic string __topic__ 系统保留字段 日志主题。 time string time 日志内容字段 解析自日志。 ip string ip 日志内容字段 解析自日志。 thread string thread 日志内容字段 解析自日志。 log_extract_others string __extract_others__ 系统保留字段 未在配置中进行映射的其他日志内字段会通过 key-value 序列化到json,该 json 是一层结构,不支持字段内部 json 嵌套。 分区列 log_partition_time string __partition_time__ 系统保留字段 由日志的 time 字段对齐计算而得,分区粒度可配置,在配置项部分详述。 status string status 日志内容字段 解析自日志,该字段取值应该是可以枚举的,保证分区数目不会超出上限。 MaxCompute 表至少包含一个数据列、一个分区列。 系统保留字段中建议使用 __partition_time__,__source__,__topic__。 MaxCompute 单表有分区数目 6 万的限制,分区数超出后无法再写入数据,所以日志服务导入 MaxCompute表至多支持3个分区列。请谨慎选择自定义字段作为分区列,保证其值是可枚举的。 系统保留字段 __extract_others__ 历史上曾用名 _extract_others_,填写后者也是兼容的。 MaxCompute 分区列的值不支持”/“等特殊字符,这些是 MaxCompute 的保留字段。 MaxCompute 分区列取值不支持空,所以映射到分区列的字段必须要在日志里存在,空分区列的日志会在投递中被丢弃。 步骤3 配置投递规则 开启投递。 初始化数加平台之后,根据页面提示进入LogHub —— 数据投递页面,选择需要投递的Logstore,并单击开启投递。 您也可以在MaxCompute(原ODPS)投递管理页面选择需要投递的Logstore,并单击开启投递以进入LogHub —— 数据投递页面。 图 1. 开启投递 配置投递规则。 在 LogHub —— 数据投递页面配置 字段关联等相关内容。 图 2. 配置投递规则 配置项含义: 参数 语义 投递名称 自定义一个投递的名称,方便后续管理。 MaxCompute Project MaxCompute项目名称,该项默认为新创建的Project,如果已经是MaxCompute老客户,可以下拉选择已创建其他Project。 MaxCompute Table MaxCompute表名称,请输入自定义的新建的MaxCompute表名称或者选择已有的MaxCompute表。 MaxCompute 普通列 按序,左边填写与MaxCompute表数据列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 MaxCompute 分区列 按序,左边填写与MaxCompute表分区列相映射的日志服务字段名称,右边填写或选择MaxCompute表的普通字段名称及字段类型。 分区时间格式 __partition_time__输出的日期格式,参考 Java SimpleDateFormat。 导入MaxCompute间隔 MaxCompute数据投递间隔,默认1800,单位:秒。 该步会默认为客户创建好新的MaxCompute Project和Table,其中如果已经是MaxCompute老客户,可以下拉选择其他已创建Project。 日志服务投递MaxCompute功能按照字段与列的顺序进行映射,修改MaxCompute表列名不影响数据导入,如更改MaxCompute表schema,请重新配置字段与列映射关系。 日志服务数据的一个字段最多允许映射到一个MaxCompute表的列(数据列或分区列),不支持字段冗余。 参考信息 __partition_time__ 格式 将日志时间作为分区字段,通过日期来筛选数据是MaxCompute常见的过滤数据方法。 __partition_time__ 是根据日志time字段值计算得到(不是日志写入服务端时间,也不是日志投递时间),结合分区时间格式,向下取整(为避免触发MaxCompute单表分区数目的限制,日期分区列的值会按照导入MaxCompute间隔对齐)计算出日期作为分区列。 举例来说,日志提取的time字段是“27/Jan/2016:20:50:13 +0800”,日志服务据此计算出保留字段__time__为1453899013(Unix时间戳),不同配置下的时间分区列取值如下: 导入MaxCompute间隔 分区时间格式 __partition_time__ 1800 yyyy_MM_dd_HH_mm_00 2016_01_27_20_30_00 1800 yyyy-MM-dd HH:mm 2016-01-27 20:30 1800 yyyyMMdd 20160127 3600 yyyyMMddHHmm 201601272000 3600 yyyy_MM_dd_HH 2016_01_27_20 请勿使用精确到秒的日期格式:1. 很容易导致单表的分区数目超过限制(6万);2. 单次投递任务的数据分区数目必须在512以内。 以上分区时间格式是测试通过的样例,您也可以参考Java SimpleDateFormat自己定义日期格式,但是该格式不得包含斜线字符”/“(这是MaxCompute的保留字段)。 __partition_time__ 使用方法 使用MaxCompute的字符串比较筛选数据,可以避免全表扫描。比如查询2016年1月26日一天内日志数据: select * from {ODPS_TABLE_NAME} where log_partition_time >= "2015_01_26" and log_partition_time < "2016_01_27"; __extract_others__使用方法 log_extract_others为一个json字符串,如果想获取该字段的user-agent内容,可以进行如下查询: select get_json_object(sls_extract_others, "$.user-agent") from {ODPS_TABLE_NAME} limit 10; 说明 get_json_object是MaxCompute提供的标准UDF。请联系MaxCompute团队开通使用该标准UDF的权限。 示例供参考,请以MaxCompute产品建议为最终标准。 其他操作 编辑投递配置 在Logstore列表投递项,单击“修改”即可针对之前的配置信息进行编辑。其中如果想新增列,可以在大数据计算服务MaxCompute(原ODPS)修改投递的数据表列信息,则点击“修改”后会加载最新的数据表信息。 投递任务管理 在启动投递功能后,日志服务后台会定期启动离线投递任务。用户可以在控制台上看到这些投递任务的状态和错误信息。具体请参考管理日志投递任务。 如果投递任务出现错误,控制台上会显示相应的错误信息: 错误信息 建议方案 MaxCompute项目空间不存在 在MaxCompute控制台中确认配置的MaxCompute项目是否存在,如果不存在则需要重新创建或配置。 MaxCompute表不存在 在MaxCompute控制台中确认配置的MaxCompute表是否存在,如果不存在则需要重新创建或配置。 MaxCompute项目空间或表没有向日志服务授权 在MaxCompute控制台中确认授权给日志服务账号的权限是否还存在,如果不存在则需要重新添加上相应权限。 MaxCompute错误 显示投递任务收到的MaxCompute错误,请参考MaxCompute相关文档或联系MaxCompute团队解决。日志服务会自动重试最近两天时间的失败任务。 日志服务导入字段配置无法匹配MaxCompute表的列 重新配置MaxCompute表格的列与日志服务数据字段的映射配置。 当投递任务发生错误时,请查看错误信息,问题解决后可以通过云控制台中“日志投递任务管理”或SDK来重试失败任务。 MaxCompute中消费日志 MaxCompute用户表中示例数据如下: | log_source | log_time | log_topic | time | ip | thread | log_extract_others | log_partition_time | status | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ | 10.10.*.* | 1453899013 | | 27/Jan/2016:20:50:13 +0800 | 10.10.*.* | 414579208 | {"url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1","user-agent":"aliyun-sdk-java"} | 2016_01_27_20_50 | 200 | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ 同时,我们推荐您直接使用已经与MaxCompute绑定的大数据开发Data IDE来进行可视化的BI分析及数据挖掘,这将提高数据加工的效率。 授予MaxCompute数据投递权限 如果在数加平台执行表删除重建动作,会导致默认授权失效。请手动重新为日志服务投递数据授权。 在MaxCompute项目空间下添加用户: ADD USER aliyun$shennong_open@aliyun.com; shennong_open@aliyun.com 是日志服务系统账号(请不要用自己的账号),授权目的是为了能将数据写入到MaxCompute MaxCompute项目空间Read/List权限授予: GRANT Read, List ON PROJECT {ODPS_PROJECT_NAME} TO USER aliyun$shennong_open@aliyun.com; MaxCompute项目空间的表Describe/Alter/Update权限授予: GRANT Describe, Alter, Update ON TABLE {ODPS_TABLE_NAME} TO USER aliyun$shennong_open@aliyun.com; 确认MaxCompute授权是否成功: SHOW GRANTS FOR aliyun$shennong_open@aliyun.com; A projects/{ODPS_PROJECT_NAME}: List | Read A projects/{ODPS_PROJECT_NAME}/tables/{ODPS_TABLE_NAME}: Describe | Alter | Update

2019-12-01 23:11:16 0 浏览量 回答数 0

回答

PHP面试干货 1、进程和线程 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 2、apache默认使用进程管理还是线程管理?如何判断并设置最大连接数? 一个进程可以开多个线程 默认是进程管理 默认有一个主进程 Linux: ps -aux | grep httpd | more 一个子进程代表一个用户的连接 Conf/extra/httpd-mpm.conf 多路功能模块 http -l 查询当前apache处于什么模式下 3、单例模式 单例模式需求:只能实例化产生一个对象 如何实现: 私有化构造函数 禁止克隆对象 提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一对象 需要一个保存类的静态属性 class demo { private static $MyObject; //保存对象的静态属性 private function __construct(){ //私有化构造函数 } private function __clone(){ //禁止克隆 } public static function getInstance(){ if(! (self::$MyObject instanceof self)){ self::$MyObject = new self; } return self::$MyObject; } } 4、安装完Apache后,在http.conf中配置加载PHP文件以Apache模块的方式安装PHP,在文件http.conf中首先要用语句LoadModule php5_module "e:/php/php5apache2.dll"动态装载PHP模块,然后再用语句AddType application/x-httpd-php .php 使得Apache把所有扩展名为PHP的文件都作为PHP脚本处理 5、debug_backtrace()函数能返回脚本里的任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的 function one($str1, $str2) { two("Glenn", "Quagmire"); } function two($str1, $str2) { three("Cleveland", "Brown"); } function three($str1, $str2) { print_r(debug_backtrace()); } one("Peter", "Griffin"); Array ( [0] => Array ( [file] => D:\www\test\result.php [line] => 9 [function] => three [args] => Array ( [0] => Cleveland [1] => Brown ) ) [1] => Array ( [file] => D:\www\test\result.php [line] => 5 [function] => two [args] => Array ( [0] => Glenn [1] => Quagmire ) ) [2] => Array ( [file] => D:\www\test\result.php [line] => 16 [function] => one [args] => Array ( [0] => Peter [1] => Griffin ) ) ) 6、输出用户的IP地址,并且判断用户的IP地址是否在192.168.1.100 — 192.168.1.150之间 echo $ip=getenv('REMOTE_ADDR'); $ip=str_replace('.','',$ip); if($ip<1921681150 && $ip>1921681100) { echo 'ip在192.168.1.100—–192.168.1.150之间'; } else { echo 'ip不在192.168.1.100—–192.168.1.150之间'; } 7、请将2维数组按照name的长度进行重新排序,按照顺序将id赋值 $tarray = array( array('id' => 0, 'name' => '123'), array('id' => 0, 'name' => '1234'), array('id' => 0, 'name' => '1235'), array('id' => 0, 'name' => '12356'), array('id' => 0, 'name' => '123abc') ); foreach($tarray as $key=>$val) { $c[]=$val['name']; } function aa($a,$b) { if(strlen($a)==strlen($b)) return 0; return strlen($a)>strlen($b)?-1:1; } usort($c,'aa'); $len=count($c); for($i=0;$i<$len;$i++) { $t[$i]['id']=$i+1; $t[$i]['name']=$c[$i]; } print_r($t); 8、表单数据提交方式POST和GET的区别,URL地址传递的数据最大长度是多少? POST方式提交数据用户不可见,是数据更安全,最大长度不受限制,而GET方式传值在URL地址可以看到,相对不安全,对大长度是2048字节。 9、SESSION和COOKIE的作用和区别,SESSION信息的存储方式,如何进行遍历 SESSION和COOKIE都能够使值在页面之间进行传递,SESSION存储在服务器端,数据更安全,COOKIE保存在客户端,用户使用手段可以进行修改,SESSION依赖于COOKIE进行传递的。Session遍历使用$_SESSION[]取值,cookie遍历使用$_COOKIE[]取值。 10、什么是数据库索引,主键索引,唯一索引的区别,索引的缺点是什么 索引用来快速地寻找那些具有特定值的记录。 主键索引和唯一索引的区别:主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”,每个表只能有一个主键。唯一索引索引列的所有值都只能出现一次,即必须唯一。 索引的缺点: 1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 2、索引需要占用物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,需要的空间就会更大。 3、当对表中的数据进行增加、删除、修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 11、数据库设计时,常遇到的性能瓶颈有哪些,常有的解决方案 瓶颈主要有: 1、磁盘搜索 优化方法是:将数据分布在多个磁盘上 2、磁盘读/写 优化方法是:从多个磁盘并行读写。 3、CPU周期 优化方法:扩充内存 4、内存带宽 12、include和require区别 include引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码。 require引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码。 13、文件上传时设计到点 和文件上传有关的php.ini配置选项(File Uploads): file_uploads=On/Off:文件是否允许上传 upload_max_filesize上传文件时,单个文件的最大大小 post_max_size:提交表单时,整个post表单的最大大小 max_file_uploads =20上传文件的个数 内存占用,脚本最大执行时间也间接影响到文件的上传 14、header常见状态 //200 正常状态 header('HTTP/1.1 200 OK'); // 301 永久重定向,记得在后面要加重定向地址 Location:$url header('HTTP/1.1 301 Moved Permanently'); // 重定向,其实就是302 暂时重定向 header('Location: http://www.maiyoule.com/'); // 设置页面304 没有修改 header('HTTP/1.1 304 Not Modified'); // 显示登录框, header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Basic realm="登录信息"'); echo '显示的信息!'; // 403 禁止访问 header('HTTP/1.1 403 Forbidden'); // 404 错误 header('HTTP/1.1 404 Not Found'); // 500 服务器错误 header('HTTP/1.1 500 Internal Server Error'); // 3秒后重定向指定地址(也就是刷新到新页面与 <meta http-equiv="refresh" content="10;http://www.maiyoule.com/ /> 相同) header('Refresh: 3; url=http://www.maiyoule.com/'); echo '10后跳转到http://www.maiyoule.com'; // 重写 X-Powered-By 值 header('X-Powered-By: PHP/5.3.0'); header('X-Powered-By: Brain/0.6b'); //设置上下文语言 header('Content-language: en'); // 设置页面最后修改时间(多用于防缓存) $time = time() - 60; //建议使用filetime函数来设置页面缓存时间 header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT'); // 设置内容长度 header('Content-Length: 39344'); // 设置头文件类型,可以用于流文件或者文件下载 header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="example.zip"'); header('Content-Transfer-Encoding: binary'); readfile('example.zip');//读取文件到客户端 //禁用页面缓存 header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate'); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Pragma: no-cache'); //设置页面头信息 header('Content-Type: text/html; charset=iso-8859-1'); header('Content-Type: text/html; charset=utf-8'); header('Content-Type: text/plain'); header('Content-Type: image/jpeg'); header('Content-Type: application/zip'); header('Content-Type: application/pdf'); header('Content-Type: audio/mpeg'); header('Content-Type: application/x-shockwave-flash'); //.... 至于Content-Type 的值 可以去查查 w3c 的文档库,那里很丰富 15、ORM和ActiveRecord ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射。为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但是传统的数据库却是关系型的。为了可以靠贴近面向对象开发,我们想要像操作对象一样操作数据库。还可以隔离底层数据库层,我们不需要关心我们使用的是mysql还是其他的关系型数据库 ActiveRecord也属于ORM层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而且简洁易懂。 ActiveRecord的主要思想是: 1. 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的Field; 2. ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CURD;; 3. ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻辑; ActiveRecord比较适用于: 1. 业务逻辑比较简单,当你的类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的,即你的业务逻辑大多数是对单表操作; 2. 当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script),把跨表事务提升到事务脚本中; 3. ActiveRecord最大优点是简单, 直观。 一个类就包括了数据访问和业务逻辑. 如果配合代码生成器使用就更方便了; 这些优点使ActiveRecord特别适合WEB快速开发。 16、斐波那契方法,也就是1 1 2 3 5 8 ……,这里给出两种方法,大家可以对比下,看看哪种快,以及为什么 function fibonacci($n){ if($n == 0){ return 0; } if($n == 1){ return 1; } return fibonacci($n-1)+fibonacci($n-2); } function fibonacci($n){ for($i=0; $i<$n; $i++){ $r[] = $i<2 ? 1 : $r[$i-1]+$r[$i-2]; } return $r[--$i]; } 17、约瑟夫环,也就是常见的数猴子,n只猴子围成一圈,每只猴子下面标了编号,从1开始数起,数到m那么第m只猴子便退出,依次类推,每数到m,那么那个位置的猴子退出,那么最后剩下的猴子下的编号是啥。 function yuesefu($n,$m) { $r=0; for($i=2; $i<=$n; $i++) { $r=($r+$m)%$i; } return $r+1; } 18、冒泡排序,大致是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束 function bubbleSort($arr){ for($i=0, $len=count($arr); $i<$len; $i++){ for($j=0; $j<$len; $j++){ if($arr[$i]<$arr[$j]){ $tmp = $arr[$j]; $arr[$j] = $arr[$i]; $arr[$i] = $tmp; } } } return $arr; } 19、快速排序,也就是找出一个元素(理论上可以随便找一个)作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。 function quickSort($arr){ $len = count($arr); if($len <=1){ return $arr; } $key = $arr[0]; $leftArr = $rightArr= array(); for($i=1; $i<$len; $i++){ if($arr[$i] <= $key){ $leftArr[] = $arr[$i]; } else{ $rightArr[] = $arr[$i]; } } $leftArr = quickSort($leftArr); $rightArr = quickSort($rightArr); return array_merge($leftArr, array($key), $rightArr); } 20、(递归的)列出目录下所有文件及目录,这里也有两种方法 function listDir($path){ $res = dir($path); while($file = $res->read()){ if($file == '.' || $file == '..'){ continue; } if(is_dir($path . '/' .$file)){ echo $path . '/' .$file . "\r\n"; listDir($path . '/' .$file); } else{ echo $path . '/' .$file . "\r\n"; } } $res->close(); } function listDir($path){ if(is_dir($path)){ if(FALSE !== ($res = opendir($path))){ while(FALSE !== ($file = readdir($res))){ if($file == '.' || $file == '..'){ continue; } $subPath = $path . '/' . $file; if(is_dir($subPath)){ echo $subPath . "\r\n"; listDir($subPath); } else{ echo $subPath . "\r\n"; } } } } } 21、找出相对的目录,比如/a/b/c/d/e.php相对于/a/b/13/34/c.php是/c/d/ function ralativePath($a, $b){ $a = explode('/', dirname($a)); $b = explode('/', dirname($b)); $c = '/'; foreach ($a as $k=> $v){ if($v != $b[$k]){ $c .= $v . '/'; } } echo $c; } 22、快速找出url中php后缀 function get_ext($url){ $data = parse_url($url); return pathinfo($data['path'], PATHINFO_EXTENSION); } 23、正则题,使用正则抓取网页,以网页meta为utf8为准,若是抓取的网页编码为big5之类的,需要转化为utf8再收录 function preg_meta($meta){ $replacement = "\\1utf8\\6\\7"; $pattern = '#(<meta\s+http-equiv=(\'|"|)Content-Type(\'|"|)\s+content=(\'|"|)text/html; charset=)(\w+)(\'|"|)(>)#i'; return preg_replace($pattern, $replacement, $meta); } echo preg_meta("<meta http-equiv=Content-Type content='text/html; charset=big5'><META http-equiv=\"Content-Type\" content='text/html; charset=big5'>"); 24、不用php的反转函数倒序输出字符串,如abc,反序输出cba function revstring($str){ for($i=strlen($str)-1; $i>=0; $i--){ echo $str{$i}; } } revstring('abc'); 25、常见端口 TCP 21端口:FTP 文件传输服务 SSH 22端口:SSH连接linux服务器,通过SSH连接可以远程管理Linux等设备 TCP 23端口:TELNET 终端仿真服务 TCP 25端口:SMTP 简单邮件传输服务 UDP 53端口:DNS 域名解析服务 TCP 80端口:HTTP 超文本传输服务 TCP 110端口:POP3 “邮局协议版本3”使用的端口 TCP 443端口:HTTPS 加密的超文本传输服务 TCP 1521端口:Oracle数据库服务 TCP 1863端口:MSN Messenger的文件传输功能所使用的端口 TCP 3389端口:Microsoft RDP 微软远程桌面使用的端口 TCP 5631端口:Symantec pcAnywhere 远程控制数据传输时使用的端口 UDP 5632端口:Symantec pcAnywhere 主控端扫描被控端时使用的端口 TCP 5000端口:MS SQL Server使用的端口 UDP 8000端口:腾讯QQ 26、linux常用的命令 top linux进程实时监控 ps 在Linux中是查看进程的命令。ps查看正处于Running的进程 mv 为文件或目录改名或将文件由一个目录移入另一个目录中。 find 查找文件 df 可显示所有文件系统对i节点和磁盘块的使用情况。 cat 打印文件类容 chmod 变更文件或目录的权限 chgrp 文件或目录的权限的掌控以拥有者及所诉群组来管理。可以使用chgrp指令取变更文件与目录所属群组 grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。 wc 为统计指定文件中的字节数、字数、行数,并将统计结果显示输出 27、对于大流量的网站,您采用什么样的方法来解决访问量问题 首先,确认服务器硬件是否足够支持当前的流量 其次,优化数据库访问。 第三,禁止外部的盗链。 第四,控制大文件的下载。 第五,使用不同主机分流主要流量 第六,使用流量分析统计软件 28、$_SERVER常用的字段 $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名 $_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称 $_SERVER['REQUEST_METHOD'] #访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT” $_SERVER['QUERY_STRING'] #查询(query)的字符串 $_SERVER['HTTP_HOST'] #当前请求的 Host: 头部的内容 $_SERVER['HTTP_REFERER'] #链接到当前页面的前一页面的 URL 地址 $_SERVER['REMOTE_ADDR'] #正在浏览当前页面用户的 IP 地址 $_SERVER['REMOTE_HOST'] #正在浏览当前页面用户的主机名 $_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名 $_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用 $_SERVER['REQUEST_URI'] #访问此页面所需的 URI。例如,“/index.html” 29、安装php扩展 进入扩展的目录 phpize命令得到configure文件 ./configure --with-php-config=/usr/local/php/bin/php-config make & make install 在php.ini中加入扩展名称.so 重启web服务器(nginx/apache) 30、php-fpm与nginx PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的,在安装的时候也需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中,因此在处理性能方面更加优秀;同时它在处理高并发方面也比spawn-fcgi引擎好很多,因此,推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。 FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求 #fastcgi FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也被许多脚本语言所支持,其中就有PHP。 FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。 FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。 Nginx+FastCGI运行原理 Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。 31、ajax全称“Asynchronous Javascript And XML”(异步JavaScript和XML)

小川游鱼 2019-12-02 01:41:29 0 浏览量 回答数 0

回答

PHP面试干货 1、进程和线程 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 2、apache默认使用进程管理还是线程管理?如何判断并设置最大连接数? 一个进程可以开多个线程 默认是进程管理 默认有一个主进程 Linux: ps -aux | grep httpd | more 一个子进程代表一个用户的连接 Conf/extra/httpd-mpm.conf 多路功能模块 http -l 查询当前apache处于什么模式下 3、单例模式 单例模式需求:只能实例化产生一个对象 如何实现: 私有化构造函数 禁止克隆对象 提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一对象 需要一个保存类的静态属性 class demo { private static $MyObject; //保存对象的静态属性 private function __construct(){ //私有化构造函数 } private function __clone(){ //禁止克隆 } public static function getInstance(){ if(! (self::$MyObject instanceof self)){ self::$MyObject = new self; } return self::$MyObject; } } 4、安装完Apache后,在http.conf中配置加载PHP文件以Apache模块的方式安装PHP,在文件http.conf中首先要用语句LoadModule php5_module "e:/php/php5apache2.dll"动态装载PHP模块,然后再用语句AddType application/x-httpd-php .php 使得Apache把所有扩展名为PHP的文件都作为PHP脚本处理 5、debug_backtrace()函数能返回脚本里的任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的 function one($str1, $str2) { two("Glenn", "Quagmire"); } function two($str1, $str2) { three("Cleveland", "Brown"); } function three($str1, $str2) { print_r(debug_backtrace()); } one("Peter", "Griffin"); Array ( [0] => Array ( [file] => D:\www\test\result.php [line] => 9 [function] => three [args] => Array ( [0] => Cleveland [1] => Brown ) ) [1] => Array ( [file] => D:\www\test\result.php [line] => 5 [function] => two [args] => Array ( [0] => Glenn [1] => Quagmire ) ) [2] => Array ( [file] => D:\www\test\result.php [line] => 16 [function] => one [args] => Array ( [0] => Peter [1] => Griffin ) ) ) 6、输出用户的IP地址,并且判断用户的IP地址是否在192.168.1.100 — 192.168.1.150之间 echo $ip=getenv('REMOTE_ADDR'); $ip=str_replace('.','',$ip); if($ip<1921681150 && $ip>1921681100) { echo 'ip在192.168.1.100—–192.168.1.150之间'; } else { echo 'ip不在192.168.1.100—–192.168.1.150之间'; } 7、请将2维数组按照name的长度进行重新排序,按照顺序将id赋值 $tarray = array( array('id' => 0, 'name' => '123'), array('id' => 0, 'name' => '1234'), array('id' => 0, 'name' => '1235'), array('id' => 0, 'name' => '12356'), array('id' => 0, 'name' => '123abc') ); foreach($tarray as $key=>$val) { $c[]=$val['name']; } function aa($a,$b) { if(strlen($a)==strlen($b)) return 0; return strlen($a)>strlen($b)?-1:1; } usort($c,'aa'); $len=count($c); for($i=0;$i<$len;$i++) { $t[$i]['id']=$i+1; $t[$i]['name']=$c[$i]; } print_r($t); 8、表单数据提交方式POST和GET的区别,URL地址传递的数据最大长度是多少? POST方式提交数据用户不可见,是数据更安全,最大长度不受限制,而GET方式传值在URL地址可以看到,相对不安全,对大长度是2048字节。 9、SESSION和COOKIE的作用和区别,SESSION信息的存储方式,如何进行遍历 SESSION和COOKIE都能够使值在页面之间进行传递,SESSION存储在服务器端,数据更安全,COOKIE保存在客户端,用户使用手段可以进行修改,SESSION依赖于COOKIE进行传递的。Session遍历使用$_SESSION[]取值,cookie遍历使用$_COOKIE[]取值。 10、什么是数据库索引,主键索引,唯一索引的区别,索引的缺点是什么 索引用来快速地寻找那些具有特定值的记录。 主键索引和唯一索引的区别:主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”,每个表只能有一个主键。唯一索引索引列的所有值都只能出现一次,即必须唯一。 索引的缺点: 1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 2、索引需要占用物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,需要的空间就会更大。 3、当对表中的数据进行增加、删除、修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 11、数据库设计时,常遇到的性能瓶颈有哪些,常有的解决方案 瓶颈主要有: 1、磁盘搜索 优化方法是:将数据分布在多个磁盘上 2、磁盘读/写 优化方法是:从多个磁盘并行读写。 3、CPU周期 优化方法:扩充内存 4、内存带宽 12、include和require区别 include引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码。 require引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码。 13、文件上传时设计到点 和文件上传有关的php.ini配置选项(File Uploads): file_uploads=On/Off:文件是否允许上传 upload_max_filesize上传文件时,单个文件的最大大小 post_max_size:提交表单时,整个post表单的最大大小 max_file_uploads =20上传文件的个数 内存占用,脚本最大执行时间也间接影响到文件的上传 14、header常见状态 //200 正常状态 header('HTTP/1.1 200 OK'); // 301 永久重定向,记得在后面要加重定向地址 Location:$url header('HTTP/1.1 301 Moved Permanently'); // 重定向,其实就是302 暂时重定向 header('Location: http://www.maiyoule.com/'); // 设置页面304 没有修改 header('HTTP/1.1 304 Not Modified'); // 显示登录框, header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Basic realm="登录信息"'); echo '显示的信息!'; // 403 禁止访问 header('HTTP/1.1 403 Forbidden'); // 404 错误 header('HTTP/1.1 404 Not Found'); // 500 服务器错误 header('HTTP/1.1 500 Internal Server Error'); // 3秒后重定向指定地址(也就是刷新到新页面与 <meta http-equiv="refresh" content="10;http://www.maiyoule.com/ /> 相同) header('Refresh: 3; url=http://www.maiyoule.com/'); echo '10后跳转到http://www.maiyoule.com'; // 重写 X-Powered-By 值 header('X-Powered-By: PHP/5.3.0'); header('X-Powered-By: Brain/0.6b'); //设置上下文语言 header('Content-language: en'); // 设置页面最后修改时间(多用于防缓存) $time = time() - 60; //建议使用filetime函数来设置页面缓存时间 header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT'); // 设置内容长度 header('Content-Length: 39344'); // 设置头文件类型,可以用于流文件或者文件下载 header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="example.zip"'); header('Content-Transfer-Encoding: binary'); readfile('example.zip');//读取文件到客户端 //禁用页面缓存 header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate'); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Pragma: no-cache'); //设置页面头信息 header('Content-Type: text/html; charset=iso-8859-1'); header('Content-Type: text/html; charset=utf-8'); header('Content-Type: text/plain'); header('Content-Type: image/jpeg'); header('Content-Type: application/zip'); header('Content-Type: application/pdf'); header('Content-Type: audio/mpeg'); header('Content-Type: application/x-shockwave-flash'); //.... 至于Content-Type 的值 可以去查查 w3c 的文档库,那里很丰富 15、ORM和ActiveRecord ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射。为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但是传统的数据库却是关系型的。为了可以靠贴近面向对象开发,我们想要像操作对象一样操作数据库。还可以隔离底层数据库层,我们不需要关心我们使用的是mysql还是其他的关系型数据库 ActiveRecord也属于ORM层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而且简洁易懂。 ActiveRecord的主要思想是: 1. 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的Field; 2. ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CURD;; 3. ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻辑; ActiveRecord比较适用于: 1. 业务逻辑比较简单,当你的类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的,即你的业务逻辑大多数是对单表操作; 2. 当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script),把跨表事务提升到事务脚本中; 3. ActiveRecord最大优点是简单, 直观。 一个类就包括了数据访问和业务逻辑. 如果配合代码生成器使用就更方便了; 这些优点使ActiveRecord特别适合WEB快速开发。 16、斐波那契方法,也就是1 1 2 3 5 8 ……,这里给出两种方法,大家可以对比下,看看哪种快,以及为什么 function fibonacci($n){ if($n == 0){ return 0; } if($n == 1){ return 1; } return fibonacci($n-1)+fibonacci($n-2); } function fibonacci($n){ for($i=0; $i<$n; $i++){ $r[] = $i<2 ? 1 : $r[$i-1]+$r[$i-2]; } return $r[--$i]; } 17、约瑟夫环,也就是常见的数猴子,n只猴子围成一圈,每只猴子下面标了编号,从1开始数起,数到m那么第m只猴子便退出,依次类推,每数到m,那么那个位置的猴子退出,那么最后剩下的猴子下的编号是啥。 function yuesefu($n,$m) { $r=0; for($i=2; $i<=$n; $i++) { $r=($r+$m)%$i; } return $r+1; } 18、冒泡排序,大致是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束 function bubbleSort($arr){ for($i=0, $len=count($arr); $i<$len; $i++){ for($j=0; $j<$len; $j++){ if($arr[$i]<$arr[$j]){ $tmp = $arr[$j]; $arr[$j] = $arr[$i]; $arr[$i] = $tmp; } } } return $arr; } 19、快速排序,也就是找出一个元素(理论上可以随便找一个)作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。 function quickSort($arr){ $len = count($arr); if($len <=1){ return $arr; } $key = $arr[0]; $leftArr = $rightArr= array(); for($i=1; $i<$len; $i++){ if($arr[$i] <= $key){ $leftArr[] = $arr[$i]; } else{ $rightArr[] = $arr[$i]; } } $leftArr = quickSort($leftArr); $rightArr = quickSort($rightArr); return array_merge($leftArr, array($key), $rightArr); } 20、(递归的)列出目录下所有文件及目录,这里也有两种方法 function listDir($path){ $res = dir($path); while($file = $res->read()){ if($file == '.' || $file == '..'){ continue; } if(is_dir($path . '/' .$file)){ echo $path . '/' .$file . "\r\n"; listDir($path . '/' .$file); } else{ echo $path . '/' .$file . "\r\n"; } } $res->close(); } function listDir($path){ if(is_dir($path)){ if(FALSE !== ($res = opendir($path))){ while(FALSE !== ($file = readdir($res))){ if($file == '.' || $file == '..'){ continue; } $subPath = $path . '/' . $file; if(is_dir($subPath)){ echo $subPath . "\r\n"; listDir($subPath); } else{ echo $subPath . "\r\n"; } } } } } 21、找出相对的目录,比如/a/b/c/d/e.php相对于/a/b/13/34/c.php是/c/d/ function ralativePath($a, $b){ $a = explode('/', dirname($a)); $b = explode('/', dirname($b)); $c = '/'; foreach ($a as $k=> $v){ if($v != $b[$k]){ $c .= $v . '/'; } } echo $c; } 22、快速找出url中php后缀 function get_ext($url){ $data = parse_url($url); return pathinfo($data['path'], PATHINFO_EXTENSION); } 23、正则题,使用正则抓取网页,以网页meta为utf8为准,若是抓取的网页编码为big5之类的,需要转化为utf8再收录 function preg_meta($meta){ $replacement = "\\1utf8\\6\\7"; $pattern = '#(<meta\s+http-equiv=(\'|"|)Content-Type(\'|"|)\s+content=(\'|"|)text/html; charset=)(\w+)(\'|"|)(>)#i'; return preg_replace($pattern, $replacement, $meta); } echo preg_meta("<meta http-equiv=Content-Type content='text/html; charset=big5'><META http-equiv=\"Content-Type\" content='text/html; charset=big5'>"); 24、不用php的反转函数倒序输出字符串,如abc,反序输出cba function revstring($str){ for($i=strlen($str)-1; $i>=0; $i--){ echo $str{$i}; } } revstring('abc'); 25、常见端口 TCP 21端口:FTP 文件传输服务 SSH 22端口:SSH连接linux服务器,通过SSH连接可以远程管理Linux等设备 TCP 23端口:TELNET 终端仿真服务 TCP 25端口:SMTP 简单邮件传输服务 UDP 53端口:DNS 域名解析服务 TCP 80端口:HTTP 超文本传输服务 TCP 110端口:POP3 “邮局协议版本3”使用的端口 TCP 443端口:HTTPS 加密的超文本传输服务 TCP 1521端口:Oracle数据库服务 TCP 1863端口:MSN Messenger的文件传输功能所使用的端口 TCP 3389端口:Microsoft RDP 微软远程桌面使用的端口 TCP 5631端口:Symantec pcAnywhere 远程控制数据传输时使用的端口 UDP 5632端口:Symantec pcAnywhere 主控端扫描被控端时使用的端口 TCP 5000端口:MS SQL Server使用的端口 UDP 8000端口:腾讯QQ 26、linux常用的命令 top linux进程实时监控 ps 在Linux中是查看进程的命令。ps查看正处于Running的进程 mv 为文件或目录改名或将文件由一个目录移入另一个目录中。 find 查找文件 df 可显示所有文件系统对i节点和磁盘块的使用情况。 cat 打印文件类容 chmod 变更文件或目录的权限 chgrp 文件或目录的权限的掌控以拥有者及所诉群组来管理。可以使用chgrp指令取变更文件与目录所属群组 grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。 wc 为统计指定文件中的字节数、字数、行数,并将统计结果显示输出 27、对于大流量的网站,您采用什么样的方法来解决访问量问题 首先,确认服务器硬件是否足够支持当前的流量 其次,优化数据库访问。 第三,禁止外部的盗链。 第四,控制大文件的下载。 第五,使用不同主机分流主要流量 第六,使用流量分析统计软件 28、$_SERVER常用的字段 $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名 $_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称 $_SERVER['REQUEST_METHOD'] #访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT” $_SERVER['QUERY_STRING'] #查询(query)的字符串 $_SERVER['HTTP_HOST'] #当前请求的 Host: 头部的内容 $_SERVER['HTTP_REFERER'] #链接到当前页面的前一页面的 URL 地址 $_SERVER['REMOTE_ADDR'] #正在浏览当前页面用户的 IP 地址 $_SERVER['REMOTE_HOST'] #正在浏览当前页面用户的主机名 $_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名 $_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用 $_SERVER['REQUEST_URI'] #访问此页面所需的 URI。例如,“/index.html” 29、安装php扩展 进入扩展的目录 phpize命令得到configure文件 ./configure --with-php-config=/usr/local/php/bin/php-config make & make install 在php.ini中加入扩展名称.so 重启web服务器(nginx/apache) 30、php-fpm与nginx PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的,在安装的时候也需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中,因此在处理性能方面更加优秀;同时它在处理高并发方面也比spawn-fcgi引擎好很多,因此,推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。 FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求 #fastcgi FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也被许多脚本语言所支持,其中就有PHP。 FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。 FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。 Nginx+FastCGI运行原理 Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。 31、ajax全称“Asynchronous Javascript And XML”(异步JavaScript和XML)

小川游鱼 2019-12-02 01:41:29 0 浏览量 回答数 0

问题

SaaS模式云数据仓库MaxCompute 百问百答合集(持续更新20200921)

亢海鹏 2020-05-29 15:10:00 22476 浏览量 回答数 22
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 阿里云双十一主会场 阿里云双十一新人会场 1024程序员加油包 阿里云双十一拼团会场 场景化解决方案 阿里云双十一直播大厅