关于大数据:Flink-中极其重要的-Time-与-Window-详细解析深度好文建议收藏

前言Flink 是流式的、实时的 计算引擎 下面一句话就有两个概念,一个是流式,一个是实时。 流式:就是数据源源不断的流进来,也就是数据没有边界,然而咱们计算的时候必须在一个有边界的范畴内进行,所以这外面就有一个问题,边界怎么确定? 无非就两种形式,依据时间段或者数据量进行确定,依据时间段就是每隔多长时间就划分一个边界,依据数据量就是每来多少条数据划分一个边界,Flink 中就是这么划分边界的,本文会具体解说。 实时:就是数据发送过去之后立马就进行相干的计算,而后将后果输入。这里的计算有两种: 一种是只有边界内的数据进行计算,这种好了解,比方统计每个用户最近五分钟内浏览的新闻数量,就能够取最近五分钟内的所有数据,而后依据每个用户分组,统计新闻的总数。另一种是边界内数据与内部数据进行关联计算,比方:统计最近五分钟内浏览新闻的用户都是来自哪些地区,这种就须要将五分钟内浏览新闻的用户信息与 hive 中的地区维表进行关联,而后在进行相干计算。本篇文章所讲的 Flink 的内容就是围绕以上概念进行具体分析的! Time与WindowTime在Flink中,如果以时间段划分边界的话,那么工夫就是一个极其重要的字段。 Flink中的工夫有三种类型,如下图所示: Event Time:是事件创立的工夫。它通常由事件中的工夫戳形容,例如采集的日志数据中,每一条日志都会记录本人的生成工夫,Flink通过工夫戳分配器拜访事件工夫戳。Ingestion Time:是数据进入Flink的工夫。Processing Time:是每一个执行基于工夫操作的算子的本地零碎工夫,与机器相干,默认的工夫属性就是Processing Time。例如,一条日志进入Flink的工夫为2021-01-22 10:00:00.123,达到Window的零碎工夫为2021-01-22 10:00:01.234,日志的内容如下: 2021-01-06 18:37:15.624 INFO Fail over to rm2 对于业务来说,要统计1min内的故障日志个数,哪个工夫是最有意义的?—— eventTime,因为咱们要依据日志的生成工夫进行统计。 WindowWindow,即窗口,咱们后面始终提到的边界就是这里的Window(窗口)。 官网解释:流式计算是一种被设计用于解决有限数据集的数据处理引擎,而有限数据集是指一种一直增长的实质上有限的数据集,而window是一种切割有限数据为无限块进行解决的伎俩。 所以Window是有限数据流解决的外围,Window将一个有限的stream拆分成无限大小的”buckets”桶,咱们能够在这些桶上做计算操作。 Window类型本文刚开始提到,划分窗口就两种形式: 依据工夫进行截取(time-driven-window),比方每1分钟统计一次或每10分钟统计一次。依据数据进行截取(data-driven-window),比方每5个数据统计一次或每50个数据统计一次。 对于TimeWindow(依据工夫划分窗口), 能够依据窗口实现原理的不同分成三类:滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)和会话窗口(Session Window)。 滚动窗口(Tumbling Windows)将数据根据固定的窗口长度对数据进行切片。 特点:工夫对齐,窗口长度固定,没有重叠。 滚动窗口分配器将每个元素调配到一个指定窗口大小的窗口中,滚动窗口有一个固定的大小,并且不会呈现重叠。 例如:如果你指定了一个5分钟大小的滚动窗口,窗口的创立如下图所示: 实用场景:适宜做BI统计等(做每个时间段的聚合计算)。 滑动窗口(Sliding Windows)滑动窗口是固定窗口的更狭义的一种模式,滑动窗口由固定的窗口长度和滑动距离组成。 特点:工夫对齐,窗口长度固定,有重叠。 滑动窗口分配器将元素调配到固定长度的窗口中,与滚动窗口相似,窗口的大小由窗口大小参数来配置,另一个窗口滑动参数管制滑动窗口开始的频率。因而,滑动窗口如果滑动参数小于窗口大小的话,窗口是能够重叠的,在这种状况下元素会被调配到多个窗口中。 例如,你有10分钟的窗口和5分钟的滑动,那么每个窗口中5分钟的窗口里蕴含着上个10分钟产生的数据,如下图所示: 实用场景:对最近一个时间段内的统计(求某接口最近5min的失败率来决定是否要报警)。 会话窗口(Session Windows)由一系列事件组合一个指定工夫长度的timeout间隙组成,相似于web利用的session,也就是一段时间没有接管到新数据就会生成新的窗口。 特点:工夫无对齐。 session窗口分配器通过session流动来对元素进行分组,session窗口跟滚动窗口和滑动窗口相比,不会有重叠和固定的开始工夫和完结工夫的状况,相同,当它在一个固定的工夫周期内不再收到元素,即非流动距离产生,那个这个窗口就会敞开。一个session窗口通过一个session距离来配置,这个session距离定义了非沉闷周期的长度,当这个非沉闷周期产生,那么以后的session将敞开并且后续的元素将被调配到新的session窗口中去。 Window APITimeWindowTimeWindow是将指定工夫范畴内的所有数据组成一个window,一次对一个window外面的所有数据进行计算(就是本文结尾说的对一个边界内的数据进行计算)。 咱们以 红绿灯路口通过的汽车数量 为例子: 红绿灯路口会有汽车通过,一共会有多少汽车通过,无奈计算。因为车流源源不断,计算没有边界。 所以咱们统计每15秒钟通过红路灯的汽车数量,如第一个15秒为2辆,第二个15秒为3辆,第三个15秒为1辆 ... ...

January 25, 2021 · 5 min · jiezi

关于大数据:Elastic开源协议改了用户怎么办

1月15日,寰球驰名的大数据搜寻与实时处理公司Elastic公司CEO Shay Banon忽然发文发表,Elasticsearch和Kibana的其中一项开源许可协定将产生变更。 据悉,此次许可协定变更对大部分收费应用默认发行版的社区用户没有影响,次要限度的是云服务提供商。 当然这并不是Elastic第一次更改开源许可协定。专家介绍,Elastic曾在2018年就更改过一次开源许可协定。 同样,在开源畛域,数据库软件MongDB、Redis Lab、图数据库Neo4j等在2018年就批改过相干的开源许可协定,以扭转其在数据库商业化方面面临的“吸血”窘境。 此次Elastic批改开源软件许可协定,必然会对应用Elasticsearch和Kibana的大量用户生产重大影响,尤其会对私有云上的用户造成冲击。如何躲避影响,保障利用稳固继续经营是大量的中国用户面临的一个次要问题。 另外,在开源软件失去大量利用的状况中,用户不得不面对开源软件协定批改带来的微小危险。 1.中国也有本人的大数据综合搜索引擎Transwarp New Search作为目前世界上十分风行的数据搜寻与实时剖析引擎,Elasticsearch赫赫有名,单单2018年其下载量就超过了2.25亿人次,寰球泛滥公司以某一种模式应用它。 Elasticsearch首个版本公布于2012年。通过7年多的更新迭代,Elastic Stack生态曾经日渐成熟,在国内领有越来越多的用户,利用Elasticsearch的开发人群也不断扩大。 开发者利用Elastic Stack开发出灵便的软件,在搜寻、日志记录、平安防护、运维指标监控、数据库减速等利用场景,以及在互联网与软件业、金融业等行业失去广泛应用。 近些年来,云服务提供商始终在应用开源产品,批改其代码,开发托管(免费)服务解决方案版本。然而,批改后的代码将无奈作为开源代码加以拜访。 同时云服务商的商业行为也障碍了开源软件公司商业化。在开源许可下,如何实现盈利,实现更衰弱的倒退,则成为开源软件公司面临的最大挑战。 因而,Elasticsearch和Kibana在许可证方面进行了重大的更改,由开源Apache 2.0许可证,改为采纳SSPL(服务器端公共许可证)。 早在2018年,MongoDB就扭转了许可协定,采纳了SSPL(服务器端公共许可证),以爱护开源代码,防止被云服务提供商用来开发本人的SaaS/DBaaS产品。 毫无疑问,Elastic更改许可协定对用户尤其是云上托管的利用必然造成微小的冲击。不少国家都把开源软件批改许可协定,列为软件产业倒退的一大危险,引发寰球相干用户的恐慌。 侥幸的是,在国家政策的大力支持下,我国信创产业一直发展壮大。在大数据综合搜寻的国产化自主可控方面,国内曾经推出了本人的产品。 中国大数据与AI根底软件的领导企业星环科技曾经推出了齐全能够替换Elasticsearch的大数据综合搜索引擎——Transwarp New Search这一国内当先的大规模统计和搜寻交融引擎,岂但能够实现用户对全文搜寻、关系的准确查问及剖析需要,而且还在半结构化数据检索、时空数据检索、语义检索、含糊检索等方面更胜一筹。 受国家自主可控政策的反对,以及星环科技技术的一直冲破,星环科技曾经实现了大数据根底软件的齐全自主研发,将来将不会存在开源软件Hadoop身影,其大数据根底软件产品在不同畛域开始替换甲骨文、IBM等国外软件。 超过2000多家不同行业的用户,抉择应用星环科技自主研发的平台构建大数据底层的基础设施,为各个行业赋予相干的业务能力,波及金融、政府、能源、制作、交通、教育等。 2.New Search青出于蓝而胜于蓝星环科技自研的Transwarp New Search用于在企业外部构建大数据搜索引擎。New Search反对Word/Excel/PDF/CSV/互联网数据/图片/音影等非结构化数据格式的存储和检索,在PB级数据量上进行检索时,可能秒级返回。 在开发接口方面,New Search提供了残缺的SQL语法,反对并提供搜寻语法SQL扩大,通过和星环科技的剖析型数据库Inceptor优化器无效联合,使开发者无需理解底层架构,就能够开发出高效的搜索引擎。 与开源的大数据搜索引擎Elasticsearch(ES)相比,星环科技自研New Search具备更多的劣势: New Search提供分布式计算引擎,能满足多表关联和简单聚合剖析等场景需要,扭转了开源的Elasticsearch聚合后果不精确的问题,提供准确聚合。 New Search反对规范SQL、SQL扩大搜寻语义,以及Oracle、DB2L方言,配套星环本人的平安管控平台Guardian 和大数据管理平台Manager,不便平安治理和运维治理。 在全文检索方面,New Search反对pdf/word/excel等罕用格局文档的存储和搜寻,提供中、维、藏、英、法、日、韩、德、西、葡等多种语言分词器,反对文章类似度匹配、关键字提取、摘要提取等自然语言解决性能。 New Search时空数据库模块反对包含点、线、多边形、汇合类型在内的OGC定义的规范图形类型,反对基于WMTS协定的瓦片服务,反对随同剖析、轨迹类似度匹配等时空数据库算法。 另外,New Search在大数据量、大集群环境下的性能体现优异,绝对于开源的Elasticsearch(ES)有了显著的改善: 在硬件投入老本无限时,用户心愿要尽可能进步资源利用率,因而集群单节点反对实例量就显得至关关重要。New Search单节点反对单实例 50TB,远超过开源ES单节点单实例10TB。 当用户的数据总量达到百TB-PB量级时,采纳开源ES软件当实例超过100个节点时,会呈现连环失联等稳定性问题。而星环科技的New Search产品为大集群专门调优参数,能大幅缓解节点失联等问题,而采纳最新一代的New Search,反对节点或实例达到200个以上节点时,仍然能有更好的稳定性。 大数据搜寻对高可用要求高,应能保障99%以上的SLA服务水平协定,在有节点异常情况下可主动疾速复原,当须要人工运维染指时能提供工具疾速诊断和修复集群。开源ES软件TB数量级节点重启个别须要数小时,而星环科技的New Search,TB数量级节点重启只需几分钟。 下图所示为NS在不同存量数据规模状况下的重启耗时,其中cold和hot的区别在于是否排除操作系统pageCache影响。 对于数据维度高,须要做多表关联分的业务,星环科技的New Search一改开源ES不间接反对多表关联操作的做法,满足一个查问后果须要从两个或两个以上表中提取字段数据的多表关联查问的需要。 对于短平快查问,开源ES反对最大并发量个别在700-800,且受GC影响,查问性能有毛刺。而星环科技的New Search一代产品查问流程优化,缩小一次rpc,响应工夫缩小30%,而且通过offheap、automerge、cooling等技术缩小heap占用,受GC影响变小。 最新一代New Search,进行了线程池优化和lucene优化,内存占用持续减小1/3,受GC稳定更小,既满足短平快查问秒级需要,又能满足查问高峰期高并发量。如下图所示,单机存量数据为4.5T的状况下,New Search通过对堆外内存的高效应用,大幅度缩小了堆内存的占用,明显降低了GC压力。 用户的查问次要针对最近N天内的数据,对再老的数据查问频度绝对不高。面对这一需要,开源ES没有对冷热数据做特地解决,而星环科技的New Search对冷热数据做了优化,晋升了查问性能。 当集群规模很大,表格分片较多的状况下,开源ES因为其本身PP架构和均衡策略的局限,会造成DDL操作提早十分高,造成显著的应用卡顿和集群高负载。而New Search的核心式架构可能显著优化这方面的性能, 测试对比方下图。 ...

January 25, 2021 · 1 min · jiezi

关于大数据:大数据场景下Volcano高效调度能力实践

摘要:本篇文章将会从Spark on Kubernetes 倒退历程以及工作原理,以及介绍一下Spark with Volcano,Volcano如何可能帮忙 Spark运行地更高效。本篇文章将会从Spark on Kubernetes 倒退历程以及工作原理,第二局部大略介绍一下Spark with Volcano,Volcano如何可能帮忙 Spark运行地更高效。 Spark on Kubernetes咱们来看Spark on Kubernetes的背景。其实Spark在从2.3这个版本开始之后,就曾经反对了Kubernetes native,能够让Spark的用户能够把作业运行在Kubernetes上,用Kubernetes去治理资源层。在2.4版本里减少了client mode和Python语言的反对。而在往年的公布的Spark 3.0外面,对Spark on Kubernetes这一方面也减少了很多重要的个性,减少动静资源分配、远端shuffle service以及 Kerberos 反对等。 Spark on Kubernetes的劣势: 1)弹性扩缩容 2)资源利用率 3)对立技术栈 4)细粒度的资源分配 5)日志和监控 Spark submit 工作原理Spark对于Kubernetes的反对,最早的一种工作形式是通过 Spark官网的spark submit形式去反对,Clinet通过Spark submit提交作业,而后spark driver会调用apiserver的一些api去申请创立 executor,executor都起来之后,就能够执行真正的计算工作,之后会做日志备份。 这种形式有一个劣势是,传统的 Spark用户切换到这种形式之后用户体验扭转大。但也存在短少作业周期治理的缺点。 Spark-operator 工作原理第二种Spark on Kubernetes的应用形式就是operator。operator是更Kubernetes的形式,你看他的整个作业提交,先是yaml文件通过kubectl提交作业,在这外面它有本人的crd,即SparkApplication,Object。创立了SparkApplication之后, Controller能够watch到这些资源的创立,后边流程其实是复用的第一种工作模式,然而通过这种模式,做的更欠缺的一些。 绝对于第一种形式来讲,这里的Controller能够保护对象生命周期,能够watch spark driver的状态,并更新application的状态,是一个更欠缺的解决方案。 这两种不同的应用形式应用是各有劣势,不少的公司两种形式都有应用。这一块在官网也有介绍。 Spark with VolcanoVolcano对于下面提到两种工作形式都进行了集成和反对。这个链接是咱们保护的 Spark开源代码仓库: https://github.com/huawei-clo... 在这外面Volcano做的事件其实也很简略,你看整个提交的过程,首先是通过spark submit提交作业,提交作业时会创立一个podgroup,podgroup蕴含了用户配置的一些调度相干的信息。它的yaml文件大家能够看到,页面左边这个局部,减少了driver和executor两个角色。 Volcano 队列队列其实咱们在第一堂和第二堂课外面也讲到了。因为Kubernetes外面没有队列的反对,所以它在多个用户或多个部门在共享一个机器的时候资源没方法做共享。但不论在HPC还是大数据畛域里,通过队列进行资源共享都是根本的需要。 在通过队列做资源共享时,咱们提供了多种机制。图最下面的这种,这外面咱们创立两个队列,通过这两个队列去共享整个集群的资源,一个队列给他分40%的征询资源,另一个给他分60%的资源,这样的话就能够把这两个不同的队列映射到不同的部门或者是不同的我的项目各自应用一个队列。这在一队列里,资源不必的时候,能够给另外一个队列外面的作业去应用。上面讲的是两个不同的namespace之间的资源均衡。Kubernetes里当两个不同的利用零碎的用户都去提交作业时,提交作业越多的用户,他取得的集群的资源会越多,所以在这外面基于namespace,咱们进行偏心的调度,保障namespace之间能够依照权重分享集群的资源。 Volcano: Pod delay creation之前介绍这个场景的时候,有些同学反映没有太听懂,所以我加了几页PPT扩大一下。 ...

January 25, 2021 · 1 min · jiezi

关于大数据:连云港云底座构建智慧教育的未来图景

从漆木黑板到多媒体电子屏,从习题册到海量在线题库,从三尺讲台到开放式在线课堂……现在,以教育信息化带动教育现代化已成为教育改革倒退的根本策略。作为淮口重镇、东海名郡,连云港市疾速响应国家教育信息化2.0行动计划,以“云数智”夯实基础设施“底座“,构建智慧教育”堡垒“。 云慧教育 重塑数据治理 在浪潮的助力下,连云港市依靠大数据、云计算等新一代信息技术,通过摸清全市教育数据“家底”,整合市内各级教育业务口数据,纵向对接上级部门数据,横向整合各类涉教数据,搭建连云港智慧教育大数据平台;通过整合汇聚全市各类教育数据资源,建设数据共享、共用和业务协同的体制机制。 基于数据共享成绩,连云港市统筹规划建设教育大数据系统,通过搭建高标准、高性能的教育云“底座”,实现对全市教育云计算、存储及网络资源的集约化管控,实现资源统建、利用统管、服务统优。 依靠教育数据治理平台,连云港市汇聚整合各类教育数据,交融其余行业和互联网相干数据,搭建各类剖析场景模型,为教育治理、老师倒退、学生个性化造就以及教育决策反对提供数据智能剖析利用;通过建设直观牢靠的大数据可视化剖析展现零碎,提供基于数据的预测剖析算法,全力打造港城智慧教育的“第一张名片”。 校情管理系统:联合GIS地理信息系统,实现对立的地理信息服务,为连云港市教育大数据平台各业务信息系统在地理位置、教育资源散布、区域资源剖析等方面提供地图利用性能服务。教育督导管理系统:针对教育部督导及促成义务教育平衡倒退的要求,对督导工作及教育平衡倒退评估进行治理,实现全市范畴内督导信息的网络管理;通过平衡倒退规范模型,对学校平衡倒退状况开展评估流动,实现从治理督导到智慧督导。校园安全监控零碎:接入学校的视频监控设施,实现对立监控。教育局可查看学校所有接入摄像机的画面,零碎集成度高、兼容性强,搭建“大数据”下的安全校园“堡垒”。千人千面 助力因材施教 实现“因材施教”,打造“千人千面”的大数据平台是根底。连云港市依靠教育大数据系统,基于海量教育数据,提供定制化的数据经营服务,营造更加个性化、智能化、数字化的学习环境,切实助力智慧教育利用撑持服务。通过大数据行为剖析、智能推送等技术手段构建智慧环境下的教育教学新模式,实现教学学习的差异化和个性化,进一步晋升教育品质。 连云港市教育大数据系统能够基于学生用户数据肖像进行个性化剖析,实现大规模教学状态下的个性化因材施教。 学生生涯规划零碎可能实现海量院校业余查问、职业待业查问、院校录取预测、最优意愿智能举荐,为新高考政策下学生选课和生涯规划提供迷信的领导,实现凭劣势智慧升学,凭强势智慧谋生。 在线约课+智慧课堂 重构将来教育状态 疫情期间“复课不停学”充沛展现了数字化翻新与教育行业场景的深入交融,教学模式与数字技术的联合正在重构将来教育状态。 连云港创立名师约课零碎,利用互联网、挪动互联网以及录播教室等信息化伎俩,实现名师课程公布以及学生利用手机、电脑近程预约上课性能,满足“后疫情”时代教育教学的新需要。 连云港市教育大数据系统基于欠缺的数据采集、传输、解决和剖析能力,推动优质教育教学资源的遍及,推动在线教育、智慧课堂等智能化伎俩在助力课堂教学方面施展重要作用。 以智慧教育为切入点,浪潮基于云计算、大数据等新一代技术,在连云港市教育信息化现有成绩根底之上,采纳“平台+数据+服务”的设计理念,建成“互联网+教育”大平台根底框架,提供智能化、一体化、信息化产品和解决方案。 将来,浪潮云将在智慧教育领域持续耕耘,以“云底座”搭建教育信息化的快车道,为进步教育数字治理程度奉献浪潮力量。

January 22, 2021 · 1 min · jiezi

关于大数据:抖音数据采集Frida教程Frida-Java-Hook-详解代码及示例下

抖音数据采集Frida教程,Frida Java Hook 详解:代码及示例(下)短视频、直播数据实时采集接口,请查看文档: TiToData免责申明:本文档仅供学习与参考,请勿用于非法用处!否则所有后果自负。 1.1 Java层拦挡外部类函数之前咱们曾经学习过了HOOK一般函数、办法重载、构造函数,当初来更深刻的学习HOOK在Android逆向中,咱们也会常常遇到在Java层的外部类。Java外部类函数,使得咱们更难以剖析代码。咱们在这章节中对内部类进行一个根本理解和应用FRIDA对内部类进行钩子拦挡解决。什么是外部类?所谓外部类就是在一个类外部进行其余类构造的嵌套操作,它的长处是外部类与外部类能够不便的拜访彼此的公有域(包含公有办法、公有属性),所以Android中有很多的中央都会应用到外部类,咱们来见一个例子也是最直观的,如下图4-17。图4-17 User类中的clz类在图4-17中看到User类中嵌套了一个clz,这样的操作也是不足为奇了。在frida中,咱们能够应用$符号对起进行解决。首先关上jadxgui软件对代码进行反编译,反编译之后进入User类,下方会有一个smali的按钮,点击smali则会进入smali代码,进入smali代码间接按ctrl+f部分搜寻字符串clz,因为clz是外部类的名称,那么就会搜到Lcom/roysue/roysueapplication/User\$clz;,咱们将翻译成java代码就是:com.roysue.roysueapplication.User\$clz,去掉第一个字符串的L和/以及;就形成了外部类的具体类名了,见下图4-18。图4-18 smali代码通过下面的剖析咱们曾经得悉最重要的局部类的门路:com.roysue.roysueapplication.User\$clz,当初来对内部类进行HOOK,当初开始编写js脚本。 1.1.1 拦挡外部类函数代码示例function hook_overload_3() { if(Java.available) { Java.perform(function () { console.log("start hook"); //留神此处类的门路填写更改所剖析的门路 var clz = Java.use('com.roysue.roysueapplication.User$clz'); if(clz != undefined) { //这边也是像失常的函数来hook即可 clz.toString.implementation = function (){ console.log("胜利hook clz类"); return this.toString(); } } else { console.log("clz: undefined"); } console.log("start end"); }); }}执行脚本之后,咱们能够看到管制也曾经胜利附加并且打印了胜利hook clz类,这样咱们也可能对Java层的外部类进行解决了。 [Google Pixel::com.roysue.roysueapplication]-> 胜利hook clz类胜利hook clz类1.2 Java层枚举所有的类并定位类在后面咱们学会了如何在java层的各种函数的HOOK操作了,当初开始学习枚举所有的类并定位类的骚套路了~,学习之前咱们要理解API中的enumerateLoadedClasses办法,它是属于Java对象中的一个办法。可能枚举当初加载的所有类,enumerateLoadedClasses存在2个回调函数,别离是onMatch:function(ClassName):为每个加载的具备className的类调用,每个ClassName返回来的都是一个类名;和onComplete:function():在枚举所有类枚举完之后回调一次。 1.2.1 枚举所有的类并定位类代码示例setTimeout(function (){ Java.perform(function (){ console.log("n[*] enumerating classes..."); //Java对象的API enumerateLoadedClasses Java.enumerateLoadedClasses({ //该回调函数中的_className参数就是类的名称,每次回调时都会返回一个类的名称 onMatch: function(_className){ //在这里将其输入 console.log("[*] found instance of '"+_className+"'"); //如果只须要打印出com.roysue包下所有类把这段正文即可,想打印其余的替换掉indexOf中参数即可定位到~ //if(_className.toString().indexOf("com.roysue")!=-1) //{ // console.log("[*] found instance of '"+_className+"'"); //} }, onComplete: function(){ //会在枚举类完结之后回调一次此函数 console.log("[*] class enuemration complete"); } }); });});当咱们执行该脚本时,注入指标过程之后会开始调用onMatch函数,每次调用都会打印一次类的名称,当onMatch函数回调实现之后会调用一次onComplete函数,最初会打印出class enuemration complete,见下图。图4-19 枚举所有类 ...

January 20, 2021 · 3 min · jiezi

关于大数据:Smartbi入选第二届数字科技兵器谱TOP50迈向大数据行业标杆

2020年1月13日,在北京召开的“数字经济、数字科技、数字金融——2021零壹财经·零壹智库峰会”上,零壹财经从企业的产品能力、团队能力、经营能力、资本认可度、企业资质及品牌影响力六个维度登程,遴选出数字科技程度走在行业前列的公司。Smartbi凭借实力胜利入选“第二届数字科技兵器谱TOP50”,同时上榜的还有阿里云、京东数科、安全科技、桔子数科、腾讯海纳等数字科技机构。 此次评比面向 “人工智能”、“大数据”、“云计算”、“物联网”、“区块链”等畛域的公司,波及的行业畛域蕴含且不限于金融、城市、政务、批发、医疗、地产、工业等,思迈特软件可能入围零壹财经“第二届数字科技兵器谱TOP50”榜单,是社会各界对思迈特软件在数字化转型过程中作出的杰出贡献和卓越影响力的竭力必定。 近两年“新基建”屡被国家重点关注,在十三届全国人大三次会议上,“新基建”首次在政府工作报告中被提及,以数字技术为外围的“新基建”正成为我国新一轮经济增长的次要能源。近年来,思迈特软件始终在“新基建”及产业数字化的路线上前行,现已胜利笼罩金融、地产、制作、医疗等行业上千家客户,产品广泛应用于领导驾驶舱、KPI监控看板、财务剖析、销售剖析、市场剖析、生产剖析、供应链剖析、危险剖析、品质剖析、客户细分、精准营销等治理畛域。 2021年将是激动人心的一年,在向高质量倒退时代迈进的新要求下,Smartbi将肩负起新的时代使命与工作,在新基建浪潮下激流勇进,动摇对行业倒退的数字化变革,一直激发新业态、新模式,以领头羊的身份引领大数据BI行业的新倒退。

January 20, 2021 · 1 min · jiezi

关于SegmentFault:谈谈统计学正态分布阈值原理在数据分析工作中的运用

一、背景0.0 神说,要有正态分布,于是就有了正态分布。 0.1 神看正态分布是好的,就让随机误差都随了正态分布。 0.2 正态分布的微妙之处,就是许多看似随机事件居然遵从一个表达式就能表白的散布,如同上帝之手特意为之。 神感觉抛硬币是好的,于是定义每个抛出硬币侧面记+1分,背面记-1分。创世纪从0分开始,神只抛1次硬币,有2种可能:一半的概率+1分,一半的概率-1分。此时概率分布大略是这样的: 神决定扔10个硬币,此时概率分布如下: 如果画图来感触,数据分布大略如下: 如果是100个,甚至是无穷多个呢?均匀分数散布状况大略是什么样呢?画个图感受一下: ——《创世纪·数理统计·正态分布的前世今生》 结尾摘自统计学中十分经典的一本书籍,由此可见正态分布是十分经典和随处可见的,为什么正态分布这么常见呢?因为通常状况下,一个事物的影响因素都是多个,好比每个人的学习成绩,受到多个因素的影响,比方: 自己的智商状况。上课听讲的认真水平,课前的预习水平,与老师的互动水平。课后是否及时温习,有没有及时复习知识点呢,有没有做好作业坚固。每一天的因素,每天的行为,对于学生的问题不是产生侧面因素就是负面因素,这些因素对于问题的影响不是侧面就是负面的,重复累计加持就像上图的抛硬币一样,让问题最初呈现出正态分布。数据出现正态分布其实背地是有核心极限定理原理反对,依据核心极限定理,如果事物受到多种因素的影响,不论每个因素独自自身是什么散布,他们加总后后果的平均值就是正态分布。 二、援用正是因为日常剖析工作中数据出现是正态分布的,处于两个极其的值往往是异样的,与咱们筛选异样值人造符合。在业务方寻求一种主动监控计划的过程中,咱们抉择了该计划。依据数据分析工作中,联合统计学的数据阈值散布原理,通过主动划分数据级别范畴,确定异样值,如下图箱线图,箱线图是一个可能通过5个数字来形容数据的散布的规范形式,这5个数字包含:最小值,第一分位,中位数,第三分位数,最大值,箱线图可能明确的展现离群点的信息,同时可能让咱们理解数据是否对称,数据如何分组、数据的峰度。 箱线图是一个可能通过5个数字来形容数据的散布的规范形式,这5个数字包含:最小值,第一分位,中位数,第三分位数,最大值,箱线图可能明确的展现离群点的信息,同时可能让咱们理解数据是否对称,数据如何分组、数据的峰度,对于某些散布/数据集,会发现除了集中趋势(中位数,均值和众数)的度量之外,还须要更多信息。 (图片来源于网络) 须要无关数据变异性或分散性的信息。箱形图是一张图表,它很好地批示数据中的值如何散布,只管与直方图或密度图相比,箱线图仿佛是原始的,但它们具备占用较少空间的劣势,这在比拟许多组或数据集之间的散布时十分有用。——实用于大批量的数据稳定监控。 (图片来源于网络)  箱线图是一种基于五位数摘要(“最小”,第一四分位数(Q1),中位数,第三四分位数(Q3)和“最大”)显示数据分布的标准化办法。 中位数(Q2 / 50th百分位数):数据集的两头值;第一个四分位数(Q1 / 25百分位数):最小数(不是“最小值”)和数据集的中位数之间的两头数;第三四分位数(Q3 / 75th Percentile):数据集的中位数和最大值之间的两头值(不是“最大值”);四分位间距(IQR):第25至第75个百分点的间隔;晶须(蓝色显示);离群值(显示为绿色圆圈);“最大”:Q3 + 1.5 * IQR;“最低”:Q1 -1.5 * IQR。 (图片来源于网络) 上图是近似正态分布的箱线图与正态分布的概率密度函数(pdf)的比拟, 两侧0.35%的数据就可能被视为异样数据。 回到这次的监控计划,由中位数向两边扩散,划分一级二级三级四级五级数据,传入间断时间段内指标的同环比,依据同环比散布的区间确定四个异样类型:异样上涨(同环比散布同时大于等于正三级)、异样(同环比散布在一正一负大于等于三级的范畴)、异样降落(同环比散布低于等于负三级)、无异样(同环比散布低于三级的范畴)。 三、落地实现三部曲 1. 代码实现/**数据分析API服务*/public class DataAnalysis{ /**稳定剖析*input:json,剖析源数据(样例){"org_data": [ { "date":"2020-02-01", "data":"10123230" }, 日期类型、long类型 { "date":"2020-02-02", "data":"9752755" }, { "date":"2020-02-03", "data":"12123230" }, ....... ]}*output:json,剖析后果{ "type": 1, --调用失常返回1,异样返回0 "message":"", --异样起因"date": 2020-02-14,--输出数据中按日期升序排列的最初一组的日期"data": 6346231,--输出数据中按日期升序排列的最初一组的数据值"rate1": -0.3,--同比值"rate2": -0.6,--环比值"level1": 4,--同比等级,5个类型:1、2、3、4、5"level2": 3,--环比等级,5个类型:1、2、3、4、5"result":"异样降落",--四个类型:异样上涨、异样、异样降落、无异样}*/ public String fluctuationAnalysis (String org_data){ //第一步,校验输出数据 if(checkOrgdata(org_data)) return {"result": 0, "message":""} //第二步,计算同环比 computeOrgdata(org_data) //第三步,数据升序排序,获取数组大小、最初数据中按日期升序排列的最初一组 //以下面样例为了,数组大小14,最初一组数据{ "date":"2020-02-14", "data":"6346231" ,同比:-0.3,环比:-0.6}对同比、环比、(data暂不做)别离做如下解决 ...

January 20, 2021 · 2 min · jiezi

关于SegmentFault:Pulsar-社区周报|20210111~20210117

Pulsar 周报由 StreamNative 翻译整顿。原文内容来自 StreamNative 官网 Pulsar 周报模块 https://streamnative.io/weekly。本期编辑:Tango@StreamNative。 对于 Apache PulsarApache Pulsar 是 Apache 软件基金会顶级我的项目,是下一代云原生分布式音讯流平台,集音讯、存储、轻量化函数式计算为一体,采纳计算与存储拆散架构设计,反对多租户、长久化存储、多机房跨区域数据复制,具备强一致性、高吞吐、低延时及高可扩展性等流数据存储个性。 GitHub 地址:http://github.com/apache/pulsar/ Pulsar 2020用户考察流动行将截止,没有填写的小伙伴不要错失为 Pulsar 提倡议的良机????赶快扫描下方二维码填写,有机会取得新版 Pulsar 社区周边哦! 导语各位小伙伴们,Pulsar 社区周报更新来啦! 本次 Pulsar 社区周报,为大家出现 Pulsar client、Broker、Functions 等内容,帮忙社区小伙伴们把握 Pulsar 我的项目及社区每周停顿,也不便大家更好地参加到 Pulsar 社区中来! 感激本周以下小伙伴为 Apache Pulsar 添砖加瓦(排名不分先后,看看你有没有上榜): @tuteng、@nodece、@saosir、@eolivelli、@codelipenghui、@aloyszhang、@315157973、@aloyszhang接下来,一起看看 1 月 11 ~ 17 日有哪些值得你关注的停顿吧! 本周亮点Pulsar 反对 topic 级别 replicator 的调度速率策略。https://github.com/apache/pul...贡献者:@315157973 重要个性•因为 PR 较多,仅列举较大 PR 停顿,不包含当周全副动静•上面 PR 均已合入 Pulsar 主分支Functions Worker: 反对通过 bin/pulsar 初始化分布式日志 namespace 元数据。https://github.com/apache/pul...贡献者:@nodece Pulsar-broker-common: 将 Additional Servlet 模块移至 Pulsar broker 通用模块。https://github.com/apache/pul...贡献者:@tuteng ...

January 20, 2021 · 2 min · jiezi

关于SegmentFault:抖音数据采集Frida教程Frida-Java-Hook-详解代码及示例上

抖音数据采集Frida教程,Frida Java Hook 详解:代码及示例(上)短视频、直播数据实时采集接口,请查看文档: TiToData免责申明:本文档仅供学习与参考,请勿用于非法用处!否则所有后果自负。 **前言1.1 FRIDA SCRIPT的"hello world"1.1.1 "hello world"脚本代码示例1.1.2 "hello world"脚本代码示例详解1.2 Java层拦挡一般办法1.2.1 拦挡一般办法脚本示例1.2.2 执行拦挡一般办法脚本示例1.3 Java层拦挡构造函数1.3.1 拦挡构造函数脚本代码示例1.3.2 拦挡构造函数脚本代码示例解详解1.4 Java层拦挡办法重载1.4.1 拦挡办法重载脚本代码示例1.5 Java层拦挡结构对象参数1.5.1 拦挡结构对象参数脚本示例1.6 Java层批改成员变量的值以及函数的返回值1.6.1 批改成员变量的值以及函数的返回值脚本代码示例1.6.2 批改成员变量的值以及函数的返回值之小实战 结语 咱们在这篇来深刻学习如何HOOK Java层函数,利用于与各种不同的Java层函数,结合实际APK案例应用FRIDA框架对其APP进行附加、hook、以及FRIDA脚本的具体编写。 1.1 FRIDA SCRIPT的"hello world"在本章节中,仍然会大量应用注入模式附加到一个正在运行过程程序,亦或是在APP程序启动的时候对其APP过程进行劫持,再在指标过程中执行咱们的js文件代码逻辑。FRIDA脚本就是利用FRIDA动静插桩框架,应用FRIDA导出的API和办法,对内存空间里的对象办法进行监督、批改或者替换的一段代码。FRIDA的API是应用JavaScript实现的,所以咱们能够充分利用JS的匿名函数的劣势、以及大量的hook和回调函数的API。那么大家跟我一起来操作吧,先关上在vscode中创立一个js文件:helloworld.js: 1.1.1 "hello world"脚本代码示例setTimeout(function(){ Java.perform(function(){ console.log("hello world!"); });});1.1.2 "hello world"脚本代码示例详解这基本上就是一个FRIDA版本的Hello World!,咱们把一个匿名函数作为参数传给了setTimeout()函数,然而函数体中的Java.perform()这个函数自身又承受了一个匿名函数作为参数,该匿名函数中最终会调用console.log()函数来打印一个Hello world!字符串。咱们须要调用setTimeout()办法因为该办法将咱们的函数注册到JavaScript运行时中去,而后须要调用Java.perform()办法将函数注册到Frida的Java运行时中去,用来执行函数中的操作,当然这里只是打了一条log。而后咱们在手机上将frida-server运行起来,在电脑上进行操作: roysue@ubuntu:~$ adb shellsailfish:/ $ susailfish:/ $ ./data/local/tmp/frida-server这个时候,咱们须要再开启一个终端运行另外一条命令:frida -U com.roysue.roysueapplication -l helloworld.js这句代码是指通过USB连贯对Android设施中的com.roysue.roysueapplication过程对其附加并且注入一个helloworld.js脚本。注入实现之后会立即执行helloworld.js脚本所写的代码逻辑!咱们能够看到胜利注入了脚本以及附加到本人所编写包名为:com.roysue.roysueapplication的apk应用程序中,并且打印了一条 hell world!。 roysue@ubuntu:~$ frida -U -l helloworld.js com.roysue.roysueapplication ____ / _ | Frida 12.7.24 - A world-class dynamic instrumentation toolkit | (_| | > _ | Commands: /_/ |_| help -> Displays the help system . . . . object? -> Display information about 'object' . . . . exit/quit -> Exit . . . . . . . . More info at https://www.frida.re/docs/home/Attaching...hello world!执行了该命令之后,FRIDA返回一个了CLI终端工具与咱们交互,在下面可见打印进去了一些信息,显示了咱们的FRIDA版本信息还有一个反向R的图形,往下看,须要退出的时候咱们只须要在终端输出exit即可实现退出对APP的附加,其后咱们看到的是Attaching...正在对指标过程附加,当附加胜利了打印了一句hello world!,至此,咱们的helloworld.js通过FRIDA的-l命令胜利的注入到指标过程并且执行结束。学会了注入可不要快乐的太早哟~~咱们持续深刻学习HOOK Java代码中的一般函数。 ...

January 19, 2021 · 4 min · jiezi

关于大数据:Smartbi10步带你认识大数据和云计算

麦粉们大家好啊~~Smartbi间断几期分享的Smartbi行业案例,失去了大家的激情反馈,在此Smartbi向大家说声:谢谢了!你们的反对,是Smartbi后退的最大能源,Smartbi肯定再接再厉,为大家带来更多的案例、更多的干货… 那么,本期Smartbi为大家带来什么干货呢?别急,且听Smartbi用深入浅出、通俗易懂的语言,分10步率领大家意识“大数据”和“云计算”这两个当下最风行的概念,保障大家有所播种,当前碰到相干的概念不会两眼一抹黑…是不是心动了呢?那就让咱们开始吧! 第一步:大数据“大数据”这个概念是近几年开始火起来的,当初堪称是无处不在了。在理解什么是大数据之前,咱们先理解一下什么是传统数据? 传统数据就是IT业务零碎外面的数据,如客户资料、财务数据等。这些数据是结构化的,量也不是特地大,个别只是TB级。比照传统数据,还有一种叫“新数据”,是来源于社区网络、互联网等渠道,包含文本、图片、音频、视频等非结构化的数据。目前全世界75%以上都是非结构化数据,而且还始终出现爆炸性的增长。咱们看看上面的图就更好了解了: 大数据就是:结构化的传统数据+非结构化的新数据。 因此,大数据还具备以下特点,简称“4V”: l Volume(大量):数据体量微小,从TB级别,跃升到PB级别; l Variety(多样):数据类型繁多,有网络日志、视频、图片、地理位置信息等; l Velocity(高速):处理速度快,可从各种类型的数据中疾速取得高价值的信息,这一点也是和传统的数据挖掘技术有着实质的不同; l Value(价值):只有正当利用数据并对其进行正确、精确的剖析,将会带来很高的价值回报。 第二步:大数据组成大数据系统由基础设施、平台和利用组成。比照咱们平时应用的电脑,基础设施就是电脑这台硬件,平台就是装在外面的操作系统,利用就是操作系统下面的各种应用程序。 大数据的利用形形色色,但总体上可分为“业务利用”和“数据分析”两大类。 前者包含ERP、CRM等业务零碎,后者指的是各种剖析利用,包含经营剖析、价值剖析、人流剖析等等。剖析零碎从业务零碎获取源数据,通过剖析后能够反哺业务零碎,对其进行赋能(注智),让其具备智慧。说到这里,大家是不是感觉有点相熟了?跟咱们的BI是不是有某些分割呢?没错了,“大数据平台”和“数据分析系统”加在一起就是BI的升级版啊!既然是升级版,它与传统BI有什么区别呢?请看上面就晓得啦。 l 老本更低廉 去IOE,硬件采纳便宜的X86,软件更多应用开源,节省成本 l 容灾性好 平台部署在X86集群上,机器出问题可随时切换 l 扩展性好 X86集群可依据须要随时进行扩大,进步灵活性 l 解决效率高 当数据达到TB级别,解决效率显著进步 l 解决类型多 能够解决结构化、半结构化、非结构化数据 l 进一步开掘价值 解决的数据量大,类型多,因此可进一步开掘数据的价值。 是不是有很多降级的中央呢?为了反对这些降级,大数据系统须要具备哪些性能呢?这就波及到架构问题了,跟着Smartbi持续往下看吧。 第三步:大数据架构咱们曾经晓得大数据系统由基础设施、平台和利用组成,咱们当初进一步细分,请看下图: 基础设施由通过局域网或互联网连贯的X86集群组成,为大数据平台提供最根本的硬件反对。 大数据平台由基础架构、数据处理和数据服务三局部组成: 基础架构负责对基础设施进行系统管理,为数据处理提供分布式底层服务;数据处理负责数据的采集、存储、计算;数据服务负责将解决后的数据提供给下层利用应用。大数据利用是面向用户的各种利用零碎,包含业务利用和数据分析。大数据系统的总体架构就是这样子,是不是跟咱们平时见到的BI架构很像呢? 通过这个表格比照咱们就更分明了: 上面咱们将围绕这个架构开展阐明。了解了这个架构,Smartbi的目标也就达到啦。 第四步:虚拟化基础设施提供计算、存储、网络三种能力,是大数据平台的根基。然而如何解决以下问题: l 大量的机器如何治理 当集群的状态扭转,也即减少或者缩小一些机器的时候,难道要去批改平台的配置吗? l 如何充分利用系统资源 当集群的能力只应用了一部分,而这个时候须要一部新的机器用来部署其它零碎,难道是从集群上拆下一部机器来提供吗? l 如何解决弹性问题 当高峰期的时候,零碎可能须要20部机器,平时只须要10部。那么咱们是提供多少部适合呢?如果提供20部,平时闲暇下来的10部如何解决? 这些问题有一种解决办法:虚拟化。就是把集群作为一个整体进行治理,能够依据须要从某些机器中调配相干资源,疾速组成一部“新的机器”。例如能够用机器A的CPU1/2性能、1/3的内存,和机器B的1/5硬盘组成。 当集群的状态扭转时,咱们只须要批改虚拟化软件的配置,缩小对平台的影响。当集群有多余的资源时,能够虚构出一些新的机器给其它零碎应用,充分利用了系统资源。 虚拟化的支流商业软件是Vmware,开源的软件有Xen、KVM等。 第五步:云化虚拟化尽管带来资源配置的灵活性,但也有显著的缺点。配置一部“新的机器”须要人工操作,配置十分麻烦,最多只能治理几百台电脑的规模,作为企业外部的利用是能够的。但对于提供公众服务的互联网公司来说,须要上万部电脑的规模,通过虚拟化的形式是行不通的。所以又有了新技术的呈现:云化,也即把基础设施作为一项服务提供。请看下图: 最早是亚马逊基于本身电商业务的倒退,传统的IT架构曾经满足不了需要,所以基于开源的虚拟化软件开发了AWS(Amazon Web Service),能够反对超大规模的集群利用。在解决本人的业务需要后,亚马逊发现能够把这项技术作为一项独自的业务推向市场,这就是当初稳居寰球市场头把交椅的的亚马逊云服务。同样的背景,阿里巴巴也基于Xen推出了市场化的阿里云,现成曾经成为国内云市场的老大。由此咱们也晓得为什么云服务做得最早、最好的都是互联网公司了吧?因为他们有本身的业务在驱动。规模上万部的机器,以资源池(数据中心)的模式散布在不同的地区上(很多建设在广西、贵州、内蒙等欠发达省份,电费、人工比拟便宜,又能够促成当地待业),通过调度核心进行对立治理,这就是私有云平台。 在亚马逊发展商业化云服务的同时,美国另一家叫Rackspace的公司也推出OpenStack在跟亚马逊竞争。无奈竞争不过人家,最初决定和NASA(美国国家航空航天局)单干,把OpenStack开源,一起成立了开源云平台。起初各家传统的IT巨头纷纷退出这个开源的社区,通过二次开发和包装后推出了本人的公有云平台,和自家的硬件或解决方案打包一起销售。 ...

January 19, 2021 · 1 min · jiezi

关于大数据:大数据开发Spark共享变量之累加器和广播变量

Spark 累加器与播送变量一、简介在 Spark 中,提供了两种类型的共享变量:累加器 (accumulator) 与播送变量 (broadcast variable): 累加器:用来对信息进行聚合,次要用于累计计数等场景;播送变量:次要用于在节点间高效散发大对象。二、累加器这里先看一个具体的场景,对于失常的累计求和,如果在集群模式中应用上面的代码进行计算,会发现执行后果并非预期: var counter = 0val data = Array(1, 2, 3, 4, 5)sc.parallelize(data).foreach(x => counter += x) println(counter)counter 最初的后果是 0,导致这个问题的次要起因是闭包。 2.1 了解闭包1. Scala 中闭包的概念 这里先介绍一下 Scala 中对于闭包的概念: var more = 10val addMore = (x: Int) => x + more如上函数 addMore 中有两个变量 x 和 more: x : 是一个绑定变量 (bound variable),因为其是该函数的入参,在函数的上下文中有明确的定义;more : 是一个自在变量 (free variable),因为函数字面量本生并没有给 more 赋予任何含意。依照定义:在创立函数时,如果须要捕捉自在变量,那么蕴含指向被捕捉变量的援用的函数就被称为闭包函数。 2. Spark 中的闭包 也能够参考:https://blog.csdn.net/hu_lichao/article/details/112451982 在理论计算时,Spark 会将对 RDD 操作合成为 Task,Task 运行在 Worker Node 上。在执行之前,Spark 会对工作进行闭包,如果闭包内波及到自在变量,则程序会进行拷贝,并将正本变量放在闭包中,之后闭包被序列化并发送给每个执行者。因而,当在 foreach 函数中援用 counter 时,它将不再是 Driver 节点上的 counter,而是闭包中的正本 counter,默认状况下,正本 counter 更新后的值不会回传到 Driver,所以 counter 的最终值依然为零。 ...

January 17, 2021 · 1 min · jiezi

关于大数据:大数据开发SparkRDD的持久化和缓存

1.RDD缓存机制 cache, persistSpark 速度十分快的一个起因是 RDD 反对缓存。胜利缓存后,如果之后的操作应用到了该数据集,则间接从缓存中获取。尽管缓存也有失落的危险,然而因为 RDD 之间的依赖关系,如果某个分区的缓存数据失落,只须要从新计算该分区即可。 波及到的算子:persist、cache、unpersist;都是 Transformation 缓存是将计算结果写入不同的介质,用户定义可定义存储级别(存储级别定义了缓存存储的介质,目前反对内存、堆外内存、磁盘); 通过缓存,Spark防止了RDD上的反复计算,可能极大地晋升计算速度;RDD长久化或缓存,是Spark最重要的特色之一。能够说,缓存是Spark构建迭代式算法和疾速交互式查问的要害因素; Spark速度十分快的起因之一,就是在内存中长久化(或缓存)一个数据集。当长久化一个RDD后,每一个节点都将把计算的分片后果保留在内存中,并在对此数据集(或者衍生出的数据集)进行的其余动作(Action)中重用。这使得后续的动作变得更加迅速;应用persist()办法对一个RDD标记为长久化。之所以说“标记为长久化”,是因为呈现persist()语句的中央,并不会马上计算生成RDD并把它长久化,而是要等到遇到第一个口头操作触发真正计算当前,才会把计算结果进行长久化;通过persist()或cache()办法能够标记一个要被长久化的RDD,长久化被触发,RDD将会被保留在计算节点的内存中并重用;什么时候缓存数据,须要对空间和速度进行衡量。个别状况下,如果多个动作须要用到某个 RDD,而它的计算代价又很高,那么就应该把这个 RDD 缓存起来; 缓存有可能失落,或者存储于内存的数据因为内存不足而被删除。RDD的缓存的容错机制保障了即便缓存失落也能保证计算的正确执行。通过基于RDD的一系列的转换,失落的数据会被重算。RDD的各个Partition是绝对独立的,因而只须要计算失落的局部即可,并不需要重算全副Partition。 启动堆外内存须要配置两个参数:spark.memory.offHeap.enabled :是否开启堆外内存,默认值为 false,须要设置为 true;spark.memory.offHeap.size : 堆外内存空间的大小,默认值为 0,须要设置为正值。1.1 缓存级别Spark 速度十分快的一个起因是 RDD 反对缓存。胜利缓存后,如果之后的操作应用到了该数据集,则间接从缓存中获取。尽管缓存也有失落的危险,然而因为 RDD 之间的依赖关系,如果某个分区的缓存数据失落,只须要从新计算该分区即可。 Spark 反对多种缓存级别 : Storage Level(存储级别)Meaning(含意)MEMORY_ONLY默认的缓存级别,将 RDD 以反序列化的 Java 对象的模式存储在 JVM 中。如果内存空间不够,则局部分区数据将不再缓存。MEMORY_AND_DISK将 RDD 以反序列化的 Java 对象的模式存储 JVM 中。如果内存空间不够,将未缓存的分区数据存储到磁盘,在须要应用这些分区时从磁盘读取。MEMORY_ONLY_SER将 RDD 以序列化的 Java 对象的模式进行存储(每个分区为一个 byte 数组)。这种形式比反序列化对象节俭存储空间,但在读取时会减少 CPU 的计算累赘。仅反对 Java 和 Scala 。MEMORY_AND_DISK_SER相似于 MEMORY_ONLY_SER,然而溢出的分区数据会存储到磁盘,而不是在用到它们时从新计算。仅反对 Java 和 Scala。DISK_ONLY只在磁盘上缓存 RDDMEMORY_ONLY_2, MEMORY_AND_DISK_2与下面的对应级别性能雷同,然而会为每个分区在集群中的两个节点上建设正本。OFF_HEAP与 MEMORY_ONLY_SER 相似,但将数据存储在堆外内存中。这须要启用堆外内存。启动堆外内存须要配置两个参数:spark.memory.offHeap.enabled :是否开启堆外内存,默认值为 false,须要设置为 true;spark.memory.offHeap.size : 堆外内存空间的大小,默认值为 0,须要设置为正值。1.2 应用缓存缓存数据的办法有两个:persist 和 cache 。cache 外部调用的也是 persist,它是 persist 的特殊化模式,等价于 persist(StorageLevel.MEMORY_ONLY)。示例如下: ...

January 17, 2021 · 1 min · jiezi

关于大数据:算法Leetcode几个双指针问题

1.搜寻插入地位https://leetcode-cn.com/problems/search-insert-position/ class Solution { public int searchInsert(int[] nums, int target) { int left=0,right=nums.length-1; while(left<=right){ int mid=(left+right)/2; if(nums[mid]<target){ left=mid+1; }else if(nums[mid]>target){ right=mid-1; }else{ return mid; } } return left; }}2.搜寻二维矩阵https://leetcode-cn.com/problems/search-a-2d-matrix/ public boolean searchMatrix(int[][] matrix, int target) { if(matrix.length == 0) return false; int row = 0, col = matrix[0].length-1; while(row < matrix.length && col >= 0){ if(matrix[row][col] < target) row++; else if(matrix[row][col] > target) col--; else return true; } return false;}3.删除排序数组反复项https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/ ...

January 17, 2021 · 2 min · jiezi

关于大数据:算法-链表操作题目套路

0. 前言简略的题目,然而没有练习过或者背过,可能反而也写不进去,在面试中往往是在短时间内就写完,你没有工夫画图,没有工夫推演,这些都只能在脑子里疾速实现,有时候拼了很久,感觉还是没有感觉,即便写进去了,在过后的一周到一个月照样会遗记,bug free地写进去还是很费劲,作为对此深有体会的,或者跟我一样的有99%的人,像本文写的链表反转,如果能够在图上画进去,那你就肯定能够写的进去,因为边界很简略,相似有疾速排序荷兰国旗问题这些题目是国内面试级别上才会考的,比起像flag公司,还差那么一点,只管本人在算法方面不是很开窍,包含在校招时候也练过不少题,然而我晓得仍然很少,而且对题目没有记忆感,总感觉本人是个傻子,这么简略的题目,居然写不进去,不过仍然感觉考算法和数据结构的其实才是公司考核程序员最偏心最能考核思维的形式,说了这么多,包含自己在内,始终在身边各种算法大神碾压中,也期待在走向全栈工程师的路线上,单纯地从技术上,本人的算法和数据结构能越来越好把。 1.经典题目,链表反转//递归形式public ListNode reverseList(ListNode head) { if (head == null || head.next == null) return head; ListNode next = head.next; ListNode new_head = reverseList(next); next.next = head; head.next = null; return new_head;}//遍历public ListNode reverseList(ListNode head) { ListNode pre = null, cur = head,next = null; while( cur != null) { next = cur.next; cur.next = pre; pre = cur; cur = next; } return pre;} 2.相邻反转,局部反转//反转相邻节点链表1234 2143,反转5个的也相似public ListNode swapPairs(ListNode head) { if (head == null || head.next == null) return head; ListNode newNode = head.next; head.next = swapPairs(head.next.next); newNode.next = head; return newNode;}//局部反转,12345 m=2 n=4 14325public ListNode reverseBetween(ListNode head, int m, int n) { if (m>= n) return head; ListNode dump = new ListNode(0); dump.next = head; ListNode pre = dump; for (int i = 1; i< m; i++) { pre = pre.next; } head = pre.next; for (int i=m;i<n;i++) { ListNode nex = head.next; head.next = nex.next; next.next = pre.next; pre.next = nex; } return dump.next;} 3.链表求和//两个链表求和//输出:(2 -> 4 -> 3) + (5 -> 6 -> 4)//输入:7 -> 0 -> 8//起因:342 + 465 = 807public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode resultListNode = new ListNode(0); ListNode current = resultListNode; int carry = 0; while(l1 !=null || l2 !=null){ int sum = carry; if(l1!=null){ sum += l1.val; l1 = l1.next; } if(l2!=null){ sum += l2.val; l2 = l2.next; } int val = sum < 10?sum:sum - 10; carry = sum < 10 ?0:1; current.next = new ListNode(val); current = current.next; } if(carry == 1){ current.next = new ListNode(1); } return resultListNode.next; } 吴邪,小三爷,混迹于后盾,大数据,人工智能畛域的小菜鸟。更多请关注 ...

January 17, 2021 · 2 min · jiezi

关于大数据:算法-如何从股票买卖中获得最大收益

作为一名从副业中已赚取几个月工资的韭菜,显然对这类题目很有搞头,然而理论中往往不晓得的是股票的将来价格,所以须要预测,而你的实盘实际上也会反过来影响股票,所以没人能残缺预测股票的走势,那些从回溯中取的最大值的算法,就是上面的几种,有必要把握一下,假若某一天你穿梭回去,你任选一种算法,那么你就能够从1万到1个亿,可能一个月就够了,哦,对了,如果有人能穿梭过来,记得带我一下。。。。。 121. 交易股票的最佳时机// 股票只容许交易一次 可利用贪婪 找到最小的min 价格 再去找最大的max 价格 那么两者之间的差值就是 后果public int maxProfit(int[] prices) { if (prices.length == 0) return 0; int min = prices[0]; int res = 0; for (int i = 1; i < prices.length; i++) { res =Math.max(res,prices[i]-min); min = Math.min(min,prices[i]); } return res;}122. 交易股票的最佳时机 IIpublic int maxProfit(int[] prices) { if(prices.length == 0)return 0; int sell = 0; int buy = Integer.MIN_VALUE; for (int i = 0; i < prices.length; i++) { int t = sell; sell = Math.max(sell,prices[i] + buy); buy = Math.max(buy,t-prices[i]); } return sell;}123. 交易股票的最佳时机 IIIpublic int maxProfit(int[] prices) { if (prices.length == 0)return 0; int k = 2; int[][][] dp = new int[prices.length][k+1][2]; for (int i = 0; i < prices.length; i++) { for (int j = 1; j <= k ; j++) { if (i == 0){ dp[i][j][1] = -prices[i]; }else { dp[i][j][0] = Math.max(dp[i-1][j][0],prices[i]+dp[i-1][j][1]); dp[i][j][1] = Math.max(dp[i-1][j][1],dp[i-1][j-1][0]-prices[i]); } } } return dp[prices.length -1][k][0];}188. 交易股票的最佳时机 IV//这个是 买入k 次 然而 k 大于 数组长度的一半时候 理论和有限买入状况是一样的 能够加快速度 public int maxProfit(int k, int[] prices) { if (prices.length == 0) return 0; if ( k > prices.length/2){ return fastMaxProfit(prices); } int[][][] dp = new int[prices.length][k+1][2]; for (int i = 0; i < prices.length; i++) { for (int j = 1; j <= k; j++) { if (i == 0){ dp[i][j][1] = -prices[i]; }else { dp[i][j][0] = Math.max(dp[i-1][j][0],dp[i-1][j][1] + prices[i]); dp[i][j][1] = Math.max(dp[i-1][j][1],dp[i-1][j-1][0] - prices[i]); } } } return dp[prices.length - 1][k][0]; } int fastMaxProfit(int[] price) { if (price.length == 0) return 0; int sell = 0; int buy = -price[0]; for (int i = 0; i < price.length; i++) { int t = sell; sell = Math.max(sell,price[i] + buy); buy = Math.max(buy,t - price[i]); } return sell; }309. 最佳交易股票机会含冷冻期//有冷冻期 就是 sell 保留多一天public int maxProfit(int[] prices) { if (prices.length == 0) return 0; int sell = 0; int prev = 0; int buy = -prices[0]; for (int i = 0; i < prices.length; i++) { int t = sell; sell = Math.max(sell,prices[i] + buy); buy = Math.max(buy,prev - prices[i]); prev = t; } return sell;}714. 交易股票的最佳时机含手续费// 思路 每次 交易的时候再减去手续费即可public int maxProfit(int[] prices, int fee) { if (prices.length == 0) return 0; int sell = 0; int buy = -prices[0] - fee; for (int i = 0; i < prices.length; i++) { int t = sell; sell = Math.max(sell,prices[i] + buy); buy = Math.max(buy,t - prices[i] - fee); } return sell;}吴邪,小三爷,混迹于后盾,大数据,人工智能畛域的小菜鸟。更多请关注 ...

January 17, 2021 · 2 min · jiezi

关于大数据:抖音数据采集Frida教程rpcProcessModuleMemory使用方法及示例

抖音数据采集Frida教程,rpc、Process、Module、Memory应用办法及示例前言大家好,窝又来写文章了,咱们当初在这篇文章中,咱们来对其官网的一些十分罕用的API进行学习。所谓工欲善其事,必先利其器。想要好好学习FRIDA咱们就必须对FRIDA API深刻的学习以对其有更深的理解和应用,通常大部分外围原理也在官网API中写着,咱们学会来应用一些案例来联合API的应用。留神,运行以下任何代码时都须要提前启动手机中的frida-server文件。  1.1 FRIDA输入打印1.1.1 console输入不论是什么语言都好,第一个要学习总是如何输入和打印,那咱们就来学习在FRIDA打印值。在官网API有两种打印的形式,别离是console、send,咱们先来学习十分的简略的console,这里我创立一个js文件,代码示例如下。 function hello_printf() { Java.perform(function () { console.log(""); console.log("hello-log"); console.warn("hello-warn"); console.error("hello-error"); });}setImmediate(hello_printf,0);当文件创建好之后,咱们须要运行在手机中装置的frida-server文件,在上一章咱们学过了如何装置在android手机装置frida-server,当初来应用它,咱们在ubuntu中开启一个终端,运行以下代码,启动咱们装置好的frida-server文件。 roysue@ubuntu:~$ adb shellsailfish:/ $ susailfish:/ $ ./data/local/tmp/frida-server而后执行以下代码,对指标利用app的过程com.roysue.roysueapplication应用-l命令注入Chap03.js中的代码1-1以及执行脚本之后的效果图1-1!frida -U com.roysue.roysueapplication -l Chap03.js代码1-1 代码示例图1-1 终端执行能够到起点曾经胜利注入了脚本并且打印了hello,然而色彩不同,这是log的级别的起因,在FRIDA的console中有三个级别别离是log、warn、error。 级别含意log失常warn正告error谬误1.1.2 console之hexdumperror级别最为重大其次warn,然而个别在应用中咱们只会应用log来输入想看的值;而后咱们持续学习console的好兄弟,hexdump,其含意:打印内存中的地址,target参数能够是ArrayBuffer或者NativePointer,而options参数则是自定义输入格局能够填这几个参数offset、lengt、header、ansi。hexdump代码示例以及执行成果如下。 var libc = Module.findBaseAddress('libc.so');console.log(hexdump(libc, { offset: 0, length: 64, header: true, ansi: true})); 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 .ELF............00000010 03 00 28 00 01 00 00 00 00 00 00 00 34 00 00 00 ..(.........4...00000020 34 a8 04 00 00 00 00 05 34 00 20 00 08 00 28 00 4.......4. ...(.00000030 1e 00 1d 00 06 00 00 00 34 00 00 00 34 00 00 00 ........4...4...1.1.3 sendsend是在python层定义的on_message回调函数,jscode内所有的信息都被监控script.on('message', on_message),当输入信息的时候on_message函数会拿到其数据再通过format转换, 其最重要的性能也是最外围的是可能间接将数据以json格局输入,当然数据是二进制的时候也仍然是能够应用send,非常不便,咱们来看代码1-2示例以及执行成果。 ...

January 17, 2021 · 5 min · jiezi

关于大数据:好书推荐大数据日知录深入理解大数据的必备书籍附电子版下载

明天给大家举荐一本大数据畛域中必读的一本书,名字叫《大数据日知录-架构与算法》 这本书正如它封面中介绍的一样,全面梳理大数据相干技术,从数据、算法、策略、利用和零碎架构等多个维度进行分析,既无所不包,又深入浅出。 这本书具体介绍了咱们所应用的大数据组件的底层原理及实现算法。 像Flink中十分重要的分布式一致性协定,应用的是两阶段提交协定,这本书中就具体介绍了两阶段提交协定的原理,如下为书中截图: 还有像比特币中用来进行交易验证的Merkle树,书中也有具体介绍,Merkle树在亚马逊的Dynamo数据库中也有广泛应用 在Hive中罕用 orc 格局 + snappy 压缩是比拟罕用的存储加压缩格局,书中也有具体介绍压缩算法Snappy 书中还有很多大数据组件底层算法及原理,就不一一举例了 给大家截取局部目录看下 这本书十分值得读一读,有趣味的同学倡议买一本实体书 因而处不易放链接,如果你想看电子版,能够搜寻公众号:五分钟学大数据,或间接扫描下方二维码,对话框发送 大数据日知录 即可获取此书电子版

January 17, 2021 · 1 min · jiezi

关于大数据:抖音数据采集教程动静态结合逆向WhatsApp

抖音数据采集教程,动动态联合逆向WhatsApp0x01.hook办法的所有重载在一篇文章带你领悟Frida的精华一文中,咱们曾经学会了对放的重载进行解决的办法,咱们先回顾一下代码: my_class.fun.overload("int" , "int").implementation = function(x,y){my_class.fun.overload("java.lang.String").implementation = function(x){也就是说咱们须要结构一个重载的数组,并把每一个重载都打印进去。咱们间接上代码: //指标类var hook = Java.use(targetClass);//重载次数var overloadCount = hook[targetMethod].overloads.length;//打印日志:追踪的办法有多少个重载console.log("Tracing " + targetClassMethod + " [" + overloadCount + " overload(s)]");//每个重载都进入一次for (var i = 0; i < overloadCount; i++) {//hook每一个重载 hook[targetMethod].overloads[i].implementation = function() { console.warn("\n*** entered " + targetClassMethod); //能够打印每个重载的调用栈,对调试有微小的帮忙,当然,信息也很多,尽量不要打印,除非剖析陷入僵局 Java.perform(function() { var bt = Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()); console.log("\nBacktrace:\n" + bt); }); // 打印参数 if (arguments.length) console.log(); for (var j = 0; j < arguments.length; j++) { console.log("arg[" + j + "]: " + arguments[j]); } //打印返回值 var retval = this[targetMethod].apply(this, arguments); // rare crash (Frida bug?) console.log("\nretval: " + retval); console.warn("\n*** exiting " + targetClassMethod); return retval; }}这样咱们对于办法的所有重载就解决好了,接下来是枚举所有办法。 ...

January 16, 2021 · 2 min · jiezi

关于大数据:抖音数据采集教程一篇文章带你领悟Frida的精髓

抖音数据采集教程,一篇文章带你领悟Frida的精华frida是啥?首先,frida是啥,github目录Awesome Frida这样介绍frida的: Frida is Greasemonkey for native apps, or, put in more technical terms, it’s a dynamic code instrumentation toolkit. It lets you inject snippets of JavaScript into native apps that run on Windows, Mac, Linux, iOS and Android. Frida is an open source software.frida是平台原生app的Greasemonkey,说的业余一点,就是一种动静插桩工具,能够插入一些代码到原生app的内存空间去,(动静地监督和批改其行为),这些原生平台能够是Win、Mac、Linux、Android或者iOS。而且frida还是开源的。Greasemonkey可能大家不明确,它其实就是firefox的一套插件体系,应用它编写的脚本能够间接扭转firefox对网页的编排形式,实现想要的任何性能。而且这套插件还是外挂的,十分灵活机动。frida也是一样的情理。 frida为什么这么火?动动态批改内存实现舞弊始终是刚需,比方金山游侠,实质上frida做的跟它是一件事件。原则上是能够用frida把金山游侠,包含CheatEngine等“外挂”做进去的。当然,当初曾经不是间接批改内存就能够居安思危的年代了。大家也不要这样做,做外挂可是违法行为。在逆向的工作上也是一样的情理,应用frida能够“看到”平时看不到的货色。出于编译型语言的个性,机器码在CPU和内存上执行的过程中,其外部数据的交互和跳转,对用户来讲是看不见的。当然如果手上有源码,甚至哪怕有带调试符号的可执行文件包,也能够应用gbd、lldb等调试器连上去看。那如果没有呢?如果是纯黑盒呢?又要对app进行逆向和动静调试、甚至自动化剖析以及规模化收集信息的话,咱们须要的是细粒度的流程管制和代码级的可定制体系,以及一直对调试进行动静纠正和可编程调试的框架,这就是frida。frida应用的是python、JavaScript等“胶水语言”也是它火爆的一个起因,能够迅速将逆向过程自动化,以及整合到现有的架构和体系中去,为你们公布“威逼情报”、“数据平台”甚至“AI风控”等产品打好根底。官宣屁屁踢甚至将其麻利开发和迅速适配到现有架构的能力作为其外围卖点。 frida实操环境主机: Host:Macbook Air CPU: i5 Memory:8GSystem:Kali Linux 2018.4 (Native,非虚拟机)客户端: client:Nexus 6 shamu CPU:Snapdragon 805 Mem:3GSystem:lineage-15.1-20181123-NIGHTLY-shamu,android 8.1用kali linux的起因是工具很全面,权限很繁多,只有一个root,作为原型开发很好用,否则python和node的各种权限、环境和依赖切实是烦。用lineage因为它有便当的网络ADB调试,能够省掉一个usb数据线连贯的过程。(尽管实在的起因是没钱买新设施,Nexus 6官网只反对到7.1.1,想上8.1只有lineage一个抉择。)记得须要刷进去一个lineage的 su包,获取root权限,frida是须要在root权限下运行的。首先到官网下载一个platform-tools的linux版本——SDK Platform-Tools for Linux,下载解压之后能够间接运行外面的二进制文件,当然也能够把门路加到环境里去。这样adb和fastboot命令就有了。而后再将frida-server下载下来,拷贝到安卓机器里去,应用root用户跑起来,放弃adb的连贯不要断开。 $ ./adb root # might be required$ ./adb push frida-server /data/local/tmp/$ ./adb shell "chmod 755 /data/local/tmp/frida-server"$ ./adb shell "/data/local/tmp/frida-server &"最初在kali linux里装置好frida即可,在kali里装置frida真是太简略了,一句话命令即可,保障不出错。(可能会须要先装置pip,也是一句话命令:curl [[https://bootstrap.pypa.io/get-pip.py](https://bootstrap.pypa.io/get-pip.py)]([https://bootstrap.pypa.io/get-pip.py](https://bootstrap.pypa.io/get-pip.py)) -o get-pip.py) ...

January 14, 2021 · 6 min · jiezi

关于大数据:大厂面试官竟然这么爱问Kafka一连八个Kafka问题把我问蒙了

本文首发于公众号:五分钟学大数据 在面试的时候,发现很多面试官特地爱问Kafka相干的问题,这也不难理解,谁让Kafka是大数据畛域中音讯队列的惟一王者,单机十万级别的吞吐量,毫秒级别的提早,这种天生的分布式音讯队列,谁能不爱? 在最近的一场面试中,有个面试官看到简历中的我的项目上写Kafka了,就间接开问Kafka,其余问题根本没问。上面来看下面试官的Kafka八连问: (以下答案是面试完之后整顿而成,理论面试时只答复了大概三分之一) 1. 为什么要应用 kafka?缓冲和削峰:上游数据时有突发流量,上游可能扛不住,或者上游没有足够多的机器来保障冗余,kafka在两头能够起到一个缓冲的作用,把音讯暂存在kafka中,上游服务就能够依照本人的节奏进行缓缓解决。解耦和扩展性:我的项目开始的时候,并不能确定具体需要。音讯队列能够作为一个接口层,解耦重要的业务流程。只须要恪守约定,针对数据编程即可获取扩大能力。冗余:能够采纳一对多的形式,一个生产者公布音讯,能够被多个订阅topic的服务生产到,供多个毫无关联的业务应用。健壮性:音讯队列能够沉积申请,所以生产端业务即便短时间死掉,也不会影响次要业务的失常进行。异步通信:很多时候,用户不想也不须要立刻解决音讯。音讯队列提供了异步解决机制,容许用户把一个音讯放入队列,但并不立刻解决它。想向队列中放入多少音讯就放多少,而后在须要的时候再去解决它们。2. Kafka生产过的音讯如何再生产?kafka生产音讯的offset是定义在zookeeper中的, 如果想反复生产kafka的音讯,能够在redis中本人记录offset的checkpoint点(n个),当想反复生产音讯时,通过读取redis中的checkpoint点进行zookeeper的offset重设,这样就能够达到反复生产音讯的目标了 3. kafka的数据是放在磁盘上还是内存上,为什么速度会快?kafka应用的是磁盘存储。 速度快是因为: 程序写入:因为硬盘是机械构造,每次读写都会寻址->写入,其中寻址是一个“机械动作”,它是耗时的。所以硬盘 “厌恶”随机I/O, 喜爱程序I/O。为了进步读写硬盘的速度,Kafka就是应用程序I/O。Memory Mapped Files(内存映射文件):64位操作系统中个别能够示意20G的数据文件,它的工作原理是间接利用操作系统的Page来实现文件到物理内存的间接映射。实现映射之后你对物理内存的操作会被同步到硬盘上。Kafka高效文件存储设计: Kafka把topic中一个parition大文件分成多个小文件段,通过多个小文件段,就容易定期革除或删除曾经生产完文件,缩小磁盘占用。通过索引信息能够疾速定位message和确定response的 大 小。通过index元数据全副映射到memory(内存映射文件),能够防止segment file的IO磁盘操作。通过索引文件稠密存储,能够大幅升高index文件元数据占用空间大小。 注:Kafka解决查问效率的伎俩之一是将数据文件分段,比方有100条Message,它们的offset是从0到99。假如将数据文件分成5段,第一段为0-19,第二段为20-39,以此类推,每段放在一个独自的数据文件外面,数据文件以该段中 小的offset命名。这样在查找指定offset的Message的时候,用二分查找就能够定位到该Message在哪个段中。 为数据文件建 索引数据文件分段 使得能够在一个较小的数据文件中查找对应offset的Message 了,然而这仍然须要程序扫描能力找到对应offset的Message。为了进一步提高查找的效率,Kafka为每个分段后的数据文件建设了索引文件,文件名与数据文件的名字是一样的,只是文件扩大名为.index。 4. Kafka数据怎么保障不失落?分三个点说,一个是生产者端,一个消费者端,一个broker端。 生产者数据的不失落kafka的ack机制:在kafka发送数据的时候,每次发送音讯都会有一个确认反馈机制,确保音讯失常的可能被收到,其中状态有0,1,-1。 如果是同步模式: ack设置为0,危险很大,个别不倡议设置为0。即便设置为1,也会随着leader宕机失落数据。所以如果要严格保障生产端数据不失落,可设置为-1。 如果是异步模式: 也会思考ack的状态,除此之外,异步模式下的有个buffer,通过buffer来进行控制数据的发送,有两个值来进行管制,工夫阈值与音讯的数量阈值,如果buffer满了数据还没有发送进来,有个选项是配置是否立刻清空buffer。能够设置为-1,永恒阻塞,也就数据不再生产。异步模式下,即便设置为-1。也可能因为程序员的不迷信操作,操作数据失落,比方kill -9,但这是特地的例外情况。 注: ack=0:producer不期待broker同步实现的确认,持续发送下一条(批)信息。 ack=1(默认):producer要期待leader胜利收到数据并失去确认,才发送下一条message。 ack=-1:producer失去follwer确认,才发送下一条数据。消费者数据的不失落通过offset commit 来保证数据的不失落,kafka本人记录了每次生产的offset数值,下次持续生产的时候,会接着上次的offset进行生产。 而offset的信息在kafka0.8版本之前保留在zookeeper中,在0.8版本之后保留到topic中,即便消费者在运行过程中挂掉了,再次启动的时候会找到offset的值,找到之前生产音讯的地位,接着生产,因为 offset 的信息写入的时候并不是每条音讯生产实现后都写入的,所以这种状况有可能会造成反复生产,然而不会失落音讯。 惟一例外的状况是,咱们在程序中给本来做不同性能的两个consumer组设置KafkaSpoutConfig.bulider.setGroupid的时候设置成了一样的groupid,这种状况会导致这两个组共享同一份数据,就会产生组A生产partition1,partition2中的音讯,组B生产partition3的音讯,这样每个组生产的音讯都会失落,都是不残缺的。 为了保障每个组都独享一份音讯数据,groupid肯定不要反复才行。 kafka集群中的broker的数据不失落每个broker中的partition咱们个别都会设置有replication(正本)的个数,生产者写入的时候首先依据散发策略(有partition按partition,有key按key,都没有轮询)写入到leader中,follower(正本)再跟leader同步数据,这样有了备份,也能够保障音讯数据的不失落。 5. 采集数据为什么抉择kafka?采集层 次要能够应用Flume, Kafka等技术。 Flume:Flume 是管道流形式,提供了很多的默认实现,让用户通过参数部署,及扩大API. Kafka:Kafka是一个可长久化的分布式的音讯队列。 Kafka 是一个十分通用的零碎。你能够有许多生产者和很多的消费者共享多个主题Topics。 相比之下,Flume是一个专用工具被设计为旨在往HDFS,HBase发送数据。它对HDFS有非凡的优化,并且集成了Hadoop的平安个性。 所以,Cloudera 倡议如果数据被多个零碎生产的话,应用kafka;如果数据被设计给Hadoop应用,应用Flume。 6. kafka 重启是否会导致数据失落?kafka是将数据写到磁盘的,个别数据不会失落。然而在重启kafka过程中,如果有消费者生产音讯,那么kafka如果来不及提交offset,可能会造成数据的不精确(失落或者反复生产)。7. kafka 宕机了如何解决?先思考业务是否受到影响kafka 宕机了,首先咱们思考的问题应该是所提供的服务是否因为宕机的机器而受到影响,如果服务提供没问题,如果实现做好了集群的容灾机制,那么这块就不必放心了。 节点排错与复原想要复原集群的节点,次要的步骤就是通过日志剖析来查看节点宕机的起因,从而解决,从新复原节点。 8. 为什么Kafka不反对读写拆散?在 Kafka 中,生产者写入音讯、消费者读取音讯的操作都是与 leader 正本进行交互的,从 而实现的是一种主写主读的生产生产模型。Kafka 并不反对主写从读,因为主写从读有 2 个很显著的毛病: ...

January 14, 2021 · 1 min · jiezi

关于大数据:HBase-底层原理详解深度好文建议收藏

HBase简介HBase 是一个分布式的、面向列的开源数据库。建设在 HDFS 之上。Hbase的名字的起源是 Hadoop database,即 Hadoop 数据库。HBase 的计算和存储能力取决于 Hadoop 集群。 它介于 NoSql 和 RDBMS 之间,仅能通过主键(row key)和主键的 range 来检索数据,仅反对单行事务(可通过 Hive 反对来实现多表 join 等简单操作)。 HBase中表的特点: 大:一个表能够有上十亿行,上百万列面向列:面向列(族)的存储和权限管制,列(族)独立检索。稠密:对于为空(null)的列,并不占用存储空间,因而,表能够设计的十分稠密。HBase底层原理零碎架构 依据这幅图,解释下HBase中各个组件 Client蕴含拜访hbase的接口,Client保护着一些cache来放慢对hbase的拜访,比方regione的地位信息.ZookeeperHBase能够应用内置的Zookeeper,也能够应用外置的,在理论生产环境,为了放弃统一性,个别应用外置Zookeeper。 Zookeeper在HBase中的作用: 保障任何时候,集群中只有一个master存贮所有Region的寻址入口实时监控Region Server的状态,将Region server的上线和下线信息实时告诉给MasterHMaster为Region server调配region负责region server的负载平衡发现生效的region server并重新分配其上的regionHDFS上的垃圾文件回收解决schema更新申请HRegion ServerHRegion server保护HMaster调配给它的region,解决对这些region的IO申请HRegion server负责切分在运行过程中变得过大的region从图中能够看到,Client拜访HBase上数据的过程并不需要HMaster参加(寻址拜访Zookeeper和HRegion server,数据读写访问HRegione server) HMaster仅仅维护者table和HRegion的元数据信息,负载很低。 HBase的表数据模型 行键 Row Key与nosql数据库一样,row key是用来检索记录的主键。拜访hbase table中的行,只有三种形式: 通过单个row key拜访通过row key的range全表扫描Row Key 行键能够是任意字符串(最大长度是 64KB,理论利用中长度个别为 10-100bytes),在hbase外部,row key保留为字节数组。 Hbase会对表中的数据依照rowkey排序(字典程序) 存储时,数据依照Row key的字典序(byte order)排序存储。设计key时,要充沛排序存储这个个性,将常常一起读取的行存储放到一起。(地位相关性)。 留神:字典序对int排序的后果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21 ... 。要放弃整形的天然序,行键必须用0作左填充。 行的一次读写是原子操作 (不管一次读写多少列)。这个设计决策可能使用户很容易的了解程序在对同一个行进行并发更新操作时的行为。 列族 Column FamilyHBase表中的每个列,都归属于某个列族。列族是表的schema的一部分(而列不是),必须在应用表之前定义。 列名都以列族作为前缀。例如 courses:history , courses:math 都属于 courses 这个列族。 ...

January 13, 2021 · 2 min · jiezi

关于大数据:大数据开发解决Windows下开发环境常遇的几个问题

1.背景大数据开发的测试环境,很多人不以为然,其实反复的打包,上传,测试尽管每次工夫大略也就几分钟,然而积攒起了往往会破费很多的工夫,然而一个残缺的测试环境在生产环境下往往难造成闭环,抛开堡垒机权限不说,hadoop,hive,spark等服务端的权限也会难倒一群英雄好汉,次要是太繁琐了,测试环境的搭建,我这里采纳Docker容器,适宜多端迁徙,而且容器的镜像大小也比虚拟机小很多,难度上说,也只须要把握几个根底的命令即可,除非想引入K8s等技术,但测试环境齐全没必要,Docker环境搭建大数据平台的系列从这里大数据开发-Docker-应用Docker10分钟疾速搭建大数据环境,Hadoop、Hive、Spark、Hue、Kafka、ElasticSearch.....[https://blog.csdn.net/hu_lichao/article/details/112125800](https://blog.csdn.net/hu_lichao/article/details/112125800),环境搭建好了,可能还是会有一些非凡的问题 2.如何解决缺失winutils.exe在Win操作系统,idea下开发hadoop程序或者Spark程序,那么你必定会遇到上面的问题 之所以呈现下面的问题,Spark程序和Hadoop在idea写编写的程序是依赖hadoop的环境的,所以要提前配置好,并且设定HADOOP_HOME ,不肯定须要$HADOOP_HOME/bin 到PATH ,后者是给快捷方式用的 留神:配置完环境变量后要将idea,退出后重进,不能Restart 3.如何解决java.lang.NoSuchMethodError: org.apache.hadoop.security.authentication.util.KerberosUtil.hasKerberosKeyTab(Ljavax/security/auth/Subject;)Z谬误如下图 呈现这个问题的起因是版本抵触,即便看起来不那么显著,可能是spark依赖的包中的hadoop和hadoop依赖的版本不统一https://stackoverflow.com/questions/45470320/what-is-the-kerberos-method,具体不统一的问题,可能各有不同,解决难易水平因人而异????????????,我的解决形式就是exclude掉spark的低版本hadoop 4.如何解决Exception in thread "main" org.apache.spark.SparkException: Task not serializable 这个问题,我是这么遇到的,如下程序: // results.foreach(System.out::println); //输入没有序列化 results.foreach(x -> System.out.println(x));首先foreach是action算子,须要将task上的数据拉到driver上来遍历显示,就须要序列化,如果习惯了Java的lambda写法,可能会写第一种,第一种写法的问题是没有序列化,序列化是在闭包里实现的,而应用静态方法调用的形式,没有闭包化,所以会报序列化的问题,写成第二种就能够了,System.out是一个final static对象。 public final static PrintStream out = null;吴邪,小三爷,混迹于后盾,大数据,人工智能畛域的小菜鸟。更多请关注

January 11, 2021 · 1 min · jiezi

关于大数据:数仓建设中最常用模型Kimball维度建模详解

数仓建模首推书籍《数据仓库工具箱:维度建模权威指南》,本篇文章参考此书而作。文章首发公众号:五分钟学大数据,公众号中发送“维度建模”即可获取此书籍第三版电子书 先来介绍下此书,此书是基于作者 60 多年的理论业务环境而总结的教训及教训,为读者提供正式的维度设计和开发技术。面向数仓和BI设计人员,书中波及到的内容十分宽泛,围绕一系列的商业场景或案例钻研进行组织。强烈建议买一本实体书钻研,重复通读全书至多三遍以上,你的技术将会有质的飞跃。 因为本文是纯理论常识,稀稀拉拉的字,很多人可能看不下去,所以我尽量用起码的字来表白,尽量将艰涩难懂的词语转化为艰深易于了解的词,将文中的重点加粗展现,内容尽量精简,以保障在不表白谬误的状况下更利于读者学习!心愿和大家能一起学习,一起提高,致力达到咱们本人的金字塔顶部 维度建模是什么维度模型是数据仓库畛域巨匠Ralph Kimball 所提倡,以剖析决策的需要登程构建模型,构建的数据模型为剖析需要服务,因而它重点解决用户如何更疾速实现剖析需要,同时还有较好的大规模简单查问的响应性能。 维度建模是 数据仓库/商业智能 我的项目胜利的要害,为什么这么说,因为不论咱们的数据量从GB到TG还是到PB,尽管数据量越来越大,然而数据展示要获得成功,就必须建设在简略性的根底之上,而维度建模就是时刻思考如何可能提供简略性,以业务为驱动,以用户了解性和查问性能为指标。 维度建模:维度建模是专门利用于剖析型数据库、数据仓库、数据市集建模的办法。数据市集能够了解为一种“小型的数据仓库”维度建模领导咱们在数据仓库中如何建表 维度建模分为两种表:事实表和维度表 事实表:必然存在的一些数据,像采集的日志文件,订单表,都能够作为事实表特色:是一堆主键的汇合,每个主键对应维度表中的一条记录,客观存在的,依据主题确定出须要应用的数据 维度表:维度就是所剖析的数据的一个量,维度表就是以适合的角度来创立的表,剖析问题的一个角度:工夫、地区、终端、用户等角度维度建模的三种模式 星形模式:以事实表为核心,所有的维度表间接连在事实表上,最简略最罕用的一种 雪花模式:雪花模式的维度表能够领有其余的维度表,这种表不易保护,个别不举荐应用 星座模型:基于多张事实表,而且共享维度信息,即事实表之间能够共享某些维度表 维度建模怎么建咱们晓得事实表,维度表,星形模型,星座模型这些概念了,然而理论业务中,给了咱们一堆数据,咱们怎么拿这些数据进行数仓建设呢,数仓工具箱作者依据本身60多年的理论业务教训,给咱们总结了如下四步,请务必记住! 数仓工具箱中的维度建模四步走: 请牢记以上四步,不论什么业务,就依照这个步骤来,程序不要搞乱,因为这四步是环环相扣,步步相连。上面具体拆解下每个步骤怎么做 1、抉择业务过程 维度建模是紧贴业务的,所以必须以业务为根基进行建模,那么抉择业务过程,顾名思义就是在整个业务流程中选取咱们须要建模的业务,依据经营提供的需要及日后的易扩展性等进行抉择业务。比方商城,整个商城流程分为商家端,用户端,平台端,经营需要是总订单量,订单人数,及用户的购买状况等,咱们抉择业务过程就抉择用户端的数据,商家及平台端暂不思考。业务抉择十分重要,因为前面所有的步骤都是基于此业务数据开展的。 2、申明粒度 先举个例子:对于用户来说,一个用户有一个身份证号,一个户籍地址,多个手机号,多张银行卡,那么与用户粒度雷同的粒度属性有身份证粒度,户籍地址粒度,比用户粒度更细的粒度有手机号粒度,银行卡粒度,存在一对一的关系就是雷同粒度。为什么要提雷同粒度呢,因为维度建模中要求咱们,在同一事实表中,必须具备雷同的粒度,同一事实表中不要混用多种不同的粒度,不同的粒度数据建设不同的事实表。并且从给定的业务过程获取数据时,强烈建议从关注原子粒度开始设计,也就是从最细粒度开始,因为原子粒度可能接受无奈预期的用户查问。然而上卷汇总粒度对查问性能的晋升很重要的,所以对于有明确需要的数据,咱们建设针对需要的上卷汇总粒度,对需要不明朗的数据咱们建设原子粒度。 3、确认维度 维度表是作为业务剖析的入口和描述性标识,所以也被称为数据仓库的“灵魂”。在一堆的数据中怎么确认哪些是维度属性呢,如果该列是对具体值的形容,是一个文本或常量,某一束缚和行标识的参与者,此时该属性往往是维度属性,数仓工具箱中通知咱们牢牢把握事实表的粒度,就能将所有可能存在的维度辨别开,并且要确保维度表中不能呈现反复数据,应使维度主键惟一 4、确认事实 事实表是用来度量的,基本上都以数量值示意,事实表中的每行对应一个度量,每行中的数据是一个特定级别的细节数据,称为粒度。维度建模的外围准则之一是同一事实表中的所有度量必须具备雷同的粒度。这样能确保不会呈现反复计算度量的问题。有时候往往不能确定该列数据是事实属性还是维度属性。记住最实用的事实就是数值类型和可加类事实。所以能够通过剖析该列是否是一种蕴含多个值并作为计算的参与者的度量,这种状况下该列往往是事实。 事实表品种事实表分为以下6类: 事务事实表周期快照事实表累积快照事实表无事实的事实表汇集事实表合并事实表简略解释下每种表的概念: 事务事实表表中的一行对应空间或工夫上某点的度量事件。就是一行数据中必须有度量字段,什么是度量,就是指标,比如说销售金额,销售数量等这些可加的或者半可加就是度量值。另一点就是事务事实表都蕴含一个与维度表关联的外键。并且度量值必须和事务粒度保持一致。 周期快照事实表顾名思义,周期事实表就是每行都带有工夫值字段,代表周期,通常工夫值都是规范周期,如某一天,某周,某月等。粒度是周期,而不是个体的事务,也就是说一个周期快照事实表中数据能够是多个事实,然而它们都属于某个周期内。 累计快照事实表周期快照事实表是单个周期内数据,而累计快照事实表是由多个周期数据组成,每行汇总了过程开始到完结之间的度量。每行数据相当于管道或工作流,有事件的终点,过程,起点,并且每个关键步骤都蕴含日期字段。如订单数据,累计快照事实表的一行就是一个订单,当订单产生时插入一行,当订单发生变化时,这行就被批改。 无事实的事实表咱们以上探讨的事实表度量都是数字化的,当然理论利用中绝大多数都是数字化的度量,然而也可能会有大量的没有数字化的值然而还很有价值的字段,无事实的事实表就是为这种数据筹备的,利用这种事实表能够剖析产生了什么。 汇集事实表汇集,就是对原子粒度的数据进行简略的聚合操作,目标就是为了进步查问性能。如咱们需要是查问全国所有门店的总销售额,咱们原子粒度的事实表中每行是每个分店每个商品的销售额,汇集事实表就能够先聚合每个分店的总销售额,这样汇总所有门店的销售额时计算的数据量就会小很多。 合并事实表这种事实表遵循一个准则,就是雷同粒度,数据能够来自多个过程,然而只有它们属于雷同粒度,就能够合并为一个事实表,这类事实表特地适宜常常须要独特剖析的多过程度量。 维度表技术维度表构造维度表谨记一条准则,蕴含繁多主键列,但有时因业务简单,也可能呈现联结主键,请尽量避免,如果无奈防止,也要确保必须是繁多的,这很重要,如果维表主键不是繁多,和事实表关联时会呈现数据发散,导致最初后果可能呈现谬误。 维度表通常比拟宽,蕴含大量的低粒度的文本属性。 跨表钻取跨表钻取意思是当每个查问的行头都蕴含雷同的一致性属性时,使不同的查问可能针对两个或更多的事实表进行查问 钻取能够扭转维的档次,变换分析的粒度。它包含上钻/下钻: 上钻(roll-up):上卷是沿着维的档次向上汇集汇总数据。例如,对产品销售数据,沿着工夫维上卷,能够求出所有产品在所有地区每月(或季度或年或全副)的销售额。 下钻(drill-down):下钻是上钻的逆操作,它是沿着维的档次向下,查看更具体的数据。 进化维度进化维度就是将维度退回到事实表中。因为有时维度除了主键没有其余内容,尽管也是非法维度键,然而个别都会退回到事实表中,缩小关联次数,进步查问性能 多层次维度少数维度蕴含不止一个天然档次,如日期维度能够从天的档次到周到月到年的档次。所以在有些状况下,在同一维度中存在不同的档次。 维度表空值属性当给定维度行没有被全副填充时,或者当存在属性没有被利用到所有维度行时,将产生空值维度属性。上述两种状况,举荐采纳描述性字符串代替空值,如应用 unknown 或 not applicable 替换空值。 日历日期维度在日期维度表中,主键的设置不要应用程序生成的id来示意,能够应用更有意义的数据表示,比方将年月日合并起来示意,即YYYYMMDD,或者更加具体的精度。 最初获取最新文章,可关注公众号:五分钟学大数据 在公众号后盾回复 维度建模 即可获取数仓书籍电子版

January 11, 2021 · 1 min · jiezi

关于大数据:抖音数据采集教程Android群控黑盒调用Sekiro使用手册

抖音数据采集教程,Android群控黑盒调用,Sekiro使用手册0x0 前言之前尝试用过virjar大佬的hermesagent, 起初大佬又迭代出新的基于长链接的Sekiro, 始终想看都被耽误了, 明天正好抽空尝试一下, 顺便写篇笔记, 有谬误的中央大佬们请斧正哈 0x1 Sekiro介绍SEKIRO 是一个android下的API服务裸露框架,能够用在app逆向、app数据抓取、android群控等场景 和其余群控框架相比的特点如下: 对网络环境要求低,sekiro应用长链接治理服务,使得Android手机能够散布于全国各地,甚至寰球各地。手机掺合在普通用户群体,不便实现反抓冲破,更加适宜获取下沉数据。不依赖hook框架,就已经的Hermes零碎来说,和xposed框架深度集成,在当今hook框架遍地开花的环境下,框架无奈不便迁徙。所以在Sekiro的设计中,只提供了RPC性能了。纯异步调用,在Hermes和其余已经呈现过的框架中,根本都是同步调用。尽管说签名计算能够达到上百QPS,然而如果用来做业务办法调用的话,因为调用过程穿透到指标app的服务器,会有大量申请占用线程。零碎吞吐存在上线(hermes零碎达到2000QPS的时候,根本无奈横向扩容和性能优化了)。然而Sekiro全程应用NIO,实践上其吞吐能够把资源占满。client实时状态,在Hermes零碎我应用http进行调用转发,通过手机上报心跳感知手机存活状态。心跳工夫至多20s,这导致服务器调度层面对手机在线状态感知不及时,申请过大的时候大量转发调用因为client掉线timeout。在Sekiro长链接治理下,手机掉线能够实时感知。不再呈现因为框架层面机制导致timeoutSekiro架构 server: 裸露一个TCP端口和两个HTTP端口 治理通过TCP连贯的client和user发来的http 申请client: 通过TCP和server连贯,响应server发来的申请 工作流程是这样的: 1. client通过TCP和server建设长连贯 2. user发送http申请给server 3. server依据用户发来的http申请的参数,通过TCP将申请转发给client 4. client收到申请并响应server 5. server将从client收到的申请返回给user具体的能够去看我的项目的readme, 说的十分具体: 我的项目传送门 0x2 服务端部署克隆我的项目: git clone [https://github.com/virjar/sekiro.git](https://github.com/virjar/sekiro.git)批改settings.gradle的内容为: include ':sekiro-server', ':sekiro-lib' ,删掉appdemo避免编译它启动服务器前注意事项server端在`sekiro-server/src/main/resources/appliation.properties`中能够配置三个服务端端口, 次要服务端安全策略的出入口须要凋谢这个三个端口#tomcat 占用端口server.port=5602#长链接服务占用端口natServerPort=5600# 异步http占用端口natHttpServerPort=5601# websocket占用端口webSocketServerPort=5603 如果自定义端口,client须要调用SekiroClient.start(String serverHost, int serverPort, final String clientID, String group)中去连贯server执行命令:./gradlew sekiro-server:bootJar 即可在 sekiro-server/build/libs/sekiro-server-0.0.1-SNAPSHOT.jar找到all-in-one的jar包 通过nohup java -jar sekiro-server/build/libs/sekiro-server-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &启动server0x3 客户端先筹备一个测试的Demo, 很简略就是个加法, 留神Demo必须有加android.permission.INTERNET权限public class MainActivity extends AppCompatActivity { public static int Add(int n1, int n2) { return n1 + n2; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toast.makeText(MainActivity.this, "3 + 2 = " + Add(3, 2), Toast.LENGTH_LONG).show(); }}再筹备的一个Xposed的我的项目, 不会的能够先看我之前写的一篇笔记: AndroidStudio应用Xposed在app的build.gradle增加依赖 implementation 'com.virjar:sekiro-api:1.0.1' ...

January 3, 2021 · 1 min · jiezi

关于大数据:抖音数据采集教程跨平台模拟执行AndroidNativeEmu手册

装置AndroidNativeEmu有什么用?AndroidNativeEmu是基于Unicron实现的一个指令解析器, 让您可能跨平台模仿Android Native库函数,例如JNI_OnLoad,Java_XXX_XX等函数 个性模仿 JNI Invocation API so JNI_OnLoad can be called properly.模仿 memory、malloc、memcpy反对拦挡零碎调用(SVC #0)通过符号Hook所有 JavaVM, JNIEnv 和 hooked functions 都能够用python来解决反对 VFP反对文件系统(也就是说你能够模仿maps、status等文件)我的项目地址 装置过程环境要求: python 3.7 (留神必须是3.7版本, 我应用3.6装keystone的时候踩了坑) 自测零碎环境: win7 1.Clone 该我的项目 git clone https://github.com/AeonLucid/AndroidNativeEmu.git2.装置须要的反对模块 pip install -r requirements.txt装置keystone-engine可能会失败(反正我是没装上) 解决方案: 克隆keystone仓库: git clone https://github.com/keystone-engine/keystone.git关上keystone\bindings文件夹装置: python setup.py install下载对应零碎和版本dll(因为我是win), 下载链接: http://www.keystone-engine.org/download/把dll复制到python的keystone目录下: [python_path]\Lib\site-packages\keystone\3.把androidemu文件夹复制至sample文件夹下,并删除example.py文件下的对于"samples/"的目录拜访门路 如"samples/example_binaries/libc.so"改为"example_binaries/libc.so"4.运行例子 python example.py5.不出意外的话就能够看到后果了  例子文件浏览example_binaries/ : 外面是须要加载的sovfs/ : 外面是虚构的文件系统, 有须要能够本人增加文件androidemu/ : android虚拟机import loggingimport sys from unicorn import UC_HOOK_CODEfrom unicorn.arm_const import * from androidemu.emulator import Emulator # 配置日志相干设置logging.basicConfig( stream=sys.stdout, #规范输入流 level=logging.DEBUG, #输入等级 format="%(asctime)s %(levelname)7s %(name)34s | %(message)s" #输入格局) logger = logging.getLogger(__name__) #实例化对象 # 实例化虚拟机emulator = Emulator() #加载Libc库emulator.load_library("example_binaries/libc.so", do_init=False) #加载要模拟器的库lib_module = emulator.load_library("example_binaries/libnative-lib.so") #打印曾经加载的模块logger.info("Loaded modules:")for module in emulator.modules: logger.info("[0x%x] %s" % (module.base, module.filename)) #trace 每步执行的指令, 不便调试, 其实也能够勾销def hook_code(mu, address, size, user_data): instruction = mu.mem_read(address, size) instruction_str = ''.join('{:02x} '.format(x) for x in instruction) print('# Tracing instruction at 0x%x, instruction size = 0x%x, instruction = %s' % (address, size, instruction_str))emulator.mu.hook_add(UC_HOOK_CODE, hook_code) #通过导出符号来调用函数emulator.call_symbol(lib_module, '_Z4testv') #通过R0来获取调用构造print("String length is: %i" % emulator.mu.reg_read(UC_ARM_REG_R0))本人写个小Demo测试Demo代码新建一个jni工程, demo的代码很简略, 就是一个加法 ...

December 31, 2020 · 3 min · jiezi

关于大数据:AAAI-2021论文利用深度元学习对城市销量进行预测

AAAI 2021论文:利用深度元学习对城市销量进行预测对于线上和线下的批发行业,销量预测都是一项至关重要的工作,它能够帮忙企业更好的准备库存以及在各个仓库之间调配商品。特地是在大型购物节期间,强劲的促销流动将极大地促成生产。然而,可供参考的历史数据却十分稀缺。如何同时对城市的不同区域和不同时间段的销量进行预测,是一个十分具备挑战的问题。 在2020年12月收录的AAAI 2021(CCF-A类)上,京东城市被收录了一篇名为《Robust Spatio-Temporal Purchase Prediction via Deep Meta Learning》的论文。该论文钻研了如何通过深度元学习,联合城市中的各项信息以及历史的销量数据,对将来,特地是大型购物节期间,城市中各个区域不同时间段的销量进行预测。 一、背景购物中心和商店的空间散布、人口的散布属性以及不同的日期类型(例如,工作日,周末或购物节)等因素,将会导致不同的购物形式,如图1所示。 因为来自某个特定区域以及特定工夫范畴内的数据过于稀缺,咱们无奈仅应用某个范畴的数据去训练一个高精度的预测模型。同时,城市中不同区域的人口密度和散布特色高度异质,并且随着工夫的推移区域特色也会发生变化,对这样简单的时空购买模式进行建模是一个十分艰难的工作。 为了精确地捕捉区域的空间个性,它须要思考一组综合的空间特色,例如趣味点(POI)散布,区域的人口统计特色等。如何通过跨时空建模学习晋升单个区域在特定时间段的预测精度是咱们的次要工作。 图1 空间散布 作者将该预测工作分为次要三个局部: 1)利用时空元学习推理,对不同的时空区域生成对应的时空示意; 2)学习不同时空区域间的共享信息,同时联合区域特定的时空示意,失去更加牢靠的预测销量; 3)通过时空交替训练使得模型在空间以及工夫层面都可能失去更加欠缺的学习。 图2 摊销网络 二、时空示意生成咱们开发了一个摊销网络(如图2 Amortization Network 所示),以对指标区域和日期类型的时空示意的近似后验散布进行建模,该模型须要同时思考销量特色和相干空间特色的影响。 从图3(a)中咱们能够看到,以北京为例,不同城区的销量散布有着显著的区别。 要齐全捕捉不同区域预测工作的购买数据的工夫个性,还须要思考历史销量数据之间的线性和非线性工夫相关性,例如洽购订单和购物车记录中所暗藏的周期模式。 图3(b)中咱们可能看到显著的以周为周期的销量模式变动。为了对这种简单而动静的工夫序列模式进行建模,咱们应用了线性变换模块来取得销量的大抵基数,并应用一个非凡的跳跃LSTM层来捕捉销量变动的非线性工夫模式。接着,通过特色交融模块将提取的工夫特色与动态特色相结合,以进一步反对构建更具备代表性的销量时空示意。 图3 销量模式变动 三、时空销量预测通过上一步,咱们曾经失去了特定时空区域的销量示意。接下来咱们将介绍一种利用共享统计构造的生成模型,来学习不同时空预测工作间所共享信息。对于工作特定的预测,它大大提高了学习效率和预测准确性。该生成模型的构造能够参考上节所属的摊销网络结构的解码器(图2 Generative Model 所示)。 它应用两个不同的输出来生成最终的销量。第一个输出侧重于通过对最近一段时间的输出销量,利用特征提取和交融技术来开掘以后的购买示意,该特征描述了近期的销量模式的变动。第二个输出是从摊销网络中采样的特定于某个时空预测工作的时空特色示意。它捕捉了指标工作的宏观时空模式。最初,生成模型应用齐全连贯的网络将两个输出合并,对指标时刻的销量订单进行预测。 四、时空交替训练不同的时空工作仅与来自特定区域和工夫范畴的无限数据相关联,无奈齐全形容特定区域的购买行为。受多视图学习的启发,咱们构建了两种视图(空间视图和工夫视图)来形容数据的不同观点。两个视图互相补充,以加强学习到的信息并取得更精确的时空数据表示。空间观点偏向于学习不同地区的购买模式,而工夫观点偏向于开掘不同时间段类型的工夫变动模式。 训练期间在不同视图之间进行切换能够在不同区域或日期类型之间学习到不同的时空信息。同时,在交替训练期间还可能整合不同时空工作共享的生成模型,并进步了预测准确性。残缺的训练过程如算法1所示。 算法1 五、试验咱们应用来自京东的海量高质量在线销量数据集来评估咱们的模型。JD数据集蕴含时间跨度从2015年至2019年的洽购订单,购物车数据(作为动静工夫序列特色)和包含北京18个行政区块的区域特色(例如POI和人口统计资料数据)作为动态特色。 为了验证模型的有效性以及鲁棒性,作者对不同工夫区间(周内,周末,购物节等)的销量进行预测评估。同时还对模型中的不同组件进行融化剖析,对不同组件的有效性进行评估,后果如表1所示。 表1 不同组件的有效性 表1中咱们能够看到,对于素日较为平缓和购物节的爆发性预测设置中,STMP均优于所有基线办法。在MSE方面,STMP均比最佳基准进步了至多30%。在爆发性销量预测场景中,STMP仍比基准升高约30%至60%。这些结果表明,当理论购买模式与平时截然不同时,咱们的办法是无效且牢靠的。 为了进一步钻研STMP各个模型组成部分的影响,咱们还在表1中比拟了STMP及其变体的性能。能够察看到,STMP-VI在总体和周末情景中体现良好,这些情景具备绝对稳固的购买模式,但在购物节上的体现要比STMP差。这是因为STMP-VI应用点估计而不是特定于工作的时空示意的散布形容,当数据无限或模式高度不确定时,这会呈现问题。 此外,与STMP或其余变体相比,STMP-SKIP的准确性较差,但仍优于其余基准。这证实须要思考购买工夫序列中的多个周期性模式。这也反映在图4(b)中,咱们能够在购买工夫序列数据中看到清晰的周期性模式。这些证实对数据中的多个周期性属性进行建模在进步模型性能方面起着重要作用。 图4 为了探索模型在不同区域以及时间段的成果,作者筛选了四个具备代表性的区域(笼罩不同销量范畴,具体地理位置请参见图4(a))将STMP与基线办法在整个2019年的销量数据上做可视化,如图4所示。在大多数地区,基线无奈很好地预测购物节期间购买工夫序列的突发性,例如中旬促销和11.11的购买顶峰。他们偏向于给出激进的后果,并且只专一于进步整体准确性。然而,STMP利用不同区域和日期类型的时空示意来反对多任务少拍学习,以促成对特定区域和日期类型的更好预测。能够察看到,只有STMP可能精确地预测爆发式的销量(所有图6中的峰值)。 图5 同时作者对于购物节历史数据的可参考状况进行了进一步的探索,在购物节销量数据十分稀缺的状况下,每减少一次购物节可见数据,精度会有肯定的晋升。然而即便在购物节可参考数据只有一次(继续大概一周)的状况下,STMP也具备较高的准确率,这表明了模型的鲁棒性。 表2 最初,作者对时空交替训练形式在三个大型购物节上也做了比拟。在工夫训练中,合并操作将来自同一天类型的实例成批集成,而不思考空间常识。同时,在空间训练中,模型将来自同一区域的一批实例集成在一起,而无需思考工夫信息。 从表2中咱们能够看到,即便不残缺的T训练和S训练也比表1列出的基线提供更高的准确性。然而,与残缺的时空交替训练相比,不足时空上的联结元常识依然会导致较低的准确性。这表明不同的训练模式会跨地区和工夫类型学习不同的转换。从时空方面的补充训练能够无效地进步预测的准确性。(关注“京东数科技术说”微信号,回复“AAAI 2021”可下载残缺论文) 作者:京东数科JUST团队-秦慧玲文章起源:“京东数科技术说”微信公众号 原文链接:https://mp.weixin.qq.com/s/9XkWxcoMsQVoHXRL0Dj-Tg 更多技术干货欢送关注“京东数科技术说”微信公众号,咱们只凭技术谈话! ...

December 31, 2020 · 1 min · jiezi

关于大数据:抖音数据采集API

抖音数据采集API接口列表:搜寻关键词搜寻用户关键词搜寻话题关键词搜寻视频关键词搜寻音乐关键词搜寻直播关键词搜寻地址关键词搜寻商品关键词综合搜寻用户用户信息用户视频列表用户直播信息用户商品橱窗用户粉丝列表用户关注列表用户喜爱列表视频视频详情视频评论列表视频带货商品列表视频评论的回复列表直播直播间信息直播间 弹幕、关注、送礼、点赞 实时查问直播间带货商品列表直播间开播查问直播间在线观众直播间随机举荐带货带货商品查问带货同款商品视频列表带货视频随机举荐话题话题详情话题视频列表举荐首页视频举荐热门话题举荐榜单明星榜热点榜直播榜今日最热视频榜人气好物榜更多短视频数据实时采集接口,请查看文档: TiToData免责申明:本文档仅供学习与参考,请勿用于非法用处!否则所有后果自负。

December 30, 2020 · 1 min · jiezi

关于大数据:浅谈安卓逆向协议-抖音-设备注册

抖音最近退出了风控,大大限度了数据拉取的胜利度,解决这个问题很辣手,具体本人摸索。同时抖音增强了对SO的加密,即便修复ida堆栈,也是jumpout,大大晋升了代码追踪的繁琐度,所以最新版的SO还没有深刻跟进剖析。那么回到明天的话题,抖音的设施如何注册其实网上曾经有公开的材料确实可行,咱们陈词滥调,简略的聊一下思路逻辑一:首先通过抓包找到接口地址http://log.snssdk.com/service/2/device_register二:通过JDAX对源代码的剖析,咱们能够发现它先通过GZIP压缩,再TTEncryptUtils加密,最初POST发送进来申请而后X-SS-STUB,发现它只是一个对post的body局部的md5三:最初咱们能够拼装属于本人的申请包 更多短视频数据实时采集接口,请查看文档: TiToData免责申明:本文档仅供学习与参考,请勿用于非法用处!否则所有后果自负。

December 29, 2020 · 1 min · jiezi

关于大数据:解析抖音直播protocbuf弹幕数据

在开始剖析之前须要筹备好:1.protobuf装置,composer装置protoc反对库2.直播间弹幕抓包;3.解析protoc protoc --decode_raw < xxx.bin 查看解析后的成果:剖析之后发现,解析后果顺次为音讯数组,申请游标,间隔时间,工夫戳,和申请标记 一、开始写protoc 二、生成php类文件运行:protoc --php_out=./ *.proto 三、解析protoc文件1.首先引入类库2.调用mergeFromString办法解析3.接下来就是调用get办法取参数了4.运行成果: 更多短视频数据实时采集接口,请查看文档: TiToData免责申明:本文档仅供学习与参考,请勿用于非法用处!否则所有后果自负。

December 29, 2020 · 1 min · jiezi

关于大数据:抖音数据采集教程一例APK脱壳反编译寻找AES密钥过程记录

数据采集教程,一例APK脱壳反编译寻找AES密钥过程记录应客户需要对一款名为“**主治医师总题库”包名为com.zitibaohe.zhuzhiyishierke)的APP进行采集可行性剖析。  这款APP和服务器的通信应用的是HTTP协定,很容易抓到数据包,惋惜返回的数据是加密的,如下图所示。  依据以往教训,内容应该是被AES加密了。要想还原出明文,必须要反编译拿到KEY才行。  下载APK文件,用JADX对其进行反编译,发现被加壳了,应用的是360的加壳工具,如下图所示。  必须先脱壳能力反编译到实在的APK源码。脱壳咱们应用Xposed + FDex2插件(PS:如果你对Xposed还不相熟,倡议先浏览Xposed相干文章)。  装置好FDex2插件(不要忘了重启零碎),启动插件,点选要脱壳的APP,如下图所示。  而后启动指标APP(儿科主治医师总题库)。应用Root Explorer浏览到APP的数据目录(/data/data/com.zitibaohe.zhuzhiyishierke/)下,如果看到多个dex文件(本来该目录下没有这些文件,如下图所示),阐明脱壳胜利了。  将这几个dex文件pull下来,而后顺次用JADX对其进行反编译。因为有多个dex,怎么疾速定位咱们关注的代码在哪一个里呢?咱们能够搜一些特色字符串,比方后面抓包看到的申请URL中的个“questions”,如果找到了,阐明八成就是这个dex文件(如下图所示)。  而后咱们再搜寻AES相干的关键词比方“AES/”,"SecretKeySpec"或“IvParameterSpec”,最终胜利定位(如下图所示),其应用了"AES/CBC/NoPadding"加密算法,对应的KEY和IV都是明文的。  咱们来验证下KEY和IV是否正确。借助“AES Online”(http://aes.online-domain-tool...,抉择对应的加密算法,输出密文、KEY、IV(如下图所示)。  而后点击"Decrypt",胜利还原出明文(如下图所示)。点击“[Download as a binary file]”下载解密后的数据文件,发现内容是JSON格局的,解析之后如下图所示。  至此,指标实现。  除了上述通过反编译源码来获取秘钥外(过程很繁琐),咱们还能够利用Xposed的形式(你须要先理解Xposed相干常识),通过HOOK javax.crypto.spec.SecretKeySpec和javax.crypto.spec.IvParameterSpec类来截获KEY和IV,操作过程简略,上面介绍两个相干插件。1.应用Inspeckage(https://github.com/ac-pm/Inspeckage)这个Android动态分析工具。如下图所示是Inspeckage截获到的AES的KEY,与咱们下面通过源码获取到的统一(不过没有获取的IV,起因未知)。2.我还测了一个叫做CryptoFucker的Xposed插件(https://github.com/Chenyuxin/CryptoFucker),用起来尽管没有Inspeckage不便(没有UI),不过,成果很好,胜利获取到了KEY和IV,如下图所示(HEX模式显示)。 更多抖音,快手,小红书数据实时采集接口,请查看文档: TiToData免责申明:本文档仅供学习与参考,请勿用于非法用处!否则所有后果自负。

December 28, 2020 · 1 min · jiezi

关于大数据:Android-抖音常用反编译工具

Android 抖音罕用反编译工具罕用反编译工具apktool :反编译apk,重构。下载地址: https://ibotpeaches.github.io/Apktool/apktool次要能够将资源解码,并在批改后能够从新构建它们 dex2jar :反编译apk,解压 classes.dex 文件下载地址: https://down.52pojie.cn/Tools/Android_Tools/2.1版本能够反对了多级dex反编译。2.0及之前并不反对这种操作。 JD-GUI :将class文件反编译成java源代码下载地址:https://down.52pojie.cn/Tools/Android_Tools/jd-gui次要用来反编译class文件,有图形化界面,然而交互式操作挺差的 AndroidKiller : 可视化、全自动的反编译、编译、签名;反对批量编译APK。下载地址:https://down.52pojie.cn/Tools/Android_Tools/很好用的反编译软件,他集 apktools 和 dex2jar 于一身,有界面,操作简略。但惋惜对多个dex文件的反编译不太行,会失落局部jar。《这里有人给出了解决方案》 AndroidCrackTool: mac反编译工具下载链接: https://pan.baidu.com/s/1efZuAMo-UJydcLIuib-J-w 提取码: h8jegithub :https://github.com/Jermic/Android-Crack-Tool GDA:第一款国产交互式反编译器下载地址: https://github.com/charles2gan/GDA-android-reversing-ToolGDA除了反编译外,还反对包过滤的剖析性能,提供有算法工具,文件转换工具等等 jadx:反编译利器,反对命令行和图形界面下载地址: https://github.com/skylot/jadx反对命令行和图形界面 autosign:签名工具专用于打包签名的软件,不过auto sign须要配置好java环境能力失常应用。 xposed:hook框架下载链接: https://pan.baidu.com/s/15WnJD8qj9UzSss55DWLNfA 提取码: 7sgbXposed框架是一款能够在不批改APK的状况下影响程序运行,批改零碎的框架服务。 IDAPro :反汇编业余工具IDAPro 7.0 调试工具Windows版本IDA Pro是目前最优良的动态逆向工具之一,IDA PRO简称IDA(Interactive Disassembler) ,IDA PRO 7.0是一个世界范畴内的顶级交互式反汇编业余工具。 Unidbg :java Hook 框架Unidbg 能在pc端间接调用so文件中的函数下载链接: https://github.com/zhkl0228/unidbg 更多短视频数据实时采集接口,请查看文档: TiToData免责申明:本文档仅供学习与参考,请勿用于非法用处!否则所有后果自负。

December 28, 2020 · 1 min · jiezi

关于大数据:Apache-Hudi使用简介

Apache Hudi应用简介[TOC] 数据实时处理和实时的数据实时分为解决的实时和数据的实时即席剖析是要求对数据实时的解决,马上要失去对应的后果Flink、Spark Streaming是用来对实时数据的实时处理,数据要求实时,解决也要迅速数据不实时,解决也不及时的场景则是咱们的数仓T+1数据 而本文探讨的Apache Hudi,对应的场景是数据的实时,而非解决的实时。它旨在将Mysql中的时候以近实时的形式映射到大数据平台,比方Hive中。 业务场景和技术选型传统的离线数仓,通常数据是T+1的,不能满足对当日数据分析的需要而流式计算个别是基于窗口,并且窗口逻辑绝对比拟固定。而笔者所在的公司有一类非凡的需要,业务剖析比拟相熟现有事务数据库的数据结构,并且心愿有很多即席剖析,这些剖析蕴含当日比拟实时的数据。惯常他们是基于Mysql从库,间接通过Sql做相应的剖析计算。但很多时候会遇到如下阻碍 数据量较大、剖析逻辑较为简单时,Mysql从库耗时较长一些跨库的剖析无奈实现因而,一些弥合在OLTP和OLAP之间的技术框架呈现,典型有TiDB。它能同时反对OLTP和OLAP。而诸如Apache Hudi和Apache Kudu则相当于现有OLTP和OLAP技术的桥梁。他们可能以现有OLTP中的数据结构存储数据,反对CRUD,同时提供跟现有OLAP框架的整合(如Hive,Impala),以实现OLAP剖析 Apache Kudu,须要独自部署集群。而Apache Hudi则不须要,它能够利用现有的大数据集群比方HDFS做数据文件存储,而后通过Hive做数据分析,相对来说更适宜资源受限的环境 Apache hudi简介应用Aapche Hudi整体思路Hudi 提供了Hudi 表的概念,这些表反对CRUD操作。咱们能够基于这个特点,将Mysql Binlog的数据重放至Hudi表,而后基于Hive对Hudi表进行查问剖析。数据流向架构如下 Hudi表数据结构Hudi表的数据文件,能够应用操作系统的文件系统存储,也能够应用HDFS这种分布式的文件系统存储。为了后续剖析性能和数据的可靠性,个别应用HDFS进行存储。以HDFS存储来看,一个Hudi表的存储文件分为两类。 蕴含_partition_key相干的门路是理论的数据文件,按分区存储,当然分区的门路key是能够指定的,我这里应用的是_partition_key.hoodie 因为CRUD的零散性,每一次的操作都会生成一个文件,这些小文件越来越多后,会重大影响HDFS的性能,Hudi设计了一套文件合并机制。 .hoodie文件夹中寄存了对应的文件合并操作相干的日志文件。数据文件Hudi实在的数据文件应用Parquet文件格式存储 .hoodie文件Hudi把随着工夫流逝,对表的一系列CRUD操作叫做Timeline。Timeline中某一次的操作,叫做Instant。Instant蕴含以下信息 Instant Action 记录本次操作是一次数据提交(COMMITS),还是文件合并(COMPACTION),或者是文件清理(CLEANS)Instant Time 本次操作产生的工夫state 操作的状态,发动(REQUESTED),进行中(INFLIGHT),还是已实现(COMPLETED).hoodie文件夹中寄存对应操作的状态记录 Hudi记录Idhudi为了实现数据的CRUD,须要可能惟一标识一条记录。hudi将把数据集中的惟一字段(record key ) + 数据所在分区 (partitionPath) 联结起来当做数据的惟一键 COW和MOR基于上述根底概念之上,Hudi提供了两类表格局COW和MOR。他们会在数据的写入和查问性能上有一些不同 Copy On Write Table简称COW。顾名思义,他是在数据写入的时候,复制一份原来的拷贝,在其根底上增加新数据。正在读数据的申请,读取的是是近的残缺正本,这相似Mysql 的MVCC的思维。 上图中,每一个色彩都蕴含了截至到其所在工夫的所有数据。老的数据正本在超过肯定的个数限度后,将被删除。这种类型的表,没有compact instant,因为写入时相当于曾经compact了。 长处 读取时,只读取对应分区的一个数据文件即可,较为高效毛病 数据写入的时候,须要复制一个先前的正本再在其根底上生成新的数据文件,这个过程比拟耗时。且因为耗时,读申请读取到的数据绝对就会滞后Merge On Read Table简称MOR。新插入的数据存储在delta log 中。定期再将delta log合并进行parquet数据文件。读取数据时,会将delta log跟老的数据文件做merge,失去残缺的数据返回。当然,MOR表也能够像COW表一样,疏忽delta log,只读取最近的残缺数据文件。下图演示了MOR的两种数据读写形式 长处 因为写入数据先写delta log,且delta log较小,所以写入老本较低毛病 须要定期合并整顿compact,否则碎片文件较多。读取性能较差,因为须要将delta log 和 老数据文件合并基于hudi的代码实现我在github上搁置了基于Hudi的封装实现,对应的源码地址为 https://github.com/wanqiufeng...。 ...

December 27, 2020 · 2 min · jiezi

关于大数据:抖音数据采集教程逆向研究XGorgonXKhronos算法协议

抖音数据采集教程,逆向钻研X-Gorgon,X-Khronos算法协定抖音的接口中,通过抓包抖音申请时,能够发现x-gorgon和 xlog两大参数是必备的,尽管说目前有些接口不通过这两个参数还是能够拿到数据,然而我感觉抖音曾经预留显示了这两大申请的参数,只会逐步提高要求,用于服务器验证,不然日后都无奈申请到数据,通过工具逆向反编译出了抖音app的源码,发现下列这个位于类com.ss.sys.ces.gg.tt中,有这样一个函数用于生成x-gorgon的值。 public static void init_gorgon() { com.bytedance.frameworks.baselib.network.http.e.j = new e.a() { public final Map<String, String> a(String paramAnonymousString, Map<String, List<String>> paramAnonymousMap) { HashMap localHashMap = new HashMap(); for (;;) { try { if ((!paramAnonymousString.toLowerCase().contains("http")) && (!paramAnonymousString.toLowerCase().contains("https"))) { throw new NullPointerException("nein http/https"); } if ((paramAnonymousString.toLowerCase().contains("X-Khronos")) && (paramAnonymousString.toLowerCase().contains("X-Gorgon"))) { throw new NullPointerException("it was"); } if (!tt.a(paramAnonymousString)) { int i = (int)(System.currentTimeMillis() / 1000L); paramAnonymousString = tt.b(paramAnonymousString); localObject2 = null; if ((paramAnonymousString != null) && (paramAnonymousString.length() > 0)) { localObject1 = d.a(paramAnonymousString); Iterator localIterator = paramAnonymousMap.entrySet().iterator(); paramAnonymousMap = null; paramAnonymousString = paramAnonymousMap; if (localIterator.hasNext()) { Object localObject4 = (Map.Entry)localIterator.next(); localObject3 = localObject2; if (((String)((Map.Entry)localObject4).getKey()).toUpperCase().contains("X-SS-STUB")) { localObject3 = (String)((List)((Map.Entry)localObject4).getValue()).get(0); } localObject2 = localObject3; if (!((String)((Map.Entry)localObject4).getKey()).toUpperCase().contains("COOKIE")) { continue; } String str = (String)((List)((Map.Entry)localObject4).getValue()).get(0); localObject2 = localObject3; if (str == null) { continue; } localObject2 = localObject3; if (str.length() <= 0) { continue; } localObject4 = d.a(str); str = tt.c(str); localObject2 = localObject3; paramAnonymousMap = (Map<String, List<String>>)localObject4; if (str == null) { continue; } localObject2 = localObject3; paramAnonymousMap = (Map<String, List<String>>)localObject4; if (str.length() <= 0) { continue; } paramAnonymousString = d.a(str); StcSDKFactory.getInstance().setSession(str); localObject2 = localObject3; paramAnonymousMap = (Map<String, List<String>>)localObject4; continue; } localObject3 = new StringBuilder(); ((StringBuilder)localObject3).append(i); localHashMap.put("X-Khronos", ((StringBuilder)localObject3).toString()); if (localObject1 == null) { break label572; } localObject3 = localObject1; if (((String)localObject1).length() == 0) { break label572; } if (localObject2 == null) { break label579; } localObject1 = localObject2; if (((String)localObject2).length() == 0) { break label579; } if (paramAnonymousMap == null) { break label586; } localObject2 = paramAnonymousMap; if (paramAnonymousMap.length() == 0) { break label586; } if (paramAnonymousString == null) { break label593; } paramAnonymousMap = paramAnonymousString; if (paramAnonymousString.length() == 0) { break label593; } if (b.a().a) { Calendar.getInstance().getTimeInMillis(); } paramAnonymousString = new StringBuilder(); paramAnonymousString.append((String)localObject3); paramAnonymousString.append((String)localObject1); paramAnonymousString.append((String)localObject2); paramAnonymousString.append(paramAnonymousMap); paramAnonymousString = com.ss.a.b.a.a(com.ss.sys.ces.a.leviathan(i, com.ss.a.b.a.a(paramAnonymousString.toString()))); if (b.a().a) { Calendar.getInstance().getTimeInMillis(); } localHashMap.put("X-Gorgon", paramAnonymousString); return localHashMap; } } else { throw new NullPointerException("filter_1"); } } catch (Throwable paramAnonymousString) { paramAnonymousString.getMessage().contains("filter_1"); return localHashMap; } Object localObject1 = null; continue; label572: Object localObject3 = "00000000000000000000000000000000"; continue; label579: localObject1 = "00000000000000000000000000000000"; continue; label586: Object localObject2 = "00000000000000000000000000000000"; continue; label593: paramAnonymousMap = "00000000000000000000000000000000"; } } }; }  对应的就是底层.so文件了通过剖析晓得,最终的x-gorgon的生成,是调用com.ss.sys.ces.a.leviathan函数,所以咱们只有利用这个函数就能帮咱们解决x-gorgon的生成,他外面的参数有两个 public static native byte[] leviathan(int paramInt, byte[] paramArrayOfByte);第一个是以后的工夫戳,也就是X-Khronos第二个字节组就一串字符串,由Url、postdata、cookies和sesseionid别离进行MD5加密组成的字串,做的二次申请。所以也就发现了X-SS-STUB的值是将要post的数据做md5计算的值,如果是要做post的话,那这个值就须要带上。就能失常申请到数据了。目前有了点小成绩,具体细节就不公开了。 ...

December 27, 2020 · 2 min · jiezi

关于大数据:数据采集教程以抖音为例反编译抖音apk

数据采集教程,以抖音为例,反编译抖音apk前言这一篇来解说一下如何反编译抖音的APK,理解过后反编译其实也是挺简略的 工具apktoolApktool是google提供的apk的编译工具。官网应用阐明:https://ibotpeaches.github.io/Apktool/install/在装置过程中需注意:疾速查看Apktool 2.x (apktool 1.5.2当前的版本) 是否装置 Java 1.7?在命令行执行 java –version 查看是否返回1.7?如果不是,请装置 Java7并进行相干的环境配置Apktool 1.x (apktook 1.5.2之前的版本) 是否装置 Java 1.6 或更高的版本?在命令行执行 java –version 查看是否返回1.6 或更高的版本?如果不是,请装置Java 6 或 Java 7。—>check电脑是否装置apktool(辨别apktool 2.x和apktool 1.x)运行须要的java环境。Apktool 2.x的装置 Windows:下载脚本链接并存为apktool.bat 下载 apktool-2 (下载最新)重命名下载的jar文件为apktool.jar 挪动文件(apktool.jar & apktool.bat)到电脑的windows目录,个别为C://Windows如果你没有权限拜访C://Windows,你能够将这两个文件放在任意目录下,而后将该目录增加到环境变量path中 尝试在命令行中运行Linux: (略)Mac OS X: (略)留神 - 脚本文件bat并不是必须的,但该文件十分有用,你能够防止重复输出 java-jar apktool.jar。Apktool 1.x装置 Windows:下载apktool-install-windows-* 文件下载apktool-* 文件解压以上文件并挪动到windows目录下Linux: (略)Mac OS X: (略)参考:https://www.cnblogs.com/mliangchen/p/5079783.html dex2jar这个目录用来将Android打包后的.dex文件转化为.jar包。下载地址:http://sourceforge.net/projects/dex2jar/files/jd-gui查看APK中classes.dex转化成出的jar文件,即源码文件https://github.com/java-decompiler/jd-gui/releases(能够在GitHub下载)参考:https://blog.csdn.net/s13383754499/article/details/78914592 也能够在我提供的网盘中下载这些工具包~链接:https://pan.baidu.com/s/1XyEmSCBSuUaAAXBsQdREng 明码:21kz文件中蕴含了抖音的apk,想要本人获取apk的话,能够用本人的手机上的浏览器搜寻抖音而后下载,失去的就是apk文件文件如下一、先将apktool.bat和apktool.jar挪动到C:\Windows下,须要管理员权限点击即可;接着测试,关上cmd命令窗口,输出apktool,若呈现则阐明胜利,能够应用apktool;若不能够,则请看上述装置apktool2的注意事项二、接着,cd到这些工具的目录后,输出命令:java -jar apktool.jar d -f D:\Python\PycharmProject\F-APK\douyin.apk -o douyin就能够看到生成了douyin的文件夹外面是这样的这样就是用apktool抖音apk反编译失去图片、XML配置、语言资源等文件的过程三、将要反编译的抖音APK后缀名改为.rar或者 .zip,并解压失去其中的classes.dex文件将这个classes.dex放到之前解压进去的工具dex2jar-2.0文件夹内在命令行下定位到dex2jar.bat所在目录,输出”d2j-dex2jar classes.dex”失去如下:至此,就能够看到生成的jar文件了四、最初就是用jd-gui工具将class文件反编译成java源代码双击关上jd-gui.exe而后将classes-dex2jar.jar文件拖入即可这样一来反编译就胜利啦!是不是挺简略!怎么破解抖音的三个加密参数就……接着摸索吧! ...

December 27, 2020 · 1 min · jiezi

关于大数据:计算存储分离在消息队列上的应用

云妹导读: 随着互联网的一直倒退,大数据高并发不再边远,是大部分我的项目都必须具备的能力。其中,音讯队列简直是必备技能。成熟的音讯队列工具有很多,本篇文章就来介绍一款京东智联云自研音讯队列工具——JCQ。 _JCQ全名JD Cloud Message Queue,是京东智联云自研,具备CloudNative个性的分布式消息中间件。_ JCQ设计初衷即为适应云个性的消息中间件,具备高可用、数据可靠性、正本物理隔离、服务自治、衰弱状态汇报、少运维或无运维、容器部署、弹性伸缩、租户隔离、按量付费、云账户体系、受权等个性。 一、JCQ演进过程JCQ早在2017年中开始开发1.0版本,2018年11月正式GA上线对外售卖。但1.0版本中Topic受限于单台服务器限度,满足不了用户超大规格Topic需要。 因而,咱们在2.0 版本中着重解决扩缩容问题。2019年4月 JCQ 2.0 正式上线,次要新增个性就是Topic 扩缩容能力、热点Topic在Broker间的负载平衡、热点Broker的流量转移。 2019年7月, JCQ又做了一次大的架构演进——计算存储拆散 ,大版本号为JCQ 3.0, 于2019年底上线。计算存储拆散对架构带来了比拟显著的益处,解决了日常遇到的许多痛点问题。 下文将具体介绍此次演进带来的劣势以及解决了哪些痛点问题: 1,无效管制降级影响范畴在JCQ2.0中计算模块与存储模块处于同一个过程,降级计算模块势必将存储模块一起降级。而存储模块重启是比拟重的动作,须要做的工作有:加载大量数据、进行音讯数据与音讯索引数据比对、脏数据截断等操作。往往修复计算模块一个小的Bug,就须要做上述十分重的存储模块重启。而在事实工作中,大部分降级工作都是因为计算模块性能更新或Bugfix引起的。 为了解决这个问题, JCQ3.0将计算模块、存储模块独立部署,之间通过RPC调用 。各自降级互不影响。如下图所示: 计算节点Broker只负责生产音讯、推送音讯、鉴权、认证、限流、拥塞管制、客户端负载平衡等业务逻辑,属于无状态服务。比拟轻量,降级速度快。 存储节点Store只负责数据写入、正本同步、数据读取。因为业务逻辑简略,性能稳固后,除优化外根本无需改变,也就无需降级。 2,独立部署,突破硬件限度JCQ是共享消息中间件,用户申请的是不同规格TPS的Topic,并不感知CPU、Memory、Disk等硬件指标。所以,JCQ服务方须要思考如何正当应用这些硬件指标。 JCQ通过容器部署,有多种类型的组件,这些组件对硬件的需要也是多样化的,其中对资源耗费最多的是计算模块和存储模块。在JCQ2.0版本中,计算模块和存储模块部署在一起,抉择机型时要兼顾CPU、Memory、Disk等指标,机型要求繁多,很难与其余产品线混合部署。即便是同一资源池,也存在因为调度程序,造成调度失败的状况。如一台机器残余资源恰好能调度一个须要大规格磁盘的A容器,然而因为B容器先被调度到这台机器上,残余资源就不够创立一个A容器,那这台机器上的磁盘就节约了。 JCQ3.0后,计算节点Broker与存储节点Store独立部署,这两个组件能够各自抉择适宜本人业务的机型,部署在相应资源池中。这样 JCQ能够做到与其余产品混合部署,共用资源池水位,而不必单独承当资源水位线。 3,架构改良带来的老本升高JCQ3.0中计算节点Broker是无状态服务,主从切换比拟轻量,能在秒级实现故障转移;且部署时思考了物理设施反亲和,如跨Rack、跨AZ部署。所以,能够在可用性、资源老本之间做肯定的衡量。如能够应用M:1形式做高可用冷备,而不用1:1的比例高可用冷备,进而达到节俭硬件资源的目标。 4,解决Raft性能问题JCQ 1.0 设计之初就采纳Raft算法,来解决服务高可用、数据一致性的问题。Message Log与Raft Log 有很多独特的个性,如程序写、随机读、末端热数据。所以,间接用Raft Log当成Message Log是十分适合的。 在JCQ演进中咱们也发现了Raft自身的一些性能问题,如程序复制、程序commit、有的流程只能用单线程解决等限度。针对这些问题, 最间接无效的方法就是扩大Raft的数目、扩大单线程流程数目 ,在肯定数量级内,并发能力随着Raft Group数目的增长,呈线性增长关系,称之MultiRaft,如下图所示: 上图中,每个StoreNode节点是一个独立过程,外部有四组逻辑RaftGroup(橙色的节点为RaftGroup的Leader),各组RaftGroup之间是并行关系,能够做到Group间并行复制、并行commit。 因为大量应用了NIO,这些RaftGroup之间能够共享通信线程池,裁减RaftGroup数目并不会带来线程资源线性增长的问题。 5,疾速故障复原,轻量负载平衡在JCQ3.0中,Broker为轻量的无状态服务,在主从切换、故障复原方面绝对2.0更为轻量,自身能更快地复原对外服务能力 。 同时,Broker将Producer、Consumer的连贯申请,形象为PubTask和SubTask,后文统称为Task。Task的概念十分轻量,仅形容Client与Broker的对应关系,由元数据管理器Manager对立调度、治理。转移Task只须要批改Task的内容,客户端从新连贯新Broker即可。 一般来说,Broker的次要瓶颈在于网络带宽。Broker定期统计网络入口流量与进口流量,并上报给治理节点Manager。Manager依据入口流量、进口流量与带宽阈值进行裁决,发现超过阈值后,通过肯定策略将相应的Task转移到较小负载的Broker上,并告诉相应的Producer与Consumer;Producer与Consumer收到告诉后,从新获取Task的路由信息,主动重连到新的Broker持续进行生产、生产。 6,高扇出需要构想一个场景,有一个大规格的Topic,创立了n个生产组。生产总TPS是生产总TPS的n倍。减少生产组,会导致生产总TPS线性增长。达到肯定生产组规模后,单Broker因为网卡带宽的起因,无奈满足这种高扇出的场景。单服务器是无奈解决这个问题。 在JCQ 3.0 能够将这些不同的生产组对应的SubTask扩散到若干个Broker上,每个Broker负责一部分SubTask,单Broker从Store预读音讯,将数据推送给Consumer。这样 多个Broker共同完成所有生产组的音讯流量,合作一起提供高扇出的能力。 7,反对多种存储引擎消息中间件很大的特点是:大部分场景下,热数据都在末端,而回溯几天之前的音讯这个性能是不罕用的。所以,就有冷热数据之分。 JCQ 计算节点设计了一层存储形象层Store Bridge 能够接入不同的存储引擎,能够接入Remote Raft Cluster,或者分布式文件系统WOS、或者S3。甚者能够将冷数据定期从低廉的本地盘卸载到便宜的存储引擎上。 8,带来的副作用绝对于JCQ2.0,计算节点与存储节点之间的通信形式,由接口调用变为RPC调用,在提早方面会有肯定损失。通过测试,绝大部分提早都在1ms左右,在大多数场景下就义1ms左右的提早并不会给业务带来太大的影响。 二、JCQ将来瞻望JCQ将来会次要在多协定兼容,按需主动扩缩容、云原生等方面演进: ...

December 24, 2020 · 1 min · jiezi

关于大数据:UCloud智能大数据平台USDP上线助力企业快速构建大数据服务

在互联网市场的头部效应下,企业所面临的竞争压力越来越大,如何无效解决获客老本高、用户黏性低、变现能力弱等问题,正是越来越多的企业开始构建大数据平台的初衷。 但因为大数据解决方案所波及的组件盘根错节、技术门槛较高,且初期投入的资源和前期的保护老本较大,非常考验企业的大数据平台组建和运维能力。因而,UCloud大数据团队于近期上线了大数据智能平台(UCloud Smart Data Platform,下文简称 USDP) ,旨在帮忙企业疾速搭建大数据分析解决平台,并对大数据集群进行集中管理,从而升高企业的大数据开发、保护老本。 一站式大数据智能治理平台 USDP是帮忙企业构建云端托管型的一站式大数据采集、存储、剖析、利用和运维的智能平台。其产品架构图如下: 从上图能够看出,USDP是构建在UCloud私有云IaaS根底资源之上,提供 Hadoop生态的服务零碎,如HDFS、Hive、HBase、Spark、Flink、Presto、Atlas、Ranger 等泛滥开源大数据服务组件,并对这些组件进行配置管理、监控告警、故障诊断等智能化的运维治理,从而帮忙企业疾速构建起大数据的剖析解决能力。 用户可通过 USDP 不便疾速地部署大数据集群中的各类服务与组件,并集中式地运维这些组件。且在部署服务与组件的过程中,USDP 能够全自动化实现整个流程,大大降低了部署老本。 同时,USDP 中集成的实时监控视图与告警策略能够帮忙运维人员及时获取异样告警信息,疾速定位和排查问题。 除此之外,USDP 高度集成了 Hadoop 生态中的服务与组件,并且全副基于 Apache 版本实现适配,无深度批改,因而用户无需放心服务组件应用过程中造成的 API 不兼容问题,用户业务也无需放心被非 Apache 开源协定之外的服务框架所绑定。 轻量级、自动化运维的大数据“管家” USDP 作为纯国产化、UCloud自研的大数据管理服务,能够实现云上、云下交互的便捷对立,其具体特点如下: 全面的组件反对基于开放式的治理架构,USDP 集成了 30 余款开源的大数据组件,涵盖数据集成、数据存储、计算引擎、任务调度、权限治理等大数据处理的各个环节,全面性为业界之最。企业能够依据本身业务特点和需要,从中抉择相应的组件来搭建本人的大数据处理平台。 欠缺的监控告警机制源自多年的大数据运维教训积淀,USDP 为每款组件预置了欠缺的监控和告警模板,丰盛的监控指标和灵便的告警形式,帮忙用户及时把握各个组件的运行状况,进行必要的保护和优化。与此同时,智能化的故障诊断工具和业余的技术支持团队,为大数据集群的稳固运行保驾护航。 可视化工作流UDSUDS(UCloud Data Studio)是一款UCloud自研的轻量级、分布式、易扩大的可视化DAG工作流任务调度零碎。通过拖拽式的工作流开发 IDE,简略 Web 式拖拽操作来实现整个大数据工作流的工作开发。内置了丰盛的处理器,多样化的工作反对:Shell、Python、Hive、Spark、MR、SQL、子流程等。 UDS提供可视化的流程定义能力,可对大量异构数据源提供高速稳固的数据集成能力,并在同步过程中实现对数据的ETL操作。 平安稳固私有云USDP 的底层资源为用户所独享,集群位于独立的虚构公有网络中,实现了无效的平安隔离。同时,USDP 集成的各个组件编译自 Apache 社区稳固版本,通过了严格的兼容性测试和压力测试,关键性组件都反对高可用个性,确保集群稳固牢靠运行。 弹性易用针对大数据利用场景,私有云USDP 提供了丰盛多样的机型(大数据物理机、一般云主机、快杰云主机等)供用户抉择,并联合私有云的弹性伸缩能力,无效管制理论应用老本。向导式的操作流程和欠缺的场景案例,帮忙用户轻松上手。 反对私有化部署USDP除了与UCloud私有云IaaS集成,还能够作为独立的大数据组件治理平台部署在私有化的数据中心,并兼容虚拟机、物理服务器环境。为私有化部署的客户提供与私有云体验统一的大数据平台服务。 UCloud还提供基于USDP的软硬一体交付计划,已提前预装实现USDP服务,实现用户插电即用的大数据平台治理服务。 典型利用场景 1、数据仓库目前国内最罕用的数仓模型为维度数仓,就是依照事实表、维度表来构建数据仓库、数据集市。在该体系中,维度是形容事实的角度,如日期、客户、供应商等,事实是要度量的指标,如客户数、销售额等。通过 USDP,用户能够部署构建维度数仓所需的所有服务,帮忙企业疾速构建数据中台。 2、机器学习在机器学习畛域,对运算往往有大量需要,通过 USDP 中的Spark、Flink 等分布式运算框架,搭配官网算法或自研算法,即可事倍功半的进行机器学习开发。同时,在深度学习畛域,建模所需的大量数据,也能够存储于 HDFS,从而真正实现一站式开发。 ...

December 24, 2020 · 1 min · jiezi

关于大数据:大数据开发Scala类型检查与模式匹配详解

0.前言类型检查和类型转换在每个语言外面都有对应实现,比方Java 中的instanceof 和 isInstance ,当然Scala语言也有,然而绝对于其余语言,Scala 为了简化开发,产生了弱小的模式匹配,其原理和Java中的switch-case很相似,然而其匹配能力更强,不仅仅能够匹配值,匹配类型,也能够进行类匹配,还能够进行前缀类匹配,而且在Spark源码中大量应用了模式匹配,另外的就是隐式转换,在另外一篇文章解说,本文从类型检查和类型转换动手,引入Scala常见的几种模式匹配及其应用。 1.类型查看要测试某个对象是否属于某个给定的类,能够用isInstanceOf办法。如果测试胜利,能够用asInstanceOf办法进行类型转换。 if(p.isInstanceOf[Employee]){//s的类型转换为Employeeval s = p.asInstanceOf[Employee]}类型转换次要有上面几个点要留神的: 如果p指向的是Employee类及其子类的对象,则p.isInstanceOf[Employee]将会胜利。如果p是null,则p.isInstanceOf[Employee]将返回false,且p.asInstanceOf[Employee]将返回null。如果p不是一个Employee,则p.asInstanceOf[Employee]将抛出异样。如果想要测试p指向的是一个Employee对象但又不是其子类,能够用:if(p.getClass == classOf[Employee])classOf办法定义在scala.Predef对象中,因而会被主动引入。不过,与类型检查和转换相比,模式匹配通常是更好的抉择。 p match{//将s作为Employee解决case s: Employee => ...//p不是Employee的状况case _ => ....}2.模式匹配Scala 中的模式匹配总结来说反对上面几种匹配:值匹配,类型匹配,汇合元素,元组匹配,有值或者无值匹配,上面从代码角度来看看这几种匹配如何应用,首先模式匹配的语法结构如下: 变量 match { case xx => 代码}和Java 的不同点,不须要指定break,即有break的成果,应用占位符_ 来代表默认值,另外match 和 if一样有返回值。 2.1 值匹配值匹配,即相似Java 中的整型,字符或者,字符串匹配。然而其之处守卫式匹配(能够了解为默认状况下的条件匹配) //字符匹配def main(args: Array[String]): Unit = { val charStr = '6' charStr match { case '+' => println("匹配上了加号") case '-' => println("匹配上了减号") case '*' => println("匹配上了乘号") case '/' => println("匹配上了除号") //留神:不满足以上所有状况,就执行上面的代码 case _ => println("都没有匹配上,我是默认值") }}//字符串匹配def main(args: Array[String]): Unit = { val arr = Array("hadoop", "zookeeper", "spark") val name = arr(Random.nextInt(arr.length)) name match { case "hadoop" => println("大数据分布式存储和计算框架...") case "zookeeper" => println("大数据分布式协调服务框架...") case "spark" => println("大数据分布式内存计算框架...") case _ => println("我不意识你...") }}//守卫式匹配def main(args: Array[String]): Unit = { //守卫式 val character = '*' val num = character match { case '+' => 1 case '-' => 2 case _ if character.equals('*') => 3 case _ => 4 } println(character + " " + num)} 2.2 类型匹配类型匹配是绝对于Java 来说的劣势点,Java是做不到的,匹配格局如下:case 变量名:类型 ,变量名能够用_ 来代替 ...

December 20, 2020 · 3 min · jiezi

关于大数据:大数据开发Spark调优常用手段

Spark调优spark调优常见伎俩,在生产中经常会遇到各种各样的问题,有事先起因,有事中起因,也有不标准起因,spark调优总结下来能够从上面几个点来调优。 1. 调配更多的资源调配更多的资源: 它是性能优化调优的王道,就是减少和调配更多的资源,这对于性能和速度上的晋升是不言而喻的, 基本上,在肯定范畴之内,减少资源与性能的晋升,是成正比的;写完了一个简单的spark作业之后,进行性能调优的时候,首先第一步,就是要来调节最优的资源配置; 在这个根底之上,如果说你的spark作业,可能调配的资源达到了你的能力范畴的顶端之后,无奈再调配更多的资源了,公司资源无限;那么才是思考去做前面的这些性能调优的点。相干问题:(1)调配哪些资源?(2)在哪里能够设置这些资源?(3)分析为什么调配这些资源之后,性能能够失去晋升?1.1 调配哪些资源executor-memory、executor-cores、driver-memory1.2 在哪里能够设置这些资源 在理论的生产环境中,提交spark工作时,应用spark-submit shell脚本,在外面调整对应的参数。 提交工作的脚本: spark-submit \ --master spark://node1:7077 \ --class com.hoult.WordCount \ --num-executors 3 \ 配置executor的数量 --driver-memory 1g \ 配置driver的内存(影响不大) --executor-memory 1g \ 配置每一个executor的内存大小 --executor-cores 3 \ 配置每一个executor的cpu个数 /export/servers/wordcount.jar 1.2 参数调节到多大,算是最大==Standalone模式==先计算出公司spark集群上的所有资源 每台节点的内存大小和cpu核数, 比方:一共有20台worker节点,每台节点8g内存,10个cpu。 理论工作在给定资源的时候,能够给20个executor、每个executor的内存8g、每个executor的应用的cpu个数10。==Yarn模式==先计算出yarn集群的所有大小,比方一共500g内存,100个cpu; 这个时候能够调配的最大资源,比方给定50个executor、每个executor的内存大小10g,每个executor应用的cpu个数为2。应用准则在资源比拟短缺的状况下,尽可能的应用更多的计算资源,尽量去调节到最大的大小1.3 为什么调大资源当前性能能够晋升--executor-memory--total-executor-cores 2. 进步并行度2.1 Spark的并行度指的是什么spark作业中,各个stage的task的数量,也就代表了spark作业在各个阶段stage的并行度! 当调配完所能调配的最大资源了,而后对应资源去调节程序的并行度,如果并行度没有与资源相匹配,那么导致你调配上来的资源都节约掉了。同时并行运行,还能够让每个task要解决的数量变少(很简略的原理。正当设置并行度,能够充分利用集群资源,缩小每个task解决数据量,而减少性能放慢运行速度。)2.2 如何进步并行度2.2.1 能够设置task的数量至多设置成与spark Application 的总cpu core 数量雷同。最现实状况,150个core,调配150task,一起运行,差不多同一时间运行结束官网举荐,task数量,设置成spark Application 总cpu core数量的2~3倍 。 比方150个cpu core ,根本设置task数量为300~500. 与现实状况不同的,有些task会运行快一点,比方50s就完了,有些task 可能会慢一点,要一分半才运行完,所以如果你的task数量,刚好设置的跟cpu core 数量雷同,可能会导致资源的节约。 因为比方150个task中10个先运行完了,残余140个还在运行,然而这个时候,就有10个cpu core闲暇进去了,导致节约。如果设置2~3倍,那么一个task运行完当前,另外一个task马上补上来,尽量让cpu core不要闲暇。同时尽量晋升spark运行效率和速度。晋升性能。2.2.2 如何设置task数量来进步并行度设置参数spark.default.parallelism 默认是没有值的,如果设置了值为10,它会在shuffle的过程才会起作用。 比方 val rdd2 = rdd1.reduceByKey(_+_) 此时rdd2的分区数就是10 能够通过在构建SparkConf对象的时候设置,例如: new SparkConf().set("spark.defalut.parallelism","500")2.2.3 给RDD从新设置partition的数量应用rdd.repartition 来从新分区,该办法会生成一个新的rdd,使其分区数变大。此时因为一个partition对应一个task,那么对应的task个数越多,通过这种形式也能够进步并行度。2.2.4 进步sparksql运行的task数量http://spark.apache.org/docs/2.3.3/sql-programming-guide.html ...

December 20, 2020 · 2 min · jiezi

关于大数据:大数据开发Scala-下划线的多种场景

1.简述Scala 的下划线在各种语法中简直都要插一脚,其目标是代表某些非凡场合或者简化代码,不用去想命名该怎么取。上面介绍几种下划线的应用场合 2. _ 有哪些应用形式2.1 初始化变量跟Java 相似,成员变量未初始化会给一个默认值,Scala中也一样,只能够初始化成员变量,然而须要利用_来特地阐明,要留神的是_如果初始化为null 要特地指明变量的类型,否则变量类型就是Null, 初始化只针对var 而不能是val, 其余状况应用变量相似和_即可达到初始化的成果 // _ 对应的默认值:整型默认值0;浮点型默认值0.0;String与援用类型,默认值null; Boolean默认值falseclass Student{ //String类型的默认值为null var name : String = _ var age: Int = _ var amount: Double = _ var mOrF: Boolean = _}2.2 办法转为函数严格的说:应用 val 定义的是函数(function),应用 def 定义的是办法(method)。二者在语义上的区别很小,在绝大少数状况下都能够不去理睬它们之间的区别,然而有时候有必要理解它们之间的转化,办法转换为函数应用上面的形式 scala> def f1 = ()=>{}scala> val f2 = f1 _ 2.3 导包相似Java 中的*,能够通过此形式导入包中的所有内容 //Scalaimport java.util._//Javaimport java.util.*; 2.4 高阶函数中省去变量名在Scala中的高阶函数如map , collection, count,sortWith, filter, reduce等,都需传入一个函数,函数的参数名字自身没有特地的用意,所以不用再起名上纠结,间接应用_来代替参数,然而要留神单次应用,和多个参数时候的问题 ...

December 20, 2020 · 1 min · jiezi

关于大数据:对于企业所离不开的大数据服务华为云出福利了

自从互联网呈现后,数据起源变得多种多样,于是本来企业所能领有的数据资料也飙升为大数据资料,这个时候,置信大部分企业都须要抉择适宜本人应用达到大数据场景,明天小编就和大家分享一下不同的场景须要应用什么大数据服务,凑巧最近是华为云的“12.12.会员节”,顺带小编和大家分享一下其中的优惠活动~ 面对须要进行用户行为剖析,进步 APP 点击率的企业,华为云推出了 MapReduce 服务,针对浏览行为抽取特色,汇总为用户剖析,为用户进行更为精准的信息举荐。 对于须要数据可视化大屏的企业,华为云推出了数据湖摸索DLI 和数据可视化DLV 的产品。提供了 100+ 可视化组件和素材,同时反对叠加数据荡涤,让数据更为简洁。无代码状况下对于企业操作要求也不高,企业能纵情进行可视化拖拽,让数据展现高深莫测。 有 BI 剖析需要的企业,华为云能针对企业数据,进行迷信的计算剖析,提供企业决策依据,不便企业的商业布局、决策执行,在这个“12.12会员节”,华为云推出了冰点 4.0 折优惠,一下为企业省了 1W+,有需要的企业不要错过呀! 须要日志剖析的企业也千万不要错过华为云本次流动,5.0 折的优惠下,云搜寻服务CSS 让数据变得清晰,帮忙客户开掘日志数据的潜在价值,提供数据分析计划,让客户从数据中看法则,从剖析中看倒退。 以上就是小编明天的分享,更多精品尽在华为云“12.12会员节”人工智能+大数据专场,会场链接在这里:http://t.cn/A6qxx3Im,有大数据需要的敌人们千万不要错过呀!

December 18, 2020 · 1 min · jiezi

关于大数据:数据系统架构7数据智能

7.数据智能一、序在有了实时离线的数据之后,咱们终于能够应用数据进行业务剖析了,根本解决了数据what阶段。对于一个指标咱们能够清晰的在数据上发现数据的变动,反馈业务的变动状况。然而往往业务是简单的,常常会有如下这样的疑难: 场景1:明天的领取订单减少了,到底是哪个业务维度、品类维度、城市维度所带来的增长呢?场景2:以当初的用户增长率、订单增长率,将来的某段时间咱们用户量会达到多少?订单是多少? 针对场景1的离线场景,咱们开发了一套离线根因剖析零碎,来帮忙用户疾速的定位到造成数据变动的根本原因,进步数据分析的效率。 针对场景2的实时场景,咱们开发了一套基于时序预测的零碎,依据以往的历史数据实时预测将来的数据,并反对预测数据与实在数据实时进行比照剖析,用来判断数据是否存在异常情况等。 接下来将别离大抵介绍一下,离线根因剖析、实时预测零碎的设计原理与一些实际尝试的教训,来解决数据WHY的问题。 二、离线根因剖析离线根因剖析的办法很多,能够做的很简单也能够做的很简略,比方: 1、咱们简略计算每个维度的变化率,依据变化率倒序排序找出指标变动具体是受哪个维度的影响;2、基于决策树等机器学习模型来疾速的剖析进去引起数据变动的最大的维度组合; 而咱们采纳了一个基于基尼系数来判断维度变动状况的形式来进行维度的剖析,首先咱们先理解一下什么是基尼系数,以下解释来自百度。 基尼系数(英文:Gini index、Gini Coefficient)是指国内上通用的、用以掂量一个国家或地区居民收入差距的罕用指标。基尼系数最大为“1”,最小等于“0”。基尼系数越靠近0表明支出调配越是趋势平等。国际惯例把0.2以下视为支出相对均匀,0.2-0.3视为支出比拟均匀;0.3-0.4视为支出绝对正当;0.4-0.5视为支出差距较大,当基尼系数达到0.5以上时,则示意支出迥异。 基尼指数最早由意大利统计与社会学家Corrado Gini在1912年提出。 基尼系数是依据洛伦兹曲线判断支出调配偏心水平的指标,在根因剖析的我的项目里咱们加以批改,用于掂量各维度内维度值变动的偏心水平。在支出调配的情景下,应用用户数占比作为X轴,支出占比作为Y轴。而在本我的项目中,应用维度值占比作为X轴,变动值占比作为Y轴。 整体剖析步骤如下: 1.数据读取从元数据信息管理系统中获取指定指标信息,从而拿到对应的以后工夫和比照工夫数据 2.生成维度值比和变动值比维度值比 = (以后值+对比值)/总值,总值为每一个维度的以后值和对比值的总和变动值比 = (以后值-对比值)/变动总值,变动总值为每一个维度的变动值之和 3.依据变动值比倒排依据基尼系数的结构形式,须要将每个群体的支出占比从小到大排序,最终能力结构出洛伦兹曲线。所以在本我的项目中,将变动值占比从小达到排序,最终取得已排序的变动值比的数组,以及对应的维度值比数组。 4.基尼系数计算计算基于极限原理,在X轴距离足够小的时候,更趋近于实在值。计算结果比实在值偏小,X轴距离越大,偏差水平越大。其中波及到一些非凡异常情况下异样值的解决,来更加正当的计算解决维度对应的基尼系数。 依据各个维度的基尼系数,咱们能够很容易得出维度对变动的影响,而后再依据各个维度下的值的变化率等其余指标来找出维度下具体哪个维度影响的大小。如下图,咱们确定维度C下的具体值1影响最大,怎么找出其余维度的组合呢,就是限度维度C的值等于值1的状况下,对其余维度进行剖析,用了找出维度与维度组合的最终起因。 整体上该计划适宜多维状况下的根因剖析,最终成果根本满足日常剖析需要。 三、实时预测告警 场景目前有很多实时指标用于监控业务状态,如何精确、及时地发现实时数据异样,并剖析异样起因,是本我的项目须要解决的问题。 及时:在数据出现异常时,尽快发现异常,可能最大水平减小损失。精确:频繁误报会使相干人员对告警失去信赖,从而不能及时处理。异样识别方法在异样的断定中,最罕用的就是应用同比或环比,但这两种形式都有一个显著的缺点。 同比:以后值和上一周期的值进行比拟,如果当天数据整体上涨或降落,那么会有十分频繁的告警。环比:以后值和上一个值进行比拟,如果数据呈现周期性稳定,也会呈现误报,并且环比变动最大的,也不肯定就是异样的数据。同比 + 环比:即使独自应用同比或环比都不行,那么把两个联合起来一起应用是否能够呢?实践上来说是可能解决肯定问题的,然而加权均匀的权重如何确定?这也是一个难以获得精确后果的问题。在同比或环比的判断中,仅应用了前一个点或前一个周期点两个工夫点的数据,并没有充分利用整个工夫序列的变化趋势,所以为了解决这类问题,咱们采纳工夫序列预测算法三次指数平滑来预测数据,并与实在值进行比拟来达到异样告警的目标。 时序预测-三次指数平滑应用时序预测模型之前,咱们要依据本人的数据特定来抉择适宜的模型,咱们能够先察看数据是否有趋势性、周期性等。 Hot-Winters是指数平滑法,属于和谐均匀的一种形式。历史数据工夫越久,对以后预测值的影响比重呈指数递加,但所有的历史数据都会对以后预测值产生影响,这样就可能利用整个工夫序列的变化趋势。 实际上咱们只须要依据业务调整 三个参数,使整体预测数据与实在数据的均方差最小即可,最终咱们的值别离取(0.8,0.2,0.2),能够依据预测数据的个性,应用不必的参数值来预测数据。 预测区间与异样判断失去预测值与实在值之后,咱们须要判断数据是否异样。因为预测数值存在肯定的误差,所以咱们容许实在值在肯定范畴内稳定,因为预测区间基于误差值取得,当误差较小的时候,预测区间很小,会造成肯定水平的误报。依据对预测后果进行剖析,当计算出来的误差预测区间为[a*实在值, b*实在值] 时,最终抉择的误差预测区间为[min(-0.06,a)*实在值, max(0.06,b)*实在值],来放大误差较小状况下的预测区间,缩小误报的状况。 在发现数据异样之后,咱们须要实时剖析进去实时数据异样的起因,这里咱们预设了一些指标的剖析维度,采纳同比、环比等简略的形式疾速剖析可能的起因。 总结基于以上实践,咱们大抵解决了离线的根因剖析与实时数据异样告警剖析。每个公司业务和资源的不同能够采纳不同的分析方法,能够依据资源应用简略的形式 ,也能够应用机器学习等等绝对简单的剖析方法。具体实现并不是越简单越好,简略的形式办法也可能比拟精确高效。 当前可能有更多的数据智能化场景,整体都离不开降本增效,晋升数据应用效率,大道至简。 上一篇 《数据系统架构-6.BI数据展现平台》

December 17, 2020 · 1 min · jiezi

关于大数据:抖音快手数据采集短视频监测大屏

抖音、快手数据采集,短视频监测大屏本文介绍在数据采集过程中不可或缺的一枚神器——数据采集监控大屏,如果想理解数据采集过程中的一些技术,欢送查阅我的另外几篇文章,文末附有两篇数据采集文章的链接。先看上面三张图:三张图,不同的时间段,对应的日采集数据量别离在10万,30万,110万,一直刷新本人创下的单日采集数据量记录,可能有人会好奇,为什么最初两天采集到的数据量有暴增的趋势,偷偷通知你们,这两天是新架构设计计划实现之后,开始测试的两天,第一天轻松达到了53W数据,超过之前极大值近两倍,而第二天更是冲破了100W,所以,后面的凹槽,就是新架构开发测试的工夫了。图片出自数据采集监控大屏,残缺图如下:通过以上截图能够得悉,目前数据平台总共采集了近700W数据,而最多一天采集数据达到了110W以上,日解决任务量达到30W以上,还能查看到不同业务通道采集到的不同数据的数据量。这个大屏建设的初衷就是为了监控数据采集平台各方面的性能,在采集平台性能优化的同时,监控大屏也在一直优化本身的性能,占用越来越少的平台资源,其中最大的优化算是每日采集数据量统计图。而随着数据量的一直减少,不仅平台压力越来越大,监控大屏性能也越来越差,统计到的阻塞数量也越来越多,这个阻塞数目,监控的是内存中线程的阻塞数,如果这个数量越来越多,最间接的结果就是死机。而每天的数据量还在减少,业务也在扩充,硬件资源就那么多,急需寻找新的解决办法,在这种场景下,数据采集平台2.0架构设计横空出世,解决所有阻塞问题,而且将日采集数据量从30万晋升到110万,理论值从50万晋升到160万。数据采集平台2.0架构设计为未来的数据暴增预留了地位,反对分布式的横向扩大,这样,随着当前数据的增长,降级就变得非常简单了,接下来本篇文章次要介绍这款监控大屏。 监控大屏简介监控大屏次要使用数据可视化技术,对采集平台进行监控,定时刷新平台运行数据,通过这款监控大屏,已经发现了平台的一个死锁问题,过后问题十分荫蔽,平台没有报错,数据还在减少,通过大屏,意识到数据增长变得有一点慢了,有几张表没入库数据,起初开始排查,发现了平台死锁问题。如果该问题没被发现,后续造成的损失将变得不可管制。监控大屏性能如下:1.每日采集数据量:统计平台近期,每天采集到的数据量,以此来判断平台在一段时间内的健康状况和负载状况。可依据该指标制订性能测试计划。2.各主机执行工作统计:统计以后小时,各台机器执行工作的数量,以此来判断各个机器的性能以及资源配置。3.全网数据量:统计整个平台实时数据量,以此来判断平台压力,确定是否须要降级新架构。4.以后工夫采集数据量:统计以后小时,每张表减少的数据量,对每一类数据是否正确入库做监控。5.全网数据分布:统计平台所有表的数据量,以此来判断各表压力,为后续分库分表提供根据。6.阻塞数统计:统计个主机中,各个程序阻塞的线程数,以此来判断各机器的性能,阻塞越多,内存占用越多,最终将导致机器宕机。现实状况是,此处为空白,即程序运行不阻塞。7.各类工作执行数:统计不同品种工作,不同状态工作的数量,以此来判断平台执行工作的速度以及正确率。8.采集速度监控,采纳仪表盘监控以后实时的数据采集速度,以及监控过程中呈现的采集速度峰值,以此来判断平台实时的效率。通过以上八局部实时数据,即可监控整个数据采集平台运行状况。目前该大屏运行超过两个月,以下列举几个常见问题案例: 案例1如下图所示,待执行工作有1440个,正在执行工作16个,主机执行工作统计图为空,且数据超过1分钟未刷新。解析:工作无奈执行,以后小时曾经没有工作完结起因及解决方案:1.工作简单,短时间内无奈执行实现(简直不可能有这种状况)2.程序挂起,无奈执行工作。须要重启程序3.内存不足,程序主动完结。须要重启程序4.机器宕机。须要重启机器。 案例2如下图,抛弃工作暴增。解析:大量工作已达到重试最大次数,或者呈现大量已重置用户起因及解决方案:1.呈现大量已重置用户。查看是否真的呈现了大量重置用户,如的确如此,可不解决,平台会定时解决该类数据,只需期待20分钟即可。2.接口被官网反爬,采集不到数据了。须要降级采集代码,优化采集策略。 案例3如下图,以后工夫采集数据量中,只有一两个表采集到数据且长时间没有新表退出。解析:其余表在以后工夫都没有数据入库起因及解决方案:1.以后为定向采集工夫,只采集指定类型的数据。失常,无需解决。2.其余类型的数据解析过程出错。检查数据,查看是否会有超长数据,空数据呈现,导致解析失败。如:后期采集到重置用户时,导致解析器报错,现已适配。3.历史数据中曾经存在了采集过的数据,数据没有新增。失常,无需解决。4.个别表锁表。须要排查数据库,杀死死锁过程。 案例4如下图,各机器整体阻塞较高解析:该局部统计每个机器下面每一类程序的阻塞状况起因及解决方案:1.同一工作阻塞较高。该工作代码性能有余,须要降级代码性能2.同一机器不同工作阻塞较高。该机器硬件有余,须要缩小任务量或者降级机器性能。 案例5如下图,机器解决工作不均匀,有机器“偷懒”。解析:该机器执行工作绝对其余机器显著偏少起因及解决方案:1.机器硬件性能较其余机器低。降级机器,应用雷同配置机器。2.该机器解决工作较简单。优化取工作策略,不同类型工作随机获取3.该机器的过程假死。须要重启该机器上运行的过程。 案例6大屏数据更新失常,解决工作失常,然而数据增量较慢。解析:数据增长较慢,然而解决工作速度失常,应该狐疑是否是因为丢数据引起起因及解决方案:1.有数据未解析,间接跳过。须要排查未解决数据的类型。2.锁表。须要手动开释锁,批改代码,所有的写操作均用主键ID以上为这两个多月工夫中,见过的一些常见案例,此类问题均由该监控大屏抛出,并以解决。 更多抖音,快手,小红书数据实时采集接口,请查看文档: TiToData

December 17, 2020 · 1 min · jiezi

关于大数据:一文带你彻底了解大数据处理引擎Flink内存管理

摘要: Flink是jvm之上的大数据处理引擎。Flink是jvm之上的大数据处理引擎,jvm存在java对象存储密度低、full gc时耗费性能,gc存在stw的问题,同时omm时会影响稳定性。同时针对频繁序列化和反序列化问题flink应用堆内堆外内存能够间接在一些场景下操作二进制数据,缩小序列化反序列化的耗费。同时基于大数据流式解决的特点,flink定制了本人的一套序列化框架。flink也会基于cpu L1 L2 L3高速缓存的机制以及局部性原理,设计应用缓存敌对的数据结构。flink内存治理和spark的tungsten的内存治理的出发点很类似。 内存模型Flink能够应用堆内和堆外内存,内存模型如图所示: flink应用内存划分为堆内内存和堆外内存。依照用处能够划分为task所用内存,network memory、managed memory、以及framework所用内存,其中task network managed所用内存计入slot内存。framework为taskmanager专用。 堆内内存蕴含用户代码所用内存、heapstatebackend、框架执行所用内存。 堆外内存是未经jvm虚拟化的内存,间接映射到操作系统的内存地址,堆外内存蕴含框架执行所用内存,jvm堆外内存、Direct、native等。 Direct memory内存可用于网络传输缓冲。network memory属于direct memory的领域,flink能够借助于此进行zero copy,从而缩小内核态到用户态copy次数,从而进行更高效的io操作。 jvm metaspace寄存jvm加载的类的元数据,加载的类越多,须要的空间越大,overhead用于jvm的其余开销,如native memory、code cache、thread stack等。 Managed Memory次要用于RocksDBStateBackend和批处理算子,也属于native memory的领域,其中rocksdbstatebackend对应rocksdb,rocksdb基于lsm数据结构实现,每个state对应一个列族,占有独立的writebuffer,rocksdb占用native内存大小为 blockCahe + writebufferNum * writeBuffer + index ,同时堆外内存是过程之间共享的,jvm虚拟化大量heap内存耗时较久,应用堆外内存的话能够无效的防止该环节。但堆外内存也有肯定的弊病,即监控调试应用绝对简单,对于生命周期较短的segment应用堆内内存开销更低,flink在一些状况下,间接操作二进制数据,防止一些反序列化带来的开销。如果须要解决的数据超出了内存限度,则会将局部数据存储到硬盘上。 内存治理相似于OS中的page机制,flink模仿了操作系统的机制,通过page来治理内存,flink对应page的数据结构为dataview和MemorySegment,memorysegment是flink内存调配的最小单位,默认32kb,其能够在堆上也能够在堆外,flink通过MemorySegment的数据结构来拜访堆内堆外内存,借助于flink序列化机制(序列化机制会在下一大节解说),memorysegment提供了对二进制数据的读取和写入的办法,flink应用datainputview和dataoutputview进行memorysegment的二进制的读取和写入,flink能够通过HeapMemorySegment 治理堆内内存,通过HybridMemorySegment来治理堆内和堆外内存,MemorySegment治理jvm堆内存时,其定义一个字节数组的援用指向内存端,基于该外部字节数组的援用进行操作的HeapMemorySegment。 public abstract class MemorySegment { /** * The heap byte array object relative to which we access the memory. * 如果为堆内存,则指向拜访的内存的援用,否则若内存为非堆内存,则为null * <p>Is non-<tt>null</tt> if the memory is on the heap, and is <tt>null</tt>, if the memory is * off the heap. If we have this buffer, we must never void this reference, or the memory * segment will point to undefined addresses outside the heap and may in out-of-order execution * cases cause segmentation faults. */protected final byte[] heapMemory; /** * The address to the data, relative to the heap memory byte array. If the heap memory byte * array is <tt>null</tt>, this becomes an absolute memory address outside the heap. * 字节数组对应的绝对地址 */protected long address; } ...

December 16, 2020 · 6 min · jiezi

关于大数据:抖音数据采集教程高级版

上一篇文章讲了如何对采集的数据进行抓包和解析,本次次要解说如何应用自动化工具,实现自动化数据采集。如果想理解抓包和解析局部的内容,能够查阅我的上一篇文章《数据平台初试(技术篇)——抖音数据采集(高级版)》,文末附有上篇文章的传送门。本次用到的工具:挪动端自动化工具Appium,夜神模拟器(也能够用真机代替),adb工具。 运行环境筹备工作开始进入数据采集的筹备工作,在上一篇文章的根底上,搭建自动化环境,首先须要配置android-sdk,装置教程可参考如下链接,最初须要验证adb命令是否可用,在命令行窗口运行adb version,呈现版本号信息,阐明adb工具可用,android sdk下载及装置教程请参阅如下链接: https://www.cnblogs.com/woniu123/p/10755262.html配置好android-sdk后,就能够装置Appium了,下载地址如下,此处咱们抉择appium-desktop-setup-1.9.0.exe版本: https://github.com/appium/appium-desktop/releases/download/v1.9.0/appium-desktop-setup-1.9.0.exe下载好后根本是下一步装置,装置实现后启动利用,呈现如下窗口证实装置胜利:点击 “Start Server V 1.9.0”启动服务,呈现如下页面则证实启动胜利,端口为4723:关上之前配置好的模拟器,此时在命令行窗口运行adb devices,会呈现连贯的模拟器设施,证实运行环境筹备实现接下来是运行环境配置,点击appium的 Start Inspector Session须要配置如下启动参数: { "platformName": "Android", "platformVersion": "5.1.1", "deviceName": "127.0.0.1:62001", "appPackage": "com.ss.android.ugc.aweme", "appActivity": "com.ss.android.ugc.aweme.main.MainActivity", "noReset": true}platformName:模拟器运行的平台,填入AndroidplatformVersion:查看模拟器的安卓版本,填入即可deviceName:此处为运行adb devices命令失去的设施,以后模拟器为127.0.0.1:62001appPackage和appActivity:抖音app的包名和启动办法名,可通过android-sdk\build-tools\29.0.2上面的aapt.exe工具取得配置好后,点击Star Session,看到模拟器启动抖音app则证实环境配置无误。 业务场景阐明有了运行环境,接下来介绍下本次的需要,关上模拟器中装置的抖音app,首先下滑刷新视频,再进入用户主页,别离对主页数据,关注数据,粉丝数据,作品和喜爱页签进行采集。appium须要做的对应操作如下:1.下滑刷新视频2.左滑进入用户主页3.点击关注按钮4.开始下滑关注列表,直到呈现“临时没有更多了”5.返回用户主页6.点击粉丝按钮7.开始下滑粉丝列表,直到呈现“临时没有更多了”8.返回用户主页9.点击作品页签10.下滑作品视频列表,直到呈现“临时没有更多了”11.点击喜爱页签12.下滑喜爱视频列表,直到呈现“临时没有更多了”13.返回视频页面,反复步骤1 代码筹备装置python的Appium客户端: pip install Appium-Python-Client筹备撸代码。1.启动app device_name = '127.0.0.1:62001'device_port = '4723'desired_caps = { "platformName": "Android", "platformVersion": "5.1.1", "deviceName": device_name, "appPackage": "com.ss.android.ugc.aweme", "appActivity": "com.ss.android.ugc.aweme.main.MainActivity", "noReset": True, "unicodeKeyboard": True, "resetKeyboard": True}device_driver = webdriver.Remote('http://127.0.0.1:' + str(device_port) + '/wd/hub', desired_caps)期待启动好了app之后,咱们开始解决业务1,下滑刷新视频,此处调用本人封装的滑动办法: swipe_page(device_driver, 0.5, 0.25, 0.5, 0.75)def swipe_page(driver, x1, y1, x2, y2): screen = AppiumOprationPage.get_size(driver) screen_x1 = int(screen[0] * x1) screen_y1 = int(screen[1] * y1) screen_x2 = int(screen[0] * x2) screen_y2 = int(screen[1] * y2) driver.swipe(screen_x1, screen_y1, screen_x2, screen_y2)期待视频刷新进去后执行业务2,疾速左滑进入用户主页: ...

December 16, 2020 · 1 min · jiezi

关于大数据:抖音数据采集教程初级版

这段时间始终在解决数据采集的问题,目前平台数据采集趋于稳定,能够抽出工夫来整顿一下近期的成绩,顺便介绍一些近期用到的技术。本篇文章偏差技术,须要读者有肯定的技术根底,次要介绍数据采集过程中用到的神器mitmproxy,以及平台的一些技术设计。以下是数据采集整体的设计,右边是客户机,在外面搁置了不同的采集器,采集器发动申请之后,通过mitmproxy拜访抖音,等数据回传之后,通过两头的解析器对数据进行解析,最初分门别类的存储到数据库中,为了晋升性能,在两头退出了缓存,把采集器和解析器分隔开,两个模块之间工作互不影响,能够最大限度的把数据入库,下图为第一代架构设计,后续会有一篇文章介绍平台架构设计的三代演化史。 筹备工作开始进入数据采集的筹备工作,第一步天然是环境搭建,本次咱们在windows环境下,采纳python3.6.6环境,抓包和代理工具是mitmproxy,也能够应用Fiddler抓包,采纳夜神模拟器来模仿安卓运行环境(也能够用真机),这次次要通过手动滑动app来抓取数据,下次介绍采纳Appium自动化工具,实现数据采集的全自动(解放双手)。1、装置python3.6.6环境,装置过程可自行百度,须要留神的是,centos7自带的是python2.7,须要降级到python3.6.6环境,降级之前次要先装置ssl模块,否则降级好的版本无法访问https的申请。2、装置mitmproxy,装置好python环境后,在命令行执行pip install mitmproxy装置mitmproxy,注:windows下只有mitmdump和mitmweb能够应用,装置好后在命令行输出mitmdump即可启动,默认启动的代理端口为8080。3、装置夜神模拟器,能够在官网下载安装包,装置教程自行百度即可,根本都是下一步。装置好夜神模拟器之后,须要对夜神模拟器进行配置。首先须要设置模拟器的网络为手动代理,IP地址为windows的IP,端口为mitmproxy的代理端口。4、接下来是证书的装置,关上模拟器中的浏览器,输出地址mitm.it,抉择对应版本的证书,装置好后,就能够进行抓包了。5、装置app,app安装包能够到官网下载,而后通过拖拽进模拟器就能够装置,或者在利用市场进行装置。至此,本次数据采集环境就全副搭建实现。 数据接口分析 抓包搭建好环境之后就开始对抖音app进行数据抓包,剖析出每个性能所应用的接口,本次以采集视频数据接口为例介绍。敞开之前关上的mitmdump,从新关上mitmweb工具,mitmweb是一个图形化的版本,就不必对着黑框框找了,如下图:启动之后关上模拟器的抖音app,能够看到曾经有数据包解析进去了,而后进入用户主页,开始下滑视频,在数据包列表中能够找到申请视频数据的接口https://aweme.snssdk.com/aweme/v1/aweme/post/能够在左边看到接口的申请数据和响应数据,咱们将响应数据复制进去,进入下一步解析。 数据解析通过mitmproxy和python代码的联合,咱们就能够在代码中获取到mitmproxy中的数据包,进而能够依照需要来解决。新建一个test.py文件,外面放两个办法: def request(flow): passdef response(flow): pass见名知意,这两个办法,一个是在申请的时候执行的,一个是在响应的时候执行,而数据包则存在于flow当中。通过flow.request.url能够获取到申请url,flow.request.headers能够获取到申请头信息,flow.response.text中的就是响应的数据了。 def response(flow): if str(flow.request.url).startswith("https://aweme.snssdk.com/aweme/v1/aweme/post/"): index_response_dict = json.loads(flow.response.text) aweme_list = index_response_dict.get('aweme_list') if aweme_list: for aweme in aweme_list: print(aweme)这个aweme就是一个残缺的视频数据了,能够依据须要提取外面的信息,这里提取局部信息做介绍。 "statistics":{ "aweme_id":"6765058962225204493", "comment_count":24, "digg_count":1465, "download_count":1, "play_count":0, "share_count":3, "forward_count":0, "lose_count":0, "lose_comment_count":0}statistics信息就是这个视频的点赞,评论,下载,转发的数据。share_url为视频的分享地址,通过这个地址,能够在PC端观看抖音分享的视频,也能够通过这个链接解析到无水印视频。play_addr为视频的播放信息,其中的url_list即为无水印地址,不过目前官网做了解决,这个地址无奈间接播放,也有工夫限度,超时之后链接就生效了。有了这个aweme,就能够把外面的信息解析进去,保留到本人的数据库,或者下载无水印视频,保留到本人电脑了。写好代码之后,保留test.py文件,cmd进入命令行,进入到保留test.py文件目录下,在命令行输出mitmdump -s test.py,mitmdump就启动了,此时关上app,开始滑动模拟器,进入用户主页:开始一直下滑,test.py文件就能够把抓取到的视频数据全副解析进去了,以下是我截取的局部数据信息:视频信息:视频统计数据:视频评论数据:无水印视频下载:本次介绍就到这里完结了,次要是使用mitmdump配合python代码来解析数据,下次讲讲怎么使用appium,怎么实现自动化滑动模拟器,实现这个程序的全自动抓取视频数据,以及把采集下来的数据进行解决之后,失去的一些成绩展现。 更多抖音,快手,小红书数据实时采集接口,请查看文档: TiToData

December 16, 2020 · 1 min · jiezi

关于大数据:京东智联云与CDA携手-共同打造电商领域数字化人才认证标准

在新型市场环境下无论是传统企业,还是新型互联网企业,电商无疑曾经成为一个重要的渠道抓手,现在的视频内容+电商的深度交融,用户对视频内容+电商的接受度一直晋升,急需电商行业证书来造就和标准电商行业人才。考试认证将疏导从业者如何从事电商行业人才,通过实在的电商案例,取得实战经验。 CDA ( Certified Data Analyst ) 亦称“ CDA 数据分析师 ” ,指在互联网、批发、金融、电信、医学、游览等行业专门从事数据的采集、荡涤、解决、剖析并能制作业务报告、提供决策的新型数据分析人才。CDA秉承着总结凝练先进的商业数据分析实际为使命,清晰各类数据分析从业者的常识体系为职责,旨在增强寰球范畴内正规化、科学化、专业化的大数据及数据分析人才队伍建设,进一步晋升数据分析师的职业素养与能力程度,促成数据分析行业的高质量继续疾速倒退。 CDA 从第一届考试起,就秉持「偏心、公正、公开」的准则,打造高含金量人才认证规范,CDA 认证规范适应中国大数据行业的发展趋势,合乎企业对数字化人才的新要求,与会计行业的CPA,金融行业的CFA一样,CDA 也被泛滥优良企业写入职位招聘阐明、举荐员工报考,市场的共识推动 CDA 报考人数逐年攀升,累积考生超万人。 京东作为国内电商巨头企业,数年来积攒了大量的电商业务案例和实践经验,京东智联云为团体提供全方位的技术服务支撑体系,其中为电商行业实现技术赋能、用人才驱动行业后退是一大重点方向。 令人兴奋的是,京东智联云与 CDA 强强联合 在日前实现“电商畛域数字化人才认证”签约 独特打造电商畛域数字化人才认证规范 携手为电商畛域输送更多 优良数据分析和数据挖掘人才 推送优质电商人才计划 晋升企业人才竞争力 - 联结劣势: 将京东所专精的电商畛域联合 CDA 的王牌业务数据分析,打造业界顶尖认证及培训零碎; - 培训特点: 突破授课限度,线上直播课、线下面授自由选择,共建沉迷式训练营造就模式;依靠京东实在我的项目数据、实战案例、技术大咖,_开设电商数据分析师我的项目实战训练营_,课程基于 CDA 数据分析 EDIT 数字化认证考试模型研发,无门槛造就全畛域电商行业数据分析师。 - 认证亮点: 报名条件不设限,人人都可考,随报随考。网上约考高效便捷,考试试题将由 CDA 数据分析师联结京东数据科学家独特打造,既要考查电商执业到的和数据分析专业知识,也更重视电商畛域实际操作教训,共铸认证含金量。 点击 实战训练营  理解更多 身处飞速迭代的技术圈,面对横蛮成长的新技术新利用,不与时代脱节是开发者最关怀的问题,一直地充电成为技术开发者实现自我价值的必要动作,除了此次电商畛域数字化人才认证,京东智联云还推出了面向应用京东智联云大数据产品的业余技术认证—— 京东智联云大数据工程师认证, 次要波及京东智联云的大数据计算、存储、开发平台,数据利用类的产品,是对学员把握京东智联云大数据产品技术技能程度的全面测验和能力认证。  感兴趣的小伙伴能够点击 【 浏览原文 】 理解更多认证培训信息。 举荐浏览: 赋能开发者 | 京东智联云培训与认证课程人才培养再次降级京东智联云培训与认证推出大数据课程欢送点击【京东智联云】,理解开发者社区 更多精彩技术实际与独家干货解析 欢送关注【京东智联云开发者】公众号

December 15, 2020 · 1 min · jiezi

关于大数据:抖音爬虫教程python爬虫采集反爬策略

抖音爬虫教程,python爬虫采集反爬策略一、爬虫与反爬简介爬虫就是咱们利用某种程序代替人工批量读取、获取网站上的材料信息。而反爬则是跟爬虫的对立面,是全力以赴阻止非人为的采集网站信息,二者相生相克,水火不容,到目前为止大部分的网站都还是能够轻易的爬取材料信息。爬虫想要绕过被反的策略就是尽可能的让服务器人你不是机器程序,所以在程序中就要把本人伪装成浏览器拜访网站,这能够极大水平升高被反的概率,那如何做到假装浏览器呢? 1.能够应用申请头(headers)来拆穿本人,其中最罕用的就是User Agent(中文名为用户代理),是Http协定中的一部分,属于头域的组成部分,User Agent也简称 UA 。它是一个非凡字符串头,是一种向拜访网站提供你所应用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识;示意以后拜访服务器的身份信息,如果同一个身份过于频繁的拜访服务器会被辨认为机器身份,受到反爬的打击,所以须要频繁的更改User-Agent信息;个别User-Agent字段包含以下几个信息:浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识 版本信息;2.应用不同的User-Agent来躲避反爬策略比方: Accept:客户端反对的数据类型,用逗号隔开,是有程序的,分号后面是主类型,分号后是子类型;Accept-Encoding:指定浏览器能够反对的web服务器返回内容压缩编码类型;Accept-Language:浏览器可承受的自然语言的类型;Connection:设置HTTP连贯的长久化,通常都是Keep-Alive;Host:服务器的域名或IP地址,如果不是通用端口,还蕴含该端口号;Referer:指以后申请的URL是在什么地址援用的;user_agent_list = [ "Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50", "Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11", "Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11", "Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11", "Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10", "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10", "Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10", "Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1", "Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0", "Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16", "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14", "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14", "Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02", "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00", "Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00", "Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00", "Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00", "Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0", "Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62", "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52", "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51", "Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50",]referer_list = ["https://www.test.com/", "https://www.baidu.com/"]获取随机数,即每次采集都会依据随机数提取随机用户代理、援用地址(注:若有多个页面循环采集,最好采集完单个期待个几秒钟再持续采集,减小服务器的压力。): ...

December 15, 2020 · 2 min · jiezi

关于大数据:抖音数据采集教程最全python库selenium自动化使用

抖音数据采集教程,最全python库selenium自动化应用一、装置seleniumpip install Selenium二、初始化浏览器Chrome 是初始化谷歌浏览器Firefox 是初始化火狐浏览器Edge 是初始化IE浏览器PhantomJS 是一个无界面浏览器。from selenium import webdriver driver = webdriver.Chrome()三、设置浏览器大小 maximize_window 最大化窗口set_window_size 自定义窗口大小from selenium import webdriver driver = webdriver.Chrome()driver.maximize_window()四、拜访页面from selenium import webdriver driver = webdriver.Chrome() driver.get('https://www.baidu.com')五、定位元素定位元素的根本办法如下定位一个元素定位多个元素解释find_element_by_idfind_elements_by_id通过元素id定位find_element_by_namefind_elements_by_name通过元素name定位find_element_by_xpathfind_elements_by_xpath通过xpath表达式定位find_element_by_link_textfind_elements_by_link_tex通过残缺超链接定位find_element_by_partial_link_textfind_elements_by_partial_link_text通过局部链接定位find_element_by_tag_namefind_elements_by_tag_name通过标签定位find_element_by_class_namefind_elements_by_class_name通过类名进行定位find_elements_by_css_selectorfind_elements_by_css_selector通过css选择器进行定位实例演示:  找到百度首页的输入框from selenium import webdriver driver = webdriver.Chrome()driver.get('https://www.baidu.com')driver.find_element_by_id('kw')六、定位元素的另一种写法需引入By模块from selenium import webdriverfrom selenium.webdriver.common.by import By driver = webdriver.Chrome()driver.get('https://www.baidu.com')driver.find_element(By.ID, 'kw')七、元素交互办法解释click()点击某个元素send_keys(输出的值)模仿输出clear()革除操作submit()提交表单get_attribute(name)获取元素的属性值location获取元素的地位text获取元素的文本值size获取元素的大小id获取元素的id值tag_name获取元素的标签名实例演示: 在百度输入框中输出我是autofelix,并点击搜寻按钮from selenium import webdriver driver = webdriver.Chrome()driver.get('https://www.baidu.com')driver.find_element_by_id('kw').send_keys('我是autofelix')driver.find_element_by_id('su').click()八、执行jsfrom selenium import webdriver driver = webdriver.Chrome()driver.maximize_window() driver.get('https://www.baidu.com') js_sql = ''' document.getElementById('kw').value = '我是autofelix''''driver.execute_script(js_sql)九、Frame操作网页中frame的话,须要执行切入切出操作switch_to.from(子iframe的id名称) 切入switch_to.parent_frame(父iframe的id名称) 切出from selenium import webdriver driver = webdriver.Chrome()driver.maximize_window() driver.get('https://www.baidu.com') //这个网址并没有iframe,我臆测有,你们看看就行driver.switch_to.frame('我臆测进去的iframe')十、cookie的操作办法阐明delete_all_cookies()删除以后页面所有cookiesget_cookie(name)获取指定cookie值get_cookies()获取以后页面所有cookies值add_cookie()设置cookie值from selenium import webdriver driver = webdriver.Chrome()driver.maximize_window() driver.get('https://www.baidu.com') driver.delete_all_cookies()driver.add_cookie({'name': 'name', 'domain': '.baidu.com', 'value': 'autofelix'})十一、选项卡治理办法解释window_handles保留所有选项卡的元组switch_to.window()切换选项卡from selenium import webdriver driver = webdriver.Chrome()driver.maximize_window() driver.get('https://www.baidu.com')driver.get('https://www.taobao.com') driver.switch_to.window(driver.window_handles[0])driver.switch_to.window(driver.window_handles[1])十二、鼠标事件鼠标事件须要引入ActionChains模块办法阐明move_to_element(above)鼠标右击double_click()鼠标双击drag_and_drop()左键按住拖动perform()动作存储实例演示: 滑动滑块验证码from selenium import webdriverfrom selenium.webdriver import ActionChainsfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC # 初始化谷歌浏览器driver = webdriver.Chrome() # 最大化窗口driver.maximize_window() # 关上头条登陆网址driver.get('https://sso.toutiao.com') # 期待某个元素是否呈现WebDriverWait(self.driver, 10).until( EC.text_to_be_present_in_element((By.XPATH, '//*[@id="mobile-code-get"]/span'), u'发送')) # 实例化鼠标操作action = ActionChains(self.driver) # 按住滑块action.click_and_hold(self.driver.find_element_by_xpath('//*[@id="captcha_container"]')).perform() # 将滑块挪动x的间隔action.move_by_offset(xoffset=x, yoffset=0).perform() # 开释滑块action.release().perform()十三、期待隐氏期待如果到肯定工夫,指定的元素还没有呈现,过程不会阻塞,然而到指定工夫还没有找到,就会抛出异样from selenium import webdriver driver = webdriver.Chrome()driver.implicitly_wait(10) driver.get('https://www.baidu.com')显示期待如果在肯定工夫内,指定的元素没有呈现,过程会阻塞在这里,如果到指定工夫还没有找到,就会抛出异样from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome()driver.implicitly_wait(10) driver.get('https://www.baidu.com')WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, 'kw')))十四、后退、后退和刷新back 后退forward 后退refresh 刷新浏览器from selenium import webdriver driver = webdriver.Chrome()driver.get('https://www.baidu.com')driver.get('https://www.taobao.com')driver.get('https://www.jd.com') driver.back()driver.forward()driver.refresh()十五、敞开浏览器close 敞开以后标签页quit 敞开整个浏览器from selenium import webdriver driver = webdriver.Chrome()driver.get('https://www.baidu.com')//关上百度页面后,敞开整个浏览器driver.quit()抖音,快手,小红书数据采集接口,文档地址: TiToData

December 15, 2020 · 1 min · jiezi

关于大数据:大数据开发数仓拉链表概述以及如何迭代或者回滚

1.背景拉链表是什么,在数仓建设时候,一种重要的表数据处理形式,能够将数据结构于算法,类比于拉链表于数仓,旨在解决数仓建设外面的SCD需要,那么什么是SCD,就是迟缓变动维,随着工夫流逝,数据绝对事实表产生迟缓变动。 SCD的罕用解决形式有以下几种: 保留原值间接笼罩减少新属性列快照表拉链表本文次要解说拉链表来解决SCD的问题,其特点演绎以下,有以下几种场景时候,能够应用拉链表。 1.表数据量较大,用全量表会占用很多存储 2.表数据会有批改,用增量表,难以解决反复且批改数据 3.有回溯的需要,须要晓得历史某个工夫点的全量数据 4.数据有批改,然而频率和量不是很大比方只有百万分之一有批改 2.拉链表处理实践首先拉链表是一个全量表且不是分区表,为了达到后面形容的各种成果,必然须要一个两头表来做两头跳板,这个两头跳板表是一个分区表,数据是增量数据,增量内容包含批改和减少,即经常是create_time or update_time 落在以后天,对于拉链表须要减少两个与原始数据没有关系的两个字段来标识数据开始工夫和无效截至工夫,在示例中,这两个日期别离为start_date 和 end_date ,拉链表其解决形式次要有以下三种:初始化,每天更新数据,回滚数据。 2.1 初始化和新增数据其每天的滚动形式如下图: 初始化局部,是拉链全量表的开始工夫,也奠定了回滚时候可能回滚的最早工夫,每天更新逻辑如上图,新增数据会分为两局部,一部分是每天新增的数据,对于当天分区外面有雷同变动或者未变动的数据时候,别离批改对应的start_date 和 end_date 即可达到更新数据。 2.1 数据回滚对于下面的更新逻辑,咱们来思考如何回滚数据,即回到历史的某个工夫点,对于拉链表来说是全量表,所以只有一个回滚即可。回滚策略能够依据回滚工夫点和数据生成的start_date 和 end_date,具体怎么回滚,咱们来看上面的示意图: 在end_date < rollback_date 的数据要保留,对于解决end_date ≥ rollback_date ≥ start_date 设置end_date 为9999-12-31 ,对于回滚的后果,个别为了保持数据的完整性,能够将回滚的数据放在一个新的拉链长期表中。 3.拉链表处理案例对于数仓的罕用分层DIM即维度层是拉链表的罕用场景,上面有个例子拉看看拉链表怎么做新增和回滚。 用拉链表实现外围交易剖析中DIM层商家维表,并实现该拉链表的回滚。 3.1 创立表并导入数据其中商家维表构造如下: --创立商家信息表(增量表 分区表)drop table if exists ods.ods_trade_shops;create table ods.ods_trade_shops( `shopid` int COMMENT '商铺ID', `userid` int COMMENT '商铺负责人', `areaid` int COMMENT '区域ID', `shopname` string COMMENT '商铺名称', `shoplevel` int COMMENT '商铺等级', `status` int COMMENT '商铺状态', `createtime` string COMMENT '创立日期', `modifytime` string COMMENT '批改日期') COMMENT '商家信息表'PARTITIONED BY (`dt` string)row format delimited fields terminated by ',';-- 创立商家信息维表drop table if exists dim.dim_trade_shops;create table dim.dim_trade_shops( `shopid` int COMMENT '商铺ID', `userid` int COMMENT '商铺负责人', `areaid` int COMMENT '区域ID', `shopname` string COMMENT '商铺名称', `shoplevel` int COMMENT '商铺等级', `status` int COMMENT '商铺状态', `createtime` string COMMENT '创立日期', `modifytime` string COMMENT '批改日期', `startdate` string COMMENT '失效起始日期', `enddate` string COMMENT '生效完结日期') COMMENT '商家信息表';导入以下测试数据: ...

December 13, 2020 · 3 min · jiezi

关于大数据:大数据开发数仓ads层指标计算

ads层数据往往是最终的后果指标数据,在大屏展现,或者实时流解决时候应用,通过上面两个例子来练习业务大屏展现sql该怎么写。 1.会员剖析案例1.1 数据筹备表构造如下,其中此表是dws层以天为维度的会员表,比方每天的会员信息汇总, use dws;drop table if exists dws.dws_member_start_day;create table dws.dws_member_start_day(`device_id` string, -- 设施id,来辨别用户`uid` string, -- uid`app_v` string,`os_type` string,`language` string,`channel` string,`area` string,`brand` string) COMMENT '会员日启动汇总'partitioned by(dt string)stored as parquet;1.2 会员指标计算缄默会员的定义:只在装置当天启动过App,而且安装时间是在7天前 散失会员的定义:最近30天未登录的会员 1.2.1 如何计算缄默会员数-- 拿到只启动一次的会员,前面再过滤安装时间是再7天前的,应用sum 窗口函数SELECT count(*)FROM (SELECT device_id, sum(device_id) OVER (PARTITION BY device_id) AS sum_num, dt FROM dws.dws_member_start_day) tmpWHERE dt <= date_add(CURRENT_DATE, -7) AND sum_num=11.2.2 如何计算散失会员数-- 拿到会员最近一次登录工夫,并用row_number来过滤SELECT count(*)FROM (SELECT device_id, dt, row_number() OVER (PARTITION BY device_id ORDER BY dt DESC) ro FROM dws.dws_member_start_day) tmpWHERE ro=1 AND dt >= date_add(CURRENT_DATE, -30) 2. 外围交易案例2.1 数据筹备给定一个每日订单维度表,表构造如下图: ...

December 13, 2020 · 3 min · jiezi

关于大数据:抖音爬虫教程一文讲透原理

申明: 本文只做技术钻研,请勿用于任何非法用处。最近有不少小伙伴投入短视频赛道,也呈现不少第三方数据商,为大家提供抖音爬虫数据。小伙伴们有没有好奇过,这些数据是如何获取的,一般技术小白是否也领有本人的抖音爬虫呢?本文会全面解密抖音爬虫的幕后原理,不须要任何编程常识,还请急躁浏览。 1. 什么是 HTTP 申请在制作爬虫前,首先须要理解,爬虫数据是怎么取得的。以抖音 APP 为例,咱们从抖音上看视频,和咱们从浏览器上拜访网站原理是一样的。 都是通过规范的 HTTP 申请来交互。那么什么是 HTTP 申请呢?HTTP 申请其实非常简单,能够了解为规定好格局的一组文字音讯。申请音讯中个别蕴含三样货色: 申请网址 (URL),例如抖音 APP 后盾网址你要做的事件 (申请参数), 例如是浏览,点赞还是上传视频等你的身份信息 (Cookie) 和校验信息 (Token),表明你是谁,你申请非法吗抖音服务器收到 HTTP 申请后,会先验证合法性,而后依照你的要求,配合你的身份和地理位置等,给你回复规定格局的文本音讯。 2. 抖音 HTTP 申请流程咱们以安卓 10.6 版首页举荐视频为例,来看一个实在的抖音申请流程:上图是通过抓包软件抓取的首页举荐视频申请数据。能够看出,当你一关上抖音,APP 就会主动向抖音服务器发送一条 HTTP 申请音讯。图中蓝色箭头能够看出,申请是向 aweme-hl.snssdk.com/aweme/v2/fe… 这个网址发送的 (URL)。黄色箭头标出该 HTTP 申请蕴含了地理位置信息 (申请参数),以及身份信息 (Cookie)。抖音服务器收到申请后,就晓得你是谁,你在哪里,你要干什么。而后会将红色箭头中的视频举荐数据回复给你。点开回复数据,能够看到其中蕴含了视频 ID,题目,形容,点赞量,评论等多种信息。 有的读者可能留神到一串 \350\241\250\346\203\205 这样奇怪的数字,这其实是一种叫 UTF-8 的编码方式。能够简略了解为每三组 \xxx 组成一个中文字符。比方下面这串数字翻译过去就是 表情 两个字。抖音 APP 通过读取回复音讯,就晓得该给咱们展现哪些视频了。但此时并没有完结,APP 还要依据返回的视频 ID,额定做两次 HTTP 申请,以取得须要展现的视频数据和缩略图信息,这样能力真正给咱们展现首页举荐视频。 3. HTTP 包到底长什么样?小伙伴们读到这里,应该明确整个抖音数据的申请流程了。俗话说纸上得来终觉浅,咱们就以抖音点赞为例,手把手教大家怎么抓取和查看一个实在的 HTTP 申请包。 1. 下载抓包软件首先,须要下载 HttpCanary 抓包软件,能够从 Google Play 或者 Apkpure 里下载。装置实现后,重启手机,就能够开始抓包了。 ...

December 13, 2020 · 1 min · jiezi

关于大数据:小红书数据采集教程从0到1-APP采集Airtest

一、前言:小红书的爬虫次要是从搜寻动手,爬取某个关键词下的所有笔记,通过调研发现有有两个渠道,第一个是 App,第二个小程序。先说小程序端,通过抓包发现,每篇文章对应着一个 auth-sign ,这个参数应该有小程序外部生成,无奈获取到,有种思路就是能够通过按键精灵或者 Mitmproxy 获取到每篇笔记的 auth-sign ,而后就能够通过接口去爬,这两头还须要一个自动化管制手机工具;再来说 App 端,须要有好几个加密参数 sign\token\shield,之前git下面还有大神保护着一个服务器能够破解签名,当初曾经生效了,App 逆向临时还没学(已提上日程),所以还是用手机端的自动化测试工具来爬,次要软件有Appium和Airtest,Appium 坑比拟大,不仅装置麻烦而且调试时极不不便,再者获取不到小红书笔记的详情页的页面构造,本文次要讲下应用 Airtest + Mitmproxy 进行手机端的爬虫,这两者加起来,能够解决90%的 App 爬虫吧,除了淘宝...但能够用Pypeteer。 二 、AirtestAirtest 是一个跨平台的、 基于图像识别 的UI自动化测试框架,实用于游戏和App,反对平台有Windows、Android 和 IOS,次要编写语言为 python。官网 -> 点我, 官网文档 ->[ [点我]](http://airtest.netease.com/do... ,根本应用能够看下青南大佬的blog ->[ [点我]](https://www.kingname.info/201...Airtest与Appium相比最大的长处是能够实时的看到页面的动静,而且反对图像识别进行点击等操作 三、应用Airtest自动化管制App后期的应用能够在Airtest自带的IDE中调试,毕竟边操作边看到界面是十分不便地,等成熟之后搬到pycharm中执行再思考作定时工作等 四、Airtest根本[Api]应用:获取元素: ls = poco(name="com.xingin.xhs:id/aj8") 通过name获取ls = poco(text=item.get_text()) 通过textpoco("android.widget.LinearLayout").offspring("com.xingin.xhs:id/ak6") 通过目录树点击元素: x.click()获取文本: x.get_text()滑动屏幕: swipe([0.5, 0.8], [0.5, 0.7]) 从一个点到另一个点是否存在: x.exist()安卓ADB操作:from airtest.core.android.adb import ADBadb = ADB(serialno='OF9SBMY59D69756L')# 原始 adb shell 命令为 adb shell input keyevent 26adb.start_shell('input keyevent 26') # 唤醒屏幕# 启动app app包名adb.start_shell('am start -n com.xingin.xhs/.activity.SplashActivity') # 获取app包名aapt dump badging C:\Users\xx\Desktop\xiaohongshu.apk# launchable-activity: name='com.xingin.xhs.activity.SplashActivity'  其余 API踩的一些坑 ...

December 13, 2020 · 1 min · jiezi

关于大数据:大数据架构流程图

大数据管理数据处理过程图大数据(big data),指无奈在肯定工夫范畴内用惯例软件工具进行捕获、治理和解决的数据汇合,是须要新解决模式能力具备更强的决策力、洞察力。大数据处理的次要流程包含数据收集、数据存储、数据处理、数据利用等次要环节。随着业务的增长,大量和流程、规定相干的非结构化数据也爆发式增长。 平台数据架构流程图规范大数据平台架构,规范大数据平台架构,大数据平台架构,数据仓库,数据集市,大数据平台层级构造,数据挖掘,举报,蕴含该模版的分享。数据架构设计(数据架构组) 概述 总体形容 绝对于业务架构和利用架构,数据架构在总体架构中处于根底和外围位置。 产品体验构造流程图产品的性能结构图,产品性能结构图,产品次要流程图,产品的外围流程,咱们持续围绕着失去app的外围流程探索。还原产品,产品构造、外围流程体验、外围页面体验的状况,而不仅仅是界面表层;从产品视角、用户视角来剖析,而不是自我感觉,撰写报告,推出报告。产品体验从产品现状、指标用户及场景、要害性能体验 程序流程图程序流程图又称程序框图,是用对立规定的规范符号形容程序运行具体步骤的图形示意。程序框图的设计是在解决流程图的根底上,通过对输入输出数据和处理过程的详细分析,将计算机的次要运行步骤和内容标识进去。 软件开发周期软件生命周期(Software Life Cycle,SLC)是软件的产生直到报废或停止使用的生命周期。软件生命周期内有问题定义、可行性剖析、总体形容、零碎设计、编码、调试和测试、验收与运行、保护降级到废除等阶段一个软件产品或软件系统也要经验孕育、诞生、成长、成熟、兴起等阶段 软件测试流程鱼骨图软件测试流程: 需要剖析,制订测试计划,设计测试用例与编写,施行测试,提交缺点报告,生成测试总结和报告。软件测试依照研发阶段个别分为5个局部:单元测试、集成测试、确认测试、零碎测试、验收测试。依据设计用例的办法不同,黑盒测试包含等价划分法、边界值分析法、谬误揣测法、因果图法等。 云平台整体架构图云计算的体系结构由5局部组成,别离为应用层,平台层,资源层,用户拜访层和管理层,云计算的实质是通过网络提供服务,所以其体系结构以服务为外围。公认的云架构是划分为基础设施层、平台层和软件服务层三个档次的。 项目管理九大体系项目管理思维导图包含我的项目洽购治理、我的项目成本核算、工夫治理等对于项目管理的九大体系。项目管理十大畛域:进度、老本、品质、范畴等4个外围畛域,危险、沟通、洽购、人力资源、干系人等5个辅助畛域,1个整体畛域。 产品经理项目管理思维导图思维导图能够帮忙产品经理梳理多而乱的产品思路,也能够帮忙产品经理进行需要治理、产品剖析等。产品经理会应用思维导图来对产品的思路进行一个无效的剖析,梳理产品逻辑,而后再画原型图。一个优良的产品经理,不仅仅是会画原型,写需要文档,更重要的是做出用户称心的产品。 我的项目布局时间轴流程图我的项目布局时间轴流程图,对一个我的项目从开始到完工的整个过程进行总结演绎。工夫线图,又叫时间轴图,能以历史进程为载体,将过往的重要事项或者里程碑,标注在轴线上,并加以阐明。它的作用是可能可视化内容,以图文的模式出现进去。时间轴是一种表白事物倒退过程的可视化图示,被许多商业治理人士所应用。

December 12, 2020 · 1 min · jiezi

关于大数据:抖音爬虫教程APP数据采集常见思路

其实所谓抓取APP数据和抓取网页数据是存在肯定的不同,抓取网页数据能够采纳模仿拜访网站而后抓取网页接管内容的模式进行数据抓取。而APP则更偏向于通过截获数据传输包的模式进行(Wireshark和Fiddler+Python)。一般来说,咱们用WireShark+Fiddler来获取大部分数据是没有多大问题的。但这里有个问题是,如果你碰到的是用SSL/TLS等加密伎俩加密过的网络数据的时候,往往咱们只能大刀阔斧。在过来的话,如果咱们领有的该传输会话的私钥的话咱们还是能够将它提供给WireShark来让其对这些加密数据包进行解密的,但这曾经是想当年还用RSA进行网络数据加密的年代的事件了。当今大家都曾经逐步拥抱前向加密技术PFS的时代了,所以该办法就不再实用了。因为前向加密技术的目标就是让每个数据交互都应用的是不同的私钥,所以你像以前RSA时代一样想只用一个私钥就能把整个session会话的网络数据包都破解进去的话是不可能的了(其实能够也通过相似浏览器的Session Key性能解决)。 1.App数据抓取剖析但凡能够看到的APP数据都能够抓取。剖析钻研过不下300个APP抓包。50%的app,通过抓包软件就能够剖析出抓取参数并抓取到信息。30%的app,可能须要适当的反编译,剖析出加密算法并抓取到信息。10%的app,可能加固,须要脱壳,而后反编译,剖析出加密算法并抓取到信息。10%的app,通过各式各样的签名,证书,设施绑定等办法,暗藏加密算法。总的来说,没有不能抓取的app,只是工夫老本的问题。 2.爬取思路1.抓包2. HOOK 2.1.抓包有代码教训或APP开发的同学都很容易了解,其实很多APP,走的都是webservice通信协定的形式,并且因为是公开数据,而且大部分是无加密的。所以只有对网络端口进行监测,对APP进行模仿操作,即可晓得APP外面的数据是如何获取的。咱们只须要写代码模仿其申请,无论POST还是GET,即可失去该申请所返回的信息。再通过对返回的信息结构化解析,即可失去咱们想要的数据。 public static void main(String[] args) {   Spider.create(new GithubRepoPageProcessor())            //从https://github.com/****开始抓            .addUrl("https://github.com/****")            //设置Scheduler,应用Redis来治理URL队列            .setScheduler(new RedisScheduler("localhost"))            //设置Pipeline,将后果以json形式保留到文件            .addPipeline(new JsonFilePipeline("D:\\data\\webmagic"))            //开启5个线程同时执行            .thread(5)            //启动爬虫            .run();}  ...

December 12, 2020 · 2 min · jiezi

关于大数据:抖音爬虫教程逆向分析使用关键字进行功能破解

抖音爬虫教程-逆向剖析-应用关键字进行性能破解备注只是学习交换探讨,切勿其它用处。 前言此次分享以理论案例进行解说,波及: 暴力破解实在注册码寻找注册机编写去除软件暗桩等知识点工具筹备x64dbgWindows 的开源二进制调试器,用于恶意软件剖析和对没有源代码的可执行文件进行反向工程。 官网https://x64dbg.com/WinhexWinHex 实质上是一个通用十六进制编辑器。专为最低级别的数据处理而设计,作为计算机系统犯罪学(取证)考察的多功能工具,用于数据恢复和 IT 平安 - 在日常应用和紧急情况中。 官网http://www.x-ways.net/winhex/index-m.htmlkeymaker2KeyMake是一款功能强大的注册机编写器,该软件采纳汇编模板为外围,可不便用户省去简单的指令算法,从而疾速制作出所需的注册机! 下载地址https://tool.pediy.com/index-detail-103.htmOllyDbgOllydbg是一款业余的反汇编调试工具,次要用于一些应用程序的编译操作,软件最善于剖析函数过程、循环语句、API调用、函数中参数的数目和import表等等 下载地址https://tool.pediy.com/index-detail-1.htm暴力破解此节解说如何通过批改汇编代码来跳过程序验证局部(俗称打补丁)的模式来过掉程序的最终校验 所用工具:x64dbg外加中文搜索插件(简体中文关键字:需搜寻中文字符串)将要剖析的程序用x64dbg载入点击x64dbg运行按钮,运行程序,让其运行,使其可载入更多的信息用于剖析,之后应用字符串搜寻工具进行搜寻依据关键字查找有用信息发现一些注册判断跳转,并在跳转处下断点,使其能够中断进行剖析注册信息没有填写齐全判断 想不论输出什么都不提醒“注册信息没有填写齐全”这个提醒就要使00510465处的跳转不成立,因原je为等于转移,但呈现不等于时跳转不执行,故需二进制编辑破除此跳转, 0051047F处的跳转成立,因原jne为不等于转移,但呈现不等于时跳转不执行,故需将其批改为jmp无条件转移指令留神:因之前在je指令处下载过断点,若想批改指令需删除此处断点注册码正确,感激你的注册!判断 想不论输出什么都提醒“注册码正确,感激你的注册!”这个提醒就要使00510543处的跳转不成立,因原jne为不等于时转移,但呈现等于时跳转不执行,故需二进制编辑破除此跳转留神:此办法破除跳转指令后,其背景色彩变灰,显示信息为跳转不会执行运行测试批改结束,填写任意注册信息,点击注册填写任意信息,提醒注册胜利,显示已注册实在注册码寻找思路:在软件运行时监测内存数据,查问是否有敏感或可利用信息所用工具:Winhex 运行软件点击注册订单号:112233注册码:china123study关上Winhex进行剖析注册机编写在要害判断("注册码正确,感激你的注册!")处发现EDX存在正确的注册码与所输出的注册码进行比照,导致正确的注册码泄露,依据这一特点读取EDX数据,利用软件本身算码机制计算出正确的注册码并调取应用所用工具:x64dbg、keymaker2 关键点可在0051053E处下断点读取EDX数据因EDX数据在内存内,估应用keymaker2制作内存注册机进行读取数据 本身注册码比照机制泄露正确的注册码应用keymaker2读取内存数据,制作注册机 应用生成的注册机在内存数据中读取出正确的注册码暗桩所用工具:x64dbg、od、winhex 注册判断通过会在本机存储注册数据文件“hdwlz.dll”,其保留在“C:\Windows\system32”目录因零碎防护起因导致它写入注册信息失败,进一步验证了其注册机制切换环境胜利写入查看写入的数据比照发现写入的是订单信息关闭程序后,发现注册文件被删除,暗桩呈现 因删除文件应用的是DeleteFile函数,应用OD剖析函数进行剖析 发现有两次援用该删除性能在这两次调用处下断点进行剖析 先上寻找在程序入口处下个断点关闭程序,查看断点剖析敞开时,胜利断在入口处步过剖析到读取hdwlz.dll文件订单信息点 步过剖析到比照处取EAX数据与0x1CD6D0做比拟 其中EAX数据未订单号的十进制信息要害跳转大于1CD6D0(1890000)跳转不删除注册文件,小于1CD6D0(1890000)跳转不执行删除注册文件总结订单号需大于1CD6D0(1890000)才不会触发暗桩删除注册文件(但程序敞开时执行判断)解决办法:注册时填写的订单号大于1890000或批改005181D3处的要害跳转使其必跳JG改为JMP TiToData:业余的短视频、直播数据接口服务平台,网址: TiToData笼罩支流平台:抖音,快手,小红书,TikTok,YouTube

December 12, 2020 · 1 min · jiezi

关于大数据:抖音数据采集SDK

接口参数、返回示例请参考文档:抖音apiGithub仓库:DouyinSDK 0. 初始化from douyin import AwemeSDKtoken = 'xxxxxxxx'host = 'http://xxxxx.xx.xx'sdk = AwemeSDK(token,host)1.用户详情result = sdk.GetUserInfo('100000004548')2.用户作品result = sdk.GetUserPosts('100000004548')3.用户喜爱视频result = sdk.GetUserFavourites('100000004548')4.用户商品橱窗result = sdk.GetUserPromotions('100000004548')5.视频评论result = sdk.GetVideoComments('6785429036362386696')28.视频详情result = sdk.GetVideoDetail(6849103450475711752)6.视频带货信息result = sdk.GetVideoPromotions('6785429036362386696')7.视频评论的子评论result = sdk.GetVideoCommentReplies('6785429036362386696','6775738616267554829')8.话题详情result = sdk.GetChallengeDetail('1671619888543757')9.获取话题(challenge)下的视频result = sdk.GetChallengeVideos('1671619888543757')10.地点详情result = sdk.GetPoiDetail('6666714767266187271')11.获取地点(poi)下的视频result = sdk.GetPoiVideos('6666714767266187271')12.带货视频举荐result = sdk.GetPromotionVideosFeed()13.带货商品promotion详情result = sdk.GetPromotionInfo('60772262244900')14.同款商品带货视频举荐result = sdk.GetPromotionSameVideos('60772262244900')15.获取直播间弹幕/进入直播间观众/刷礼物/关注主播 信息result = sdk.GetLiveRoomChats('6843198199583378191')16.获取直播间带货商品信息result = sdk.GetLiveRoomPromotions('6843198199583378191')17.获取直播间信息result = sdk.GetLiveRoomInfo('6843198199583378191')18.查问直播间是否开播result = sdk.GetLiveRoomStatus('6843198199583378191')19.获取直播用户信息result = sdk.GetUserLiveInfo('6843198199583378191')20.实时明星爱DOU榜result = sdk.RealStarBoard()21.实时热点榜result = sdk.RealHotBoard()22.实时好物榜result = sdk.RealGoodsBoard()23.最热视频榜单result = sdk.RealHotVideos()24.热门话题举荐result = sdk.RealHotChallenges()25.实时品牌榜result = sdk.RealBrandBoard(7)26.品牌类别接口result = sdk.BrandCategories()27.热榜品牌详情result = sdk.BrandDetail(2,9117)29.关键词搜寻用户result = sdk.SearchUsers('美女')30.关键词搜寻视频result = sdk.SearchVideos('美女') ...

December 11, 2020 · 1 min · jiezi

关于大数据:抖音协议算法生成调用so文件生成xgorgon

目前很多 App 的加密签名算法都在so文件中,强行逆向so的话可能会耗费大量工夫和资源。之前用 xposed 采纳 hook 的办法从程序计算签名,然而须要模拟器或者真机运行这个利用,应用效率不高。也用过 jtype 启动JVM,而后通过 native 对so文件进行调用,因为每次都须要启动JVM,所以效率也不高。unidbg 他不须要运行 app,也无需逆向 so 文件,通过在 app 中找到对应的 JNI 接口,而后用 unicorn 引擎间接调用 so 文件,所以效率绝对要高不少。 unidbg特点模仿JNI调用API,能够调用JNI_OnLoad反对JavaVM,JNIEnv模拟系统调用反对ARM32和ARM64内联钩子(Inline Hook)Android import hookiOS 的一些hook工具 fishhook and substrate and whale hook反对简略的控制台调试器,gdb存根,实验性IDA android调试器服务器,指令跟踪,内存读/写跟踪反对iOS objc和Swiftunidbg环境配置unidbg下载链接: https://github.com/zhkl0228/unidbgIntelliJ IDEA可用于编辑unidbg源下载实现之后示导入到 IDEA 中,当然你须要筹备好java环境(jdk、maven)抉择Maven期待加载实现之后,运行src/…/encrypt 中的TTEncrypt测试用例如果控制台打印相干调用信息,阐明曾经导入胜利。 加载libcms.so上面筹备调用libcms.so文件中的 leviathan 函数首先在 src/test/resources 目录下新建文件夹dylib,放入libcms.so文件libcms.so 下载地址: https://download.csdn.net/download/weixin_43582101/12713664而后我在 /unidbg/unidbg-android/src/test/java/com/sun/jna/ 目录下新建了 JniDispatch128.java文件JniDispatch128.java文件内容如下: 备注“com/ss/sys/ces/a”须要调用函数所在的Java类残缺门路,比方 a/b/c/d 等等,留神须要用/代替.“leviathan(II[B)[B”须要调用的函数名,名字是smali语法,可通过jadx等工具查看“vm.loadLibrary(new File)”so文件的门路,须要自行批改,最好为绝对路径package com.sun.jna;import com.github.unidbg.*;import com.github.unidbg.linux.android.AndroidARMEmulator;import com.github.unidbg.linux.android.AndroidResolver;import com.github.unidbg.linux.android.dvm.*;import com.github.unidbg.memory.Memory;import com.github.unidbg.memory.MemoryBlock;import com.github.unidbg.linux.android.dvm.array.ByteArray;import java.io.File;import java.io.IOException;public class JniDispatch128 extends AbstractJni { private static LibraryResolver createLibraryResolver() { return new AndroidResolver(23); } private static AndroidEmulator createARMEmulator() { return new AndroidARMEmulator("com.sun.jna"); } private final AndroidEmulator emulator; private final Module module; private final VM vm; private final DvmClass Native; private JniDispatch128() { emulator = createARMEmulator(); final Memory memory = emulator.getMemory(); memory.setLibraryResolver(createLibraryResolver()); vm = emulator.createDalvikVM(null); vm.setJni(this); vm.setVerbose(true); // 自行批改文件门路 DalvikModule dm = vm.loadLibrary(new File("/Users/Desktop/unidbg/unidbg-android/src/test/resources/dylib/libcms.so"), false); dm.callJNI_OnLoad(emulator); module = dm.getModule(); Native = vm.resolveClass("com/ss/sys/ces/a"); } private void destroy() throws IOException { emulator.close(); System.out.println("destroy"); } public static void main(String[] args) throws Exception { JniDispatch128 test = new JniDispatch128(); test.test(); test.destroy(); } public static String xuzi1(byte[] bArr) { if (bArr == null) { return null; } char[] charArray = "0123456789abcdef".toCharArray(); char[] cArr = new char[(bArr.length * 2)]; for (int i = 0; i < bArr.length; i++) { int b2 = bArr[i] & 255; int i2 = i * 2; cArr[i2] = charArray[b2 >>> 4]; cArr[i2 + 1] = charArray[b2 & 15]; } return new String(cArr); } private void test() { String methodSign = "leviathan(II[B)[B"; byte[] data = "临时轻易写的,这里是url通过解决后的data".getBytes(); int time = (int) (System.currentTimeMillis() / 1000); Native.callStaticJniMethod(emulator, methodSign, -1,time,new ByteArray(vm,data)); Object ret = Native.callStaticJniMethodObject(emulator, methodSign, -1,time,new ByteArray(vm,data)); System.out.println("callObject执行后果:"+((DvmObject) ret).getValue()); byte[] tt = (byte[]) ((DvmObject) ret).getValue(); System.out.println(new String(tt)); String s = xuzi1(tt); System.out.println(s); }}运行main办法即可查看生成进去的xgorgon了 ...

December 11, 2020 · 2 min · jiezi

关于大数据:大促中为什么需要可视化监控大屏

云妹导读: 大数据时代,咱们最常听到的一句话就是“用数据谈话”。但数据自身都是寒冷的数字,它很难间接通知咱们哪些数据是有价值的信息。只有把绝对简单、形象的数据通过可视的形式以人们更易了解的模式展现进去,才能够使传递给使用者的感触更加直观,也更容易取得其中价值,这种伎俩就叫做数据可视化。数据可视化能够更形象地表白数据外在的信息和法则,促成数据信息的流传和利用。 大屏数据可视化是数据可视化的一种,其以“大屏”为次要展现载体的数据可视化设计,具备“大面积、炫酷动效、丰盛色调”等特点。利用面积大、可展现信息多的特点,通过“要害信息大屏共享”的形式可不便团队探讨、决策,故大屏罕用来做数据分析、监控应用。 有了大屏,要害信息即可高深莫测。比方11.11大促期间,所波及的产品 从底层IDC、根底网络,到Iaas、PaaS、SaaS,层层都有很多模块服务 ,想要看到云平台外围业务运行是否失常,是否有潜在危险,都能够在一块综合大屏中展现进去。这样研发或者运维不仅能够做日常巡检,当产生故障时,也能帮忙做剖析和定位。 图 1 上图为京东智联云在往年11.11期间的外围业务监控大屏。这个大屏最次要外围的就是正中间的三个圆形图片,也是稳定性最重要的信息——“资源水位”,“服务运行状态”,“平安态势”。图片通过不同色彩示意零碎的稳固情况,既活泼又易于了解: 绿色 表明以后云平台整体失常,没有大的问题;橙色 表明须要留神某个或者某些资源水位达到预警,筹备扩容,某个或某些服务可用性降落,须要关注,有DDoS攻打正在封堵;红色 表明某个或者某些服务曾经异样,影响线上业务,须要研发运维,解决故障。图 1 左下角是外围业务流量趋势图,有同比(去年11.11),环比(往年618)数据,通过这些数据能够直观地看到这些外围业务流量是否失常,如果不失常可能是会有异常情况或者故障产生,也能从此趋势图预测下次大促流量,提前预估出容量,为下次大促做筹备。 除了集中展现信息,大屏还有一个十分重要的个性就是它能展现信息之间的关联性。在图1 的外围业务监控大屏中,当服务运行状态色彩变红,阐明有服务异样。在大屏右下角,能够看到是哪个产品服务有异样,且从下到上的服务之间是有依赖关系的,当底层的服务异样变成红色,那么下层服务可能都有异样,都变红色,通过这种依赖层级关系,能更快地做故障定位,迅速做止损,想看具体哪些资源或者服务异样,能够点击上面的小图,链接到相应的服务大屏里。 上面图 2是平安态势的大屏,在这张图中能够看到哪个地位的机房被攻打,Top5的攻击者IP是多少,安全事件发展趋势等。 图 2 通过这种直观,有关联的形式,把外围数据及稳定性工作出现进去,也更容易向上汇报。不相熟底层业务的共事,也能容易了解承受,起到高深莫测的成果,尤其是有地域性特点的业务,用地图更是起到 “一图胜千言” 的成果。 在京东智联云11.11大屏数据可视化的实际过程中,咱们总结出几个设计准则: 首先,先总览后细节。 大屏因为大,承载数据多,为了防止观者迷失,大屏信息出现要有焦点有主次。能够通过比照,先把外围数据抛给观看者,待其了解大屏次要内容与展现逻辑后,再逐级浏览二三级内容。局部细节数据可临时暗藏,有须要时可通过鼠标点击等交互方式唤起; 第二,大屏指标在8-12个为宜。 大屏上的展现空间是无限的,咱们不能将所有的数据都堆到大屏中,关注的人想要看到的也只是一些要害数据,因为大屏上的指标数量最好在8-12个之间,这也是数据指标数量的支流配置,当达到这个数量时,大屏整体看起来不空也不挤; 第三,比率类、数字类和子部散布类指标要合理布局。 比率,数字总计和子部散布这三类指标在每张大屏中简直必然呈现,并且呈现的次数也很多,次数散布也比拟平均,因为个别大屏都须要有数字总计类的指标,而且往往是外围指标,这样不便晓得外围指标目前的总体情况。然而仅仅一个数字并不能反映出以后指标的实现状况,所以也须要有比率指标,它反映了局部占总体的占比; 最初,一图胜千言。 有“地域性”或“区域性”特色的产品用地图大屏,尤其是能够做成动静或热力求,会起到一图胜千言的成果。 如果你也想领有一块本人的数据大屏,能够点击以下链接,用京东智联云数据大屏轻松实现数据可视化: ????《如何决策快人一步?用一块大屏轻松实现数据可视化》 如果想在数据大屏的根底上以最新的视觉体验和可视化状态为观者传递信息,也能够通过以下设计揭秘来理解更多大屏可视化技巧: ????《11.11数据可视化大屏设计揭秘》 举荐浏览: 11.11TECH TALK | 揭秘11.11监控排障利器 京东高稳固日志服务深度解析11.11 TECK TALK | 京东千亿订单背地的纵深平安进攻体系11.11 TECK TALK | 媲美物理机 裸金属云主机极致性能轻松应答11.11大促欢送点击【京东智联云】,理解开发者社区 更多精彩技术实际与独家干货解析 欢送关注【京东智联云开发者】公众

December 10, 2020 · 1 min · jiezi

关于大数据:Hive引擎Spark优化配置参数

Hive是大数据畛域罕用的组件之一,次要是大数据离线数仓的运算,对于Hive的性能调优在日常工作和面试中是常常波及的的一个点,因而把握一些Hive调优是必不可少的一项技能。影响Hive效率的次要有数据歪斜、数据冗余、job的IO以及不同底层引擎配置状况和Hive自身参数和HiveSQL的执行等因素。本文次要形容在底层引擎为Spark时,常常会用到的、常见的配置参数。 资源参数优化所谓的Spark资源参数调优,其实次要就是对Spark运行过程中各 个应用资源的中央,通过调节各种参数,来优化资源应用的效率,从而晋升Spark作业的执行性能。以下参数就是Spark中次要的资源参数,每个参数都对 应着作业运行原理中的某个局部,咱们同时也给出了一个调优的参考值。 num-executors参数阐明:该参数用于设置Spark作业总共要用多少个Executor过程来执行。Driver在向YARN集群管理器申请资源时,YARN集 群管理器会尽可能依照你的设置来在集群的各个工作节点上,启动相应数量的Executor过程。这个参数十分之重要,如果不设置的话,默认只会给你启动少 量的Executor过程,此时你的Spark作业的运行速度是十分慢的。参数调优倡议:每个Spark作业的运行个别设置50~100个左右的Executor过程比拟适合,设置太少或太多的Executor过程都不好。设置的太少,无奈充分利用集群资源;设置的太多的话,大部分队列可能无奈给予充沛的资源。executor-memory参数阐明:该参数用于设置每个Executor过程的内存。Executor内存的大小,很多时候间接决定了Spark作业的性能,而且跟常见的JVM OOM异样,也有间接的关联。参数调优倡议:每个Executor过程的内存设置4G~8G较为适合。然而这只是一个参考值,具体的设置还是得依据不同部门的资源队列来定。可 以看看本人团队的资源队列的最大内存限度是多少,num-executors乘以executor-memory,就代表了你的Spark作业申请到的总 内存量(也就是所有Executor过程的内存总和),这个量是不能超过队列的最大内存量的。此外,如果你是跟团队里其他人共享这个资源队列,那么申请的 总内存量最好不要超过资源队列最大总内存的1/3~1/2,防止你本人的Spark作业占用了队列所有的资源,导致别的同学的作业无奈运行。executor-cores参数阐明:该参数用于设置每个Executor过程的CPU core数量。这个参数决定了每个Executor过程并行执行task线程的能力。因为每个CPU core同一时间只能执行一个task线程,因而每个Executor过程的CPU core数量越多,越可能疾速地执行完调配给本人的所有task线程。参数调优倡议:Executor的CPU core数量设置为2~4个较为适合。同样得依据不同部门的资源队列来定,能够看看本人的资源队列的最大CPU core限度是多少,再根据设置的Executor数量,来决定每个Executor过程能够调配到几个CPU core。同样倡议,如果是跟别人共享这个队列,那么num-executors * executor-cores不要超过队列总CPU core的1/3~1/2左右比拟适合,也是防止影响其他同学的作业运行。driver-memory参数阐明:该参数用于设置Driver过程的内存。参数调优倡议:Driver的内存通常来说不设置,或者设置1G左右应该就够了。惟一须要留神的一点是,如果须要应用collect算子将RDD的数据全副拉取到Driver上进行解决,那么必须确保Driver的内存足够大,否则会呈现OOM内存溢出的问题。spark.default.parallelism参数阐明:该参数用于设置每个stage的默认task数量。这个参数极为重要,如果不设置可能会间接影响你的Spark作业性能。参数调优倡议:Spark作业的默认task数量为500~1000个较为适合。很多同学常犯的一个谬误就是不去设置这个参数,那么此时就会导致 Spark本人依据底层HDFS的block数量来设置task的数量,默认是一个HDFS block对应一个task。通常来说,Spark默认设置的数量是偏少的(比方就几十个task),如果task数量偏少的话,就会导致你后面设置好的 Executor的参数都半途而废。试想一下,无论你的Executor过程有多少个,内存和CPU有多大,然而task只有1个或者10个,那么90% 的Executor过程可能基本就没有task执行,也就是白白浪费了资源!因而Spark官网倡议的设置准则是,设置该参数为num- executors * executor-cores的2~3倍较为适合,比方Executor的总CPU core数量为300个,那么设置1000个task是能够的,此时能够充沛地利用Spark集群的资源。spark.storage.memoryFraction参数阐明:该参数用于设置RDD长久化数据在Executor内存中能占的比例,默认是0.6。也就是说,默认Executor 60%的内存,能够用来保留长久化的RDD数据。依据你抉择的不同的长久化策略,如果内存不够时,可能数据就不会长久化,或者数据会写入磁盘。参数调优倡议:如果Spark作业中,有较多的RDD长久化操作,该参数的值能够适当进步一些,保障长久化的数据可能包容在内存中。防止内存不够 缓存所有的数据,导致数据只能写入磁盘中,升高了性能。然而如果Spark作业中的shuffle类操作比拟多,而长久化操作比拟少,那么这个参数的值适 当升高一些比拟适合。此外,如果发现作业因为频繁的gc导致运行迟缓(通过spark web ui能够察看到作业的gc耗时),意味着task执行用户代码的内存不够用,那么同样倡议调低这个参数的值。spark.shuffle.memoryFraction参数阐明:该参数用于设置shuffle过程中一个task拉取到上个stage的task的输入后,进行聚合操作时可能应用的Executor 内存的比例,默认是0.2。也就是说,Executor默认只有20%的内存用来进行该操作。shuffle操作在进行聚合时,如果发现应用的内存超出了 这个20%的限度,那么多余的数据就会溢写到磁盘文件中去,此时就会极大地升高性能。参数调优倡议:如果Spark作业中的RDD长久化操作较少,shuffle操作较多时,倡议升高长久化操作的内存占比,进步shuffle操作 的内存占比比例,防止shuffle过程中数据过多时内存不够用,必须溢写到磁盘上,升高了性能。此外,如果发现作业因为频繁的gc导致运行迟缓,意味着 task执行用户代码的内存不够用,那么同样倡议调低这个参数的值。资源参数的调优,没有一个固定的值,须要同学们依据本人的理论状况(包含Spark作业中的shuffle操作数量、RDD长久化操作数量以及spark web ui中显示的作业gc状况),同时参考本篇文章中给出的原理以及调优倡议,正当地设置上述参数。 资源参数参考示例 以下是一份spark-submit命令的示例,大家能够参考一下,并依据本人的理论状况进行调节: ./bin/spark-submit --master yarn-cluster --num-executors 100 --executor-memory 6G --executor-cores 4 --driver-memory 1G --conf spark.default.parallelism=1000 --conf spark.storage.memoryFraction=0.5 --conf spark.shuffle.memoryFraction=0.3 理解更多

December 10, 2020 · 1 min · jiezi

关于大数据:抖音爬虫教程就想写个爬虫我到底要学多少东西啊

当今大数据的时代,网络爬虫曾经成为了获取数据的一个重要伎俩。但要学习好爬虫并没有那么简略。首先知识点和方向切实是太多了,它关系到了计算机网络、编程根底、前端开发、后端开发、App 开发与逆向、网络安全、数据库、运维、机器学习、数据分析等各个方向的内容,它像一张大网一样把当初一些支流的技术栈都连贯在了一起。正因为涵盖的方向多,因而学习的货色也十分零散和芜杂,很多初学者搞不清楚到底要学习哪些常识,学习过程中遇到反爬也不晓得用什么办法来解决,本篇咱们来做一些演绎和总结。 初学爬虫一些最根本的网站,往往不带任何反爬措施。比方某个博客站点,咱们要爬全站的话就顺着列表页爬到文章页,再把文章的工夫、作者、注释等信息爬下来就能够了。那代码怎么写呢?用 Python 的 requests 等库就够了,写一个根本的逻辑,顺着把一篇篇文章的源码获取下来,解析的话用 XPath、BeautifulSoup、PyQuery 或者正则表达式,或者粗犷的字符串匹配把想要的内容抠出来,再加个文本写入存下来就完事了。代码很简略,就几个办法调用。逻辑很简略,几个循环加存储。最初就能看到一篇篇文章就被咱们存到本人的电脑外面了。当然有的同学可能不太会写代码或者都懒得写,那么利用根本的可视化爬取工具,如某爪鱼、某裔采集器也能通过可视化点选的形式把数据爬下来。如果存储方面略微扩大一下的话,能够对接上 MySQL、MongoDB、Elasticsearch、Kafka 等等来保留数据,实现长久化存储。当前查问或者操作会更不便。反正,不论效率如何,一个齐全没有反爬的网站用最最根本的形式就搞定了。到这里,你就说你会爬虫了吗?不,还差的远呢。 Ajax、动静渲染随着互联网的倒退,前端技术也在一直变动,数据的加载形式也不再是单纯的服务端渲染了。当初你能够看到很多网站的数据可能都是通过接口的模式传输的,或者即便不是接口那也是一些 JSON 的数据,而后通过 JavaScript 渲染得进去的。这时候,你要再用 requests 来爬那就不顶用了,因为 requests 爬下来的源码是服务端渲染失去的,浏览器看到页面的和 requests 获取的后果是不一样的。真正的数据是通过 JavaScript 执行的进去的,数据起源可能是 Ajax,也可能是页面里的某些 Data,也可能是一些 ifame 页面等等,不过大多数状况下可能是 Ajax 接口获取的。所以很多状况下须要剖析 Ajax,晓得这些接口的调用形式之后再用程序来模仿。然而有些接口带着加密参数,比方 token、sign 等等,又不好模仿,咋整呢?一种办法就是去剖析网站的 JavaScript 逻辑,死抠外面的代码,揪出来这些参数是怎么结构的,找出思路来了之后再用爬虫模仿或重写就行了。如果你解进去了,那么间接模仿的形式效率会高十分多,这外面就须要一些 JavaScript 根底了,当然有些网站加密逻辑做的太牛逼了,你可能花一个星期也解不进去,最初放弃了。那这样解不进去或者不想解,那咋办呢?这时候能够有一种简略粗犷的办法就是间接用模仿浏览器的形式来爬取,比方用 Puppeteer、Pyppeteer、Selenium、Splash 等,这样爬取到的源代码就是真正的网页代码,数据天然就好提取了,同时也就绕过剖析 Ajax 和一些 JavaScript 逻辑的过程。这种形式就做到了可见即可爬,难度也不大,同时模仿了浏览器,也不太会有一些法律方面的问题。但其实前面的这种办法也会遇到各种反爬的状况,当初很多网站都会去辨认 webdriver,看到你是用的 Selenium 等工具,间接干掉或不返回数据,所以你碰到这种网站还得来专门解一下这个问题。 多过程、多线程、协程下面的状况如果用单线程的爬虫来模仿是比较简单的,然而有个问题就是速度慢啊。爬虫是 IO 密集型的工作,所以可能大多数状况下都在期待网络的响应,如果网络响应速度慢,那就得始终等着。但这个空余的工夫其实能够让 CPU 去做更多事件。那怎么办呢?多开点线程吧。所以这时候咱们就能够在某些场景下加上多过程、多线程,尽管说多线程有 GIL 锁,但对于爬虫来说其实影响没那么大,所以用上多过程、多线程都能够成倍地进步爬取速度,对应的库就有 threading、multiprocessing 了。异步协程就更牛逼了,用 aiohttp、gevent、tornado 等等的基本上你想搞多少并发就搞多少并发,然而还是悠着点,别把人家网站搞挂了。总之,用上这几个,爬虫速度就提上来了。但速度提上来了不肯定是坏事,反爬接着必定就要来了,封你 IP、封你账号、弹验证码、返回假数据,所以有时候龟速爬仿佛也是个解决办法? 分布式多线程、多过程、协程都能减速,但究竟还是单机的爬虫。要真正做到规模化,还得来靠分布式爬虫来搞。分布式的外围是什么?资源共享。比方爬取队列共享、去重指纹共享等等。咱们能够应用一些根底的队列或组件来实现分布式,比方 RabbitMQ、Celery、Kafka、Redis 等等,但通过很多人的尝试,本人去实现一个分布式爬虫,性能和扩展性总会呈现一些问题,当然特地牛逼的除外哈。不少企业外部其实也有本人开发的一套分布式爬虫,和业务更严密,这种当然是最好了。当初支流的 Python 分布式爬虫还是基于 Scrapy 的,对接 Scrapy-Redis、Scrapy-Redis-BloomFilter 或者用 Scrapy-Cluster 等等,他们都是基于 Redis 来共享爬取队列的,总会多多少少遇到一些内存的问题。所以一些人也思考对接到了其余的音讯队列下面,比方 RabbitMQ、Kafka 等等,解决一些问题,效率也不差。总之,要进步爬取效率,分布式还是必须要把握的。 ...

December 10, 2020 · 1 min · jiezi

关于大数据:抖音爬虫教程AndServerService-打造-Android-服务器实现-so-文件调用

so 文件调用随着 Android 挪动平安的高速倒退,不论是为了执行效率还是程序的安全性等,要害代码下沉 native 层已成为基本操作。native 层的开发就是通指的 JNI/NDK 开发,通过 JNI 能够实现 java 层和 native 层(次要是 C/C++ )的互相调用,native 层经编译后产生 so 动态链接库,so 文件具备可移植性广,执行效率高,保密性强等长处。那么问题来了,如何调用 so 文件显得异样重要,当然你也能够间接剖析 so 文件的伪代码,利用强悍的编程功底间接模仿要害操作,然而我想对于普通人来说头发还是比拟重要的。 以后调用 so 文件的支流操作应该是: 1,基于 Unicorn 的各种实现(还在学习中,暂且不表)  2,Android 服务器的搭建,在 App 内起 http 服务实现调用 so 的需要(当然前提是过了 so 的效验等操作)至于为什么选用 AndServer,好吧,不为什么,只是因为搜寻到了它  为什么联合 Service,在学习 Android 开发的时候理解到了 Service 的生命周期,集体了解用 Service 去创立 Http 服务比拟好。 当然也有 Application 的简略应用,因为在正式环境中,大多数 so 文件的逻辑中都有 context 的一些包名了,签名了的效验等,自定义 Application 的话获取 context 传参就好了。 libyemu.so 简介这是我编译好的一个 so 文件,就是依据入参做下简略的字符串拼接(以下是 native 层编译前的 c 代码) ...

December 10, 2020 · 3 min · jiezi

关于大数据:抖音协议-XGorgon-0408-和8408-算法定位查找过程笔记抖音爬虫必看

介绍:本次剖析抖音版本:13.3    X-Gorgon版本:0408  和 8408  可测试本次间接开始解说剖析0408和8408的区别。至于逆向记录能够参考我之前的文章!小编自恋一下,逆向大神 属于逆向爱好者,如须要交换技术或者算法请在评论区留言如果最近更新了新版抖音的app的人应该曾经发现了,抖音安卓版的xg算法结尾也变成了8408结尾,因为84结尾之前都是ios平台上的xg算法,到目前为止,IOS平台的xg还是8404结尾。最近抖音更新到13.x版本当前,抓包会发现,xg变成了8408结尾。我一开始是诧异,怎么当初安卓端也开始跟ios端的xg算法一样了?于是我下功夫钻研了一下。发现了猫腻所在。**如下图    抖音app先是检测了你的手机cpu架构,是x86还是armeabi,通过cpu架构的不同来调用so内不同的xg办法,所以导致当初最新版抖音app的xg算法有0408和8408两种。两种都是最新版,因为我发现当我应用oppo手机装置最新版抖音抓包的xg是8408,而当我用小米或者华为装置最新版抖音,抓包当前发现xg是0408。下图是X-Gorgon具体的校验逻辑。  总结        以上就是对抖音对一个简略的x-gorgon的剖析笔记过程,心愿可能有所帮忙,也可能对本身的产品安全方面进行一个参考借鉴。 TiToData:业余的短视频、直播数据接口服务平台。更多信息请分割: TiToData笼罩支流平台:抖音,快手,小红书,TikTok,YouTube

December 9, 2020 · 1 min · jiezi

关于大数据:快手协议ulog快手did注册激活sig3爬虫抓取签名加密算法

快手多个版本sig3参数逆向剖析目前已更新:7.27.67.7版本咱们须要剖析的是sig3参数,所以间接在ida中搜寻是否有相干的援用,具体细节略过,有不懂的能够加我交换咱们先看一下大略流程。sig3的复杂程度曾经超过dy了,包含动静库加载的形式。jniOnload倒不须要花太大工夫钻研,间接hook register办法就能拿到doCommandNative的函数地址。还有就是外面大概率有一些花指令要写脚本修复一下,要害的是doCommandNative外部的依据command转发的函数地址是动静注册的,过后钻研的时候他们的签名没有用VMP,次要还是花指令和代码收缩要花些工夫解决。 TiToData:业余的短视频、直播数据接口服务平台。更多信息请分割: TiToData笼罩支流平台:抖音,快手,小红书,TikTok,YouTube

December 9, 2020 · 1 min · jiezi

关于大数据:数据系统架构6BI数据展示平台

6.BI数据展现平台一、序在有了数仓、实时、离线的数据之后,咱们须要一个数据展现剖析的平台。如果为了节约老本这部分咱们能够是应用一些开源的BI平台,比方cboard、或者在此基础之上做一些定制化二次开发;另外能够应用一些商用的BI零碎,比方FineBI、Tableau、Power BI等一些比拟成熟的BI平台;当然咱们也能够本人研发BI平台,应用echarts、highcharts、D3等数据图表展现工具,来设计本人的BI零碎。三种形式的比照如下: 自由度:自研>开源BI>商用BI开发成本:自研>商用BI>开源BI难度:自研>开源BI>商用BI 在理论工作过程中,须要依据公司状况抉择适合的BI零碎,在三类当中做取舍。咱们这边采纳了自研BI与开源BI零碎相结合的形式,做数据的展现与剖析,最大水平上保证系统的可控度,来反对一些特定性能的开发与反对。 二、BI分类自研型须要投入肯定的开发资源,设计与开发对应的展现零碎,解决各种数据查问与展现问题,这种最大的长处就是所有性能都能够设计与定制化,前期保护起来比拟不便,学习老本绝对较低。如果对应的零碎做的通用性比拟好,那么之后能够倒退成商用BI或开源BI。 开源BI(上图为cboard)开源的零碎次要是应用起来比拟不便,服务部署上开箱即用,如果没有什么非凡的需要,那么间接就能够投入生产应用。同时也防止了开发资源的投入,反复造轮子。在开源BI上做二次开发,也能够满足一些定制化的需要,学习老本略微高一点。 商用BI零碎商用的各类BI零碎,曾经绝对比拟成熟了,性能非常弱小,通过配置各类数据源,能够进行各种多维摸索式剖析。商用BI是体验与应用最不便的,定制化最不不便的一类,如果须要定制化性能那可能价格不菲。 三、自研BI零碎设计做自研的BI零碎,个别都是从定制化开发的报表开始的,一个报表对应一套前端后端性能,这样堆砌的性能不方便管理与前期保护,所以咱们要设计一套生成配置报表展现的零碎,也就是自研BI零碎。 BI零碎个别设计都是先配置数据源、定义数据集、配置数据报表、组合成看板,由这4个步骤来实现数据的展现看板的配置,最终由对应的业务人员来应用对应的报表来剖析业务,为业务决策提供数据反对。 1.离线第一版:面向指标 最开始咱们设计了一版,应用指标来组成报表,反对各类图表展现。整体关系如上图所示,咱们保护了库、表、表字段、指标的信息。而后通过咱们配置的信息自定义图表展现,组合成看板。 指标关联:对于雷同维度的表下的指标能够自由组合造成数据报表,判断维度雷同须要保障2个数据表的维度个数、维度具体字典配置等信息雷同。 最终在这套元信息的根底上造成了外围看板、数据分析看板等,实时看板的配置是一样的逻辑,减少了数据定时刷新的机制。另外目前只反对mysql的数据源配置,实时局部后续大部分数据存储在了hbase当中,应用另外一套元数据管理与实时统计局部买通实现实时数据元信息保护与报表配置。 整体成果如下: 第二版:面向数据表/数据集 第一版设计的面向指标管理系统,因为指标治理没有推广应用,没有从根本上解决指标口径的问题,如果可能推广和齐全依照标准应用,那么这套指标管理系统最终就演化成是之前介绍的数据系统架构-4.指标定义零碎 因为在应用的过程中,面向指标的指标没有理论应用起来,在后续的配置应用过程当中指标的配置就变的冗余与鸡肋,所以在第二版当中咱们把一个数据表当成一个数据集,通过数据集之间的组合配置造成数据报表。 2.实时实时看板的配置剖析,因为存储数据源的不同,咱们依据存储的不同设计对接了不同的数据源,比方hbase数据源,定义了形容hbase数据源的元信息。对接了实时统计零碎的数据后果。如果大量实时数据存储在mysql当中,能够应用离线的看板配置去配置展现看板,反对定时刷新数据。 3.挪动端优化兼容因为挪动端看数据的需要一直加强,为此咱们对挪动端展现页面进行了优化,更加的贴合挪动端数据展现,晋升整体用户的数据感官体验。成果如下: 四、数据散发BI平台除了提供报表的配置展现之外,还须要反对数据的散发,触达到数据应用方的各个终端,满足多样化的数据应用场景。比方依据须要能够定制报表邮件、短信揭示、企业微信数据播报等。 五、优化降级presto:前期咱们引入了presto减少数据查问与剖析能力;数据规范对接服务:打造一套标准化的数据进口服务,能够对接各类数据利用、提供给线上业务应用。 上一篇 《数据系统架构-5.实时离线统计零碎》

December 8, 2020 · 1 min · jiezi

关于大数据:在大数据时代我们缺乏的到底是思维还是能力

大学最重要的事件应该是锤炼自学的能力、造就自律的心性。 工作后,最重要的事件应该是执行力MAX的可靠性以及谨严处事的态度。 仿佛每件事都会有专门的目标性。 然而,工作久了,难免会“学会偷懒”,不再像从前哐哧哐哧就开始无想法的口头。 1.循序渐进固化思维在遇到采集数据异样排查问题时,W总是习惯于从文件系统拉取log日志进行查问,然而采集机器数少则十几台,多则成千盈百 不是吧不是吧,这种耗时费劲的事件,不会真的有人这么干吧?想必除了想要摸鱼的人,不会有人傻到大批量拉取日志进行剖析。正解:能够借助于Hive or Flink集群建表SQL剖析,效率更高。( 当然,有更方便快捷的形式欢送举荐。)2.从零造轮子为哪般有工具能够辅助疾速解决问题,然而常常习惯于本人从零造轮子? 没错,说的就是你,有极速模式,为何要采纳惯例流程模式呢?难道是不想有本人的闲暇工夫充电学习?难道说你是在成心放松,给你迁延工作量,从而有工夫跳槽走位???正解:咱们能够学习架构原理,使用思维,发散学习。(比方二叉树的中序遍历能够使用到自助式ETL中的表达式聚合计算中)3.架构缺点补丁一直小文件合并性能,采纳单纯的JAVA服务本人实现,每天均匀有80W+的小文件合并任务量??? 如果数据都是存储在HDFS上的,那么你的NameNode压力是要多大啊?大量小文件问题根本原因还是架构设计有问题,如果日志切分正当,小文件量是极其少的。所以,你的工作量就是本人造就了架构问题,而后在此基础之上再开发一套服务来做小日志文件归并?他人从简单入简,而你是从简略到简单。(莫非你是安琪拉?要“缝缝补补又是一年?”)那么,你的思维是什么?是为了彰显你的研发能力以及代码量而生的吗?正解:敢于推倒架构设计,架构师不是神人,也会有架构破绽以及有余点,要以倒退眼光对待问题,而不是尊敬。(毕竟活在前人暗影下很累。)4.随声附和普度众生随声附和,技术选型素来都是拍脑袋 or 看了几篇博客??? 不经大脑思考或者浅尝辄止就自认为一目了然某门技术?是骡子是马敢拉进去溜溜吗?走两步?随声附和?如果没有本人想法就坦言,缓缓造就本人的意识,而不是人云亦云。(要有对外我是“辅助位”,对内深藏不露。)张口就来?这个用Flink?这个用Clickhouse?这个用RabbitMQ?你调研了吗?有数据根据吗?请收回来你的测试报告以及数据凭证。正解:往往最站不住脚的是空口无凭。聪慧的人,会间接收回上帝之手(有数据+测试报告),让你有力反驳。5.如法炮制乐此不疲常常会遇到一类人,总喜爱如法炮制,一个计划解万千难题。 你可否思考过在同一套架构模式下,前后二者数据量级 or 数据埋点相干的差距?你可否思考过在同一套代码逻辑下,前后二者producer-consumer部署计划不同会有所差异?你可否思考过在用一个HQL ETL问题时,前后时间跨度曾经截然不同(一年前和一年后数据量差距有多大?dt范畴有多大?)?正解:世间没有银弹。咱们总是习惯于如法炮制,一套办法冠以多用,然而往往得失相当。说了这么多,其实只是想表白一个点:多思考,多复盘,多反思,跳出极限。

December 8, 2020 · 1 min · jiezi

关于大数据:Hive性能调优工具

HQL提供了两个查看查问性能的工具:explain与analyze,除此之外Hive的日志也提供了十分具体的信息,不便查看执行性能和报错排查。 工具一:explainexplain语句是查看执行打算常常应用的一个工具,能够应用该语句剖析查问执行打算,具体应用语法如下: EXPLAIN [FORMATTED|EXTENDED|DEPENDENCY|AUTHORIZATION] hql_query 其中,关键字的含意: FORMATTED:对执行打算进行格式化,返回JSON格局的执行打算EXTENDED:提供一些额定的信息,比方文件的门路信息DEPENDENCY:以JSON格局返回查问所依赖的表和分区的列表,从Hive0.10开始应用,如下图AUTHORIZATION:列出须要被受权的条目,包含输出与输入,从Hive0.14开始应用,如下图 一个典型的查问执行打算次要包含三局部,具体如下: Abstract Syntax Tree (AST):形象语法树,Hive应用一个称之为antlr的解析生成器,能够主动地将HQL生成为形象语法树Stage Dependencies:会列出运行查问所有的依赖以及stage的数量Stage Plans:蕴含了十分重要的信息,比方运行作业时的operator 和sort orders比方: EXPLAIN SELECT cc_call_center_id, count(*) FROM tpcds_bin_partitioned_parquet_30.call_center WHERE cc_call_center_sk = 2 GROUP BY cc_call_center_id LIMIT 2;查看执行打算:STAGE DEPENDENCIES: Stage-1 is a root stage Stage-0 depends on stages: Stage-1 STAGE PLANS: Stage: Stage-1 Map Reduce Map Operator Tree: TableScan alias: call_center filterExpr: (cc_call_center_sk = 2) (type: boolean) Statistics: Num rows: 6 Data size: 186 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: (cc_call_center_sk = 2) (type: boolean) Statistics: Num rows: 3 Data size: 93 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: cc_call_center_id (type: string) outputColumnNames: cc_call_center_id Statistics: Num rows: 3 Data size: 93 Basic stats: COMPLETE Column stats: NONE Group By Operator aggregations: count() keys: cc_call_center_id (type: string) mode: hash outputColumnNames: _col0, _col1 Statistics: Num rows: 3 Data size: 93 Basic stats: COMPLETE Column stats: NONE Reduce Output Operator key expressions: _col0 (type: string) sort order: + Map-reduce partition columns: _col0 (type: string) Statistics: Num rows: 3 Data size: 93 Basic stats: COMPLETE Column stats: NONE TopN Hash Memory Usage: 0.1 value expressions: _col1 (type: bigint) Reduce Operator Tree: Group By Operator aggregations: count(VALUE._col0) keys: KEY._col0 (type: string) mode: mergepartial outputColumnNames: _col0, _col1 Statistics: Num rows: 1 Data size: 31 Basic stats: COMPLETE Column stats: NONE Limit Number of rows: 2 Statistics: Num rows: 1 Data size: 31 Basic stats: COMPLETE Column stats: NONE File Output Operator compressed: false Statistics: Num rows: 1 Data size: 31 Basic stats: COMPLETE Column stats: NONE table: input format: org.apache.hadoop.mapred.SequenceFileInputFormat output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe Stage: Stage-0 Fetch Operator limit: 2 Processor Tree: ListSink ...

December 8, 2020 · 2 min · jiezi

关于大数据:抖音爬虫教程简单采集数据菜鸟必看

抖音App和服务端交互应用的是HTTPS协定,应用Fiddler很容易能够捕捉到数据,如下图所示。不过想要本人模仿一个无效的申请可不是那么容易了,因为它应用了签名机制,在所有申请中都有as和cp两个签名参数,除非得悉签名算法否则咱们无奈结构出无效的申请。这里咱们应用模仿操作抖音App的形式,让App帮咱们收回无效的申请,而后咱们拦挡服务器的HTTP应答数据,再从中提取咱们感兴趣的信息。上面联合一个理论的案例介绍下整个过程,依据客户的需要,要采集一些指定用户加关后的零碎举荐“你可能感兴趣”的数据(如下图所示)用于商品营销。点击“查看更多”能够看到更多的零碎举荐用户列表数据,如下图所示。咱们按如下步骤模仿操作App:1.启动抖音。2.点击搜寻按钮。3.输出搜寻关键词(抖音用户ID),点击搜寻。4.找到匹配的用户,点击关注。5.点击零碎举荐“查看更多”,模仿屡次向上滑动屏幕,直至数据加载结束(屏幕呈现“临时没有更多了”)。于此同时,咱们应用抓包脚本(能够应用Fiddler的Customize Rules,也能够应用Mitmproxy),捕捉并过滤URL中含有/user/recommend/的HTTP应答数据,从JSON数据中提取零碎举荐的用户信息(如下图所示)。模仿操作抖音App的脚本外围代码如下所示:view plaincopy to clipboardprint? from com.dtmilano.android.viewclient import ViewClientdef search_douyin_for_recommend_user(douyin_id):# 采集指定抖音账号的关注举荐数据# 连设施serialno = Noneif serialno: os.system('adbconnect{}'.format(serialno or '')) time.sleep(3) device, serialno = ViewClient.connectToDeviceOrExit(serialno=serialno) vc = ViewClient(device, serialno, autodump=False) # 强制敞开抖音 log(u'强制敞开抖音.') device.shell('am force-stop com.ss.android.ugc.aweme') time.sleep(2) # 启动抖音 log(u'启动抖音.') device.shell('am start -n com.ss.android.ugc.aweme/.main.MainActivity') time.sleep(5) # 暂停视频播放 log(u'点击屏幕,暂停视频播放.') device.touch(514, 1048) # 点击搜寻按钮 vc.dump() search_btn = vc.findViewById('com.ss.android.ugc.aweme:id/amj') if search_btn: log(u'点击搜寻按钮,跳转到搜寻页面.') search_btn.touch() vc.dump() # 点击搜寻输入框 search_input = vc.findViewById('com.ss.android.ugc.aweme:id/ad_') if search_input: log(u'点击搜寻框,筹备输出关键词.') search_input.touch() # 输出抖音ID log(u'输出搜寻关键词: {}.'.format(douyin_id)) device.type(douyin_id.encode('UTF-8')) # 点击搜寻按钮 search_btn = vc.findViewById('com.ss.android.ugc.aweme:id/cp8') if search_btn: log(u'提交搜寻.') search_btn.touch() time.sleep(2) vc.dump() ## 切换到用户 # user_tab = vc.findViewWithText(u'用户') # user_tab.touch() # 找到匹配的 matches = [] def find_matches(view): if view.getClass() == 'android.widget.TextView': text = view.getText() if douyin_id.lower() in text.lower(): # 找到匹配的了 log(u'找到匹配的: {}'.format(text)) matches.append(view) else: # print text pass vc.traverse(transform=lambda view: find_matches(view)) if matches: # 有没有已关注按钮 btn = vc.findViewWithText(u'已关注') if btn: # 先勾销关注 log(u'之前关注过,先勾销关注.') btn.touch() time.sleep(1) user_matched = matches[0] log(u'点击进入个人主页.') user_matched.touch() time.sleep(1) # 点关注 vc.dump() follow_btn = vc.findViewById('com.ss.android.ugc.aweme:id/aei') if follow_btn: # 点击关注 log(u'点击关注') follow_btn.touch() time.sleep(1) # 点击查看更多 vc.dump() viewmore_btn = vc.findViewById('com.ss.android.ugc.aweme:id/bqn') if viewmore_btn: # 点击查看更多 log(u'点击查看更多零碎举荐') viewmore_btn.touch() time.sleep(1) i = 0 while True: # 上滑动 device.drag((345, 1762), (345, 550), duration=100) log(u'上滑以加载更多') i += 1 if i % 5 == 0: # 拖动10次判断一下是否还有更多 vc.dump() if vc.findViewWithText(u'临时没有更多了'): log(u'临时没有更多了, "{}"的关注举荐数据采集结束.'.format(douyin_id)) # 采集胜利了 return True failed_tip = vc.findViewWithText(u'加载失败,点击重试') if failed_tip: log(u'加载失败,点击重试.') failed_tip.touch() else: # 没有找到查看更多按钮 log(u'没有找到查看更多按钮') else: # 没有找到加关注按钮 log(u'没有找到加关注按钮') else: # 没有找到匹配的用户 log(u'没有找到匹配的用户') else: # 没有找到搜寻提交按钮 log(u'没有找到搜寻提交按钮.') else: # 没有找到搜寻输入框 log(u'没有找到搜寻输入框.') else: # 没有找到搜寻按钮 log(u'没有找到搜寻按钮.')上述脚本的运行截图如下所示:最初附上抓取到的局部示例数据:—————————————————————————————————————————— ...

December 8, 2020 · 2 min · jiezi

关于大数据:抖音爬虫教程从0到1爬取抖音用户详细数据

前言爬取抖音用户的数据须要应用用户的user_id和sec_user_id,咱们通过抓包工具获取用户的id以及sec_user_id,而后通过用户的关注列表和follow列表获取更多的用户的user_id和sec_user_id,上面我将介绍一下如何依据user_id和sec_user_id来获取抖音用户的具体数据。 一、剖析申请用户数据的api1. 用户数据抓包首先在搭建好的环境中通过Fiddle抓取用户数据包。 2. 用户数据包剖析2.1. 申请信息剖析 申请头字段字段字段值申请办法GET申请的apiGET前面的申请的协定api前面的,系http1.1申请的目标主机域名aweme-eagle.snssdk.com连贯信息keep-aliveCookie你本人的cookiesAccept-Encoding 编码信息gzipX-SS-QUERIES申请的querytoken你本人的tokensdk版本1User-Agent用户代理X-Khronos咱也不晓得是啥,然而实质上就是个工夫戳X-Gorgon加密验证的局部X-Pods咱也不晓得是啥,然而貌似没有用申请的api剖析咱们晓得了申请的api以及申请头外面都蕴含了哪些信息,咱们就能够通过手动结构对应的申请参数来爬取用户的数据了。我曾经在后面的文章获取到了1W+ 的用户的uid以及sec_user_id的数据了,而后咱们就能够通过这些数据来爬取用户的具体数据。 2.2. 响应信息剖析 二、获取用户数据1.结构申请api在文章《抖音爬虫教程,从0到1,获取抖音用户数据》 咱们曾经介绍了爬取抖音关注列表的api及其构造方法,其实获取用户详细信息和获取用户的关注列表的api基本一致,次要都是须要咱们自行填充用户的user_id以及用户的sec_user_id还有一大堆的工夫戳信息,其余的信息都是不变的。上面咱们结构获取用户详细信息的api def construct_api(user_id, _rticket, ts, sec_user_id): """ api 构造函数 :param user_id: 用户的id :param _rticket: 工夫戳 :param ts: 工夫戳 :param sec_user_id: 用户的加密的id :return: api """ api = "https://aweme-eagle.snssdk.com" \ "/aweme/v1/user/?" \ "user_id={}" \ "&retry_type=no_retry" \ "&iid=1846815477740845" \ "&device_id=47012747444" \ "&ac=wifi&channel=wandoujia_aweme1" \ "&aid=1128&app_name=aweme" \ "&version_code=630" \ "&version_name=6.3.0" \ "&device_platform=android" \ "&ssmix=a&device_type=HUAWEI+NXT-AL10" \ "&device_brand=HUAWEI&language=zh" \ "&os_api=26&os_version=8.0.0" \ "&openudid=b202a24eb8c1538a" \ "&manifest_version_code=630" \ "&resolution=1080*1812" \ "&dpi=480&update_version_code=6302" \ "&_rticket={}" \ "&js_sdk_version=1.16.3.5" \ "&ts={}" \ "&sec_user_id={}" \ "".format(user_id, _rticket, ts, sec_user_id) return api2.结构申请头上文咱们曾经剖析了申请头,申请头的结构也比拟不便,大部分内容都是固定的,须要咱们填充的次要还是几个工夫戳以及对应的X-Gorgon,其中X-Gorgon的构造方法比较复杂,然而要留神填入正确的Cookie和Token你能力取得可用的X-Gorgon,否则你的Gorgon就是不可用的。下图是申请头外面的次要信息:上面我写了一个结构申请头的函数: ...

December 8, 2020 · 2 min · jiezi

关于大数据:抖音爬虫教程从0到1获取抖音用户数据

抖音爬虫教程,从0到1,获取抖音用户数据 前言因为最终目标是要抓取抖音视频数据,而通过抓包发现申请抖音的视频数据都须要对应用户的sec_id,这个加密的id的生成过程咱们是不晓得的,然而咱们能够从抖音用户的数据包中看到对应的sec_id,而且这个加密的id不会变的,所以我能够先爬取用户的数据,但通过用户的关注列表以及粉丝列表获取其余用户的sec_id,晓得了用户的数据,咱们就能够爬取用户的视频数据了。这一篇文章我将介绍抖音用户数据爬取。 一、剖析用户申请包如果你曾经配置好环境(手机上安装好了抖音app并且抓包软件等也都配置好了),就能够开心食用下文,否则请查看环境配置而后再持续本文。 1. 剖析用户数据关上抖音,进入抖音发布者集体页面:(点击右方发布者头像进入发布者集体页面)这个时候咱们查看fiddle抓到的包,咱们发现对应的数据的申请地址都是蕴含“aweme”款式的url,fiddle右上角就是咱们的申请数据,右下角就是对应的响应数据:因为我的爬取思路是依据用户的关注列表爬取关注列表的关注列表,所以我不太关注用户自身的数据,我更感兴趣的是用户的关注列表数据以及粉丝数据,那怎么看用户的关注列表呢?这样咱们就能够看到用户的关注列表了,那么对应的抓包软件抓到的包是什么呢:从图中咱们能够看到follower就是用户的粉丝数据,following就是用户关注的用户。对应的申请头和响应数据如下图所示: 1.1. 申请头剖析咱们首先剖析申请数据:申请数据包含对应的url(也就是api),对应的header数据,其中headers外面有Host、Connection、Cookie、Accept-Encoding、X-SS-QUERIES、X-SS-REQ-TICKET、X-Tt-Token、sdk-version、User-Agent、X-Khronos、X-Gorgon、X-Pods 咱们首先介绍对应的url api = "https://api.amemv.com/aweme/v1/user/follower/list/?" \ # url "user_id={}" \ # user_id 能够在用户关注列表中搞到 "&max_time={}" \ # 以后工夫戳 "&count=20&offset=0&source_type=1&address_book_access=2&gps_access=2" \ # 不重要 "&ts={}" \ # 以后工夫戳 "&js_sdk_version=1.16.3.5&app_type=normal&manifest_version_code=630" \ # 不重要 "&_rticket={}" \ # 以后工夫戳 "&ac=wifi&device_id=47012747444&iid=1846815477740845" \ # 不重要 "&os_version=8.0.0&channel=wandoujia_aweme1&version_code=630" \ # 不重要 "&device_type=HUAWEI%20NXT-AL10&language=zh&resolution=1080*1812&openudid=b202a24eb8c1538a" \ # 不重要 "&update_version_code=6302&app_name=aweme&version_name=6.3.0&os_api=26&device_brand=HUAWEI&ssmix=a" \ # 不重要 "&device_platform=android&dpi=480&aid=1128" \ # 不重要 "&sec_user_id={}"\ # 加密的uid 能够在用户关注列表中搞到 ".format(user_id, max_time, ts, _rticket, sec_user_id)依据下面的api,咱们发现大部分的数据咱们是能够结构的,只有user_id以及加密的sec_user_id咱们无奈本人结构,然而咱们能够通过用户的关注列表中获取到它关注的所有的用户的user_id和sec_user_id,所以咱们只须要晓得一个用户的user_id和sec_user_id,咱们就能够获取和他关联的用户以及和他关联的用户的用户的user_id和sec_user_id。 ...

December 8, 2020 · 2 min · jiezi

关于大数据:抖音协议抖音数据采集中的加解密算法实现

iOS版抖音协定中的加解密算法实现前两年的工作中波及到抖音协定的剖析局部,剖析了两个跟加密无关的接口,我的项目完结了,现拿进去与大家分享因为我的项目完结,最新版本是否有改变不分明了,过后测试可用的抖音版本:IOS 1.7.8-3.8.0 1.设施信息生成计划:设施信息中有几个重点:(1) carrier、display_name字段:这个字段不是utf-8编码,是GBK编码,要做编码转换(2) Idfa、VendorID字段:规范UUID算法生成即可(3) Openudid:这个中央有点头疼,依据所有公开材料,包含抖音本人的代码逆向,都能够看进去实际上是随机生成的,然而随机的没法通过服务器校验,最初应用了真Openudid替换掉两头16字节的办法,服务器通过率在60%左右 2./service/2/device_register/接口加密算法:device_register接口中post包体是加密的,算法实际上是AES,然而不晓得为何规范AES实现跑进去的后果不对,不过没关系,间接从IDA伪代码里扒进去即可,两头有5处要修复xray的寄存器解析谬误。 3.MAS、AS、TS算法:这部分最头疼,花了很多工夫始终想脱机跑,首先伪代码难以修复,因为有两个问题没法解决,1.ios的native API调用(例如线程锁) 2.类的上下文没法初始化,而后Unicorn模仿汇编代码也是一样的问题,没法解决native API调用,最初采纳了Hook抖音app的encryptDataWithTimeStamp:parameters函数,而后在Hook代码中阻塞线程,跑个webserver,让抖音app本人初始化类并且筹备上下文,而后webserver负责解决加解密,并且返回MAS AS TS 源码构造简略阐明:1.API是所有加解密的接口,负责给其余须要抖音加解密的业务提供加解密服务,用golang+C混编实现,device_reg的加解密是C写的库文件,通过调用桥调用so,下个局部会阐明。2.aweme-aes是device_reg的加解密实现,纯C代码,编译进去是so库,供下面下面的API调用。3.ios_aweme_lib的性能是golang->抖音app2lib的桥接,调用流程是API ->ios_aweme_lib ->抖音lib,因为晚期的计划是把抖音app2lib,而后通过golang写的webserver(穿插编译到ios)调用这个桥接库,而后调用抖音app,实现encryptDataWithTimeStamp,起初间接采纳阻塞app跑webserver的计划后废除了。4.ios_webserver,这是Hook抖音app并阻塞encryptDataWithTimeStamp而后跑webserver的实现,框架是monkeydev,框架代码没上传,github上有搜monkeydev就行。 —————————————————————————————————————————— TiToData:业余的短视频、直播数据接口服务平台。更多信息请分割: TiToData笼罩支流平台:抖音,快手,小红书,TikTok,YouTube

December 7, 2020 · 1 min · jiezi

关于大数据:浅谈安卓抖音协议-抖音设备注册

抖音最近退出了风控,大大限度了数据拉取的胜利度,解决这个问题很辣手,具体本人摸索。同时抖音增强了对SO的加密,即便修复ida堆栈,也是jumpout,大大晋升了代码追踪的繁琐度,所以最新版的SO还没有深刻跟进剖析。 那么回到明天的话题,抖音的设施如何注册其实网上曾经有公开的材料确实可行,咱们陈词滥调,简略的聊一下思路逻辑一:首先通过抓包找到接口地址http://log.snssdk.com/service/2/device_register二:通过JDAX对源代码的剖析,咱们能够发现它先通过GZIP压缩,再TTEncryptUtils加密,最初POST发送进来申请而后X-SS-STUB,发现它只是一个对post的body局部的md5三:最初咱们能够拼装属于本人的申请包—————————————————————————————————————————— TiToData:业余的短视频、直播数据接口服务平台。更多信息请分割: TiToData笼罩支流平台:抖音,快手,小红书,TikTok,YouTube

December 7, 2020 · 1 min · jiezi

关于大数据:Flume接入Hive数仓搭建流程

实时流接入数仓,根本在大公司都会有,在Flume1.8当前反对taildir source, 其有以下几个特点,而被宽泛应用: 1.应用正则表达式匹配目录中的文件名2.监控的文件中,一旦有数据写入,Flume就会将信息写入到指定的Sink3.高牢靠,不会失落数据4.不会对跟踪文件有任何解决,不会重命名也不会删除5.不反对Windows,不能读二进制文件。反对按行读取文本文件本文以开源Flume流为例,介绍流接入HDFS ,前面在其下面建设ods层表面。 1.1 taildir source配置a1.sources.r1.type = TAILDIRa1.sources.r1.positionFile = /opt/hoult/servers/conf/startlog_position.jsona1.sources.r1.filegroups = f1a1.sources.r1.filegroups.f1 =/opt/hoult/servers/logs/start/.*log1.2 hdfs sink 配置a1.sinks.k1.type = hdfsa1.sinks.k1.hdfs.path = /user/data/logs/start/logs/start/%Y-%m-%d/a1.sinks.k1.hdfs.filePrefix = startlog.# 配置文件滚动形式(文件大小32M)a1.sinks.k1.hdfs.rollSize = 33554432a1.sinks.k1.hdfs.rollCount = 0a1.sinks.k1.hdfs.rollInterval = 0a1.sinks.k1.hdfs.idleTimeout = 0a1.sinks.k1.hdfs.minBlockReplicas = 1# 向hdfs上刷新的event的个数a1.sinks.k1.hdfs.batchSize = 100# 应用本地工夫a1.sinks.k1.hdfs.useLocalTimeStamp = true 1.3 Agent的配置a1.sources = r1a1.sinks = k1a1.channels = c1# taildir sourcea1.sources.r1.type = TAILDIRa1.sources.r1.positionFile = /opt/hoult/servers/conf/startlog_position.jsona1.sources.r1.filegroups = f1a1.sources.r1.filegroups.f1 = /user/data/logs/start/.*log# memorychannela1.channels.c1.type = memorya1.channels.c1.capacity = 100000a1.channels.c1.transactionCapacity = 2000# hdfs sinka1.sinks.k1.type = hdfsa1.sinks.k1.hdfs.path = /opt/hoult/servers/logs/start/%Y-%m-%d/a1.sinks.k1.hdfs.filePrefix = startlog.# 配置文件滚动形式(文件大小32M)a1.sinks.k1.hdfs.rollSize = 33554432a1.sinks.k1.hdfs.rollCount = 0a1.sinks.k1.hdfs.rollInterval = 0a1.sinks.k1.hdfs.idleTimeout = 0a1.sinks.k1.hdfs.minBlockReplicas = 1# 向hdfs上刷新的event的个数a1.sinks.k1.hdfs.batchSize = 1000# 应用本地工夫a1.sinks.k1.hdfs.useLocalTimeStamp = true# Bind the source and sink to the channela1.sources.r1.channels = c1a1.sinks.k1.channel = c1 /opt/hoult/servers/conf/flume-log2hdfs.conf ...

December 6, 2020 · 2 min · jiezi

关于大数据:算法如何理解递归写好递归函数

不是每个程序员天生对递归了解粗浅,刚入大一时候,当他人写出第一个求最大公约数的递归函数时,对其如许的惊叹,居然能够不必循环,居然代码能够这么简洁,的确递归在大多数状况下实现时候代码很短,大部分人也晓得递归,也能根本看懂递归,可是却常常不晓得怎么写,或者写进去的递归常常死循环,写算法往往也是学的是套路,只有极少数人是发明算法的,大部分人是用算法的,而递归是的确有套路可循的。 本文即从递归的扎马步开始,从几个简略例子到通用套路,一步一步拆解递归 1 递归的三要素写递归,就是写三要素的实现,三要素别离为函数,边界,递推公式,刚开始只有记住要这么写,写几个算法之后,就能缓缓明确为什么要这样搞。 1.1 递归首要元素-函数明确你的函数是干什么用的,函数的入参应该是什么,返回值是什么,这三个问题,先从函数是干什么用的开始,你能够定义一个函数f() 假如曾经实现了每一步递归的实现,再去明确这个实现 到底做了什么,入参至多要什么,返回值和参数返回能够了解为是一个货色,都是为了返回给下层调用或者全局的一个数据,想分明函数的三个因素,那你的函数就定义好了。 1.2 递归边界、跳出递归同样,先这样去做,再去想为什么,这一步要判断的就是函数的入参,入参的null ,入参为初始值,比方斐波那契数列的前1位或者2位,开始时候可能不肯定想的齐全,那没关系,上面的一步还会持续欠缺,所以我这里举得例子是斐波那契的前1或2位,而不是间接说论断,这一步骤是在函数的实现外面,所以思考形式就是假如,入参到了临界值或者初始值,或者非凡值,你要判断一下,第一遍写的时候比方斐波那契,能够间接这么写 if (n == 1) return 1;if (n == 2) return 1; 想到的不肯定齐全对,或者那么地很优雅, 没关系,只有想到要思考边界就能够了。上面就是想边界的意义是什么?有两点,其一,异样值边界,其二递归完结判断,比如此题中的n < 0 怎么办,和 n == 1 和 n == 2 就别离对应后面说的,当然这两点可能思考不那么齐全,假如你只思考了像后面代码中的,或者写边界时候发现写的多了,或者冗余了,这样不影响程序的后果,那么写完递推公式,咱们再来回顾边界问题。 1.3 递推公式这个就要先谈意义,再谈实现了,意义在于逐步缩小算法的规模,或者定义一种形式让输出的值尽可能地凑近临界值,也就是找一个关系f(n) 与 f(n-x)序列的关系,f(n) 代表要解决的问题规模,f(n-x) 比n小的问题规模的函数值,这是递归函数中的要害一步,没有递推公式,就没有递归。例如斐波那契序列,中的递推公式是f(n)=f(n-1) + f(n-2)咱们来察看这个公式,发现其第n 于 n-1 和 n-2 有关系,所以咱们来看,如果输出任何整数,那么n-1,n-2 可能取值是正数,0,1+,能够看到边界0和正数没有思考在内,所以,这时回顾后面1.2 的递归,咱们来补充一下边界后失去: if (n <= 2) return 1;2 递归的案例上面通过三个简略例子,咱们来练习应用递归,别离是青蛙跳台阶问题,等同于斐波那契序列,递归形式反转单链表,递归遍历树,以及针对三个 2.1 青蛙跳台阶问题第一定义函数,明确函数只有一个惟一的输出值n ,第二找到递归完结条件或者递归边界,能够发现当台阶是1或者2时候最容易失去,至于递推式,能够发现青蛙在每次跳的时候有两种跳法,那青蛙怎么达到第n 个台阶,就是有两种跳法,别离对应f(n-1) 和 f(n-2) ,所以递归式就是f(n)=f(n-1)+f(n-2) ,那么整个算法就是如下: //一只青蛙一次能够跳上1级台阶,也能够跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。//1。定义函数public int f2(int n) { //2.确定边界 if (n == 1) return 1; if (n == 2) return 2; //3.确定递归式 return f2(n-1) + f2(n-2);}持续查看边界,发现n如果小于1,就会陷入死循环,那么程序能够改成这样: ...

December 6, 2020 · 2 min · jiezi

关于大数据:使用Nginx做页面采集-Kafka收集到对应Topic

0.架构简介模仿线上的实时流,比方用户的操作日志,采集到数据后,进行解决,临时只思考数据的采集,应用Html+Jquery+Nginx+Ngx_kafka_module+Kafka来实现,其中Ngx_kafka_module 是开源的专门用来对接Nginx和Kafka的一个组件。 1.需要形容1.1 用html和jquery 模仿用户申请日志其中包含上面上面几项: 用户id:user_id, 拜访工夫:act_time, 操作: (action,包含click,job_collect,cv_send,cv_upload) 企业编码job_code 1.2 用Nginx承受1.1中的申请1.3 承受完申请后,应用ngx_kafka_module将数据发送到Kafka的主题tp_individual 中。1.4 在kafka中应用一个消费者生产该主题,察看2.搭建步骤2.1 Kafka装置因为应用现成的已装置好的docker-kafka镜像,所以间接启动即可. 2.2 装置Nginx,并启动$ cd /usr/local/src$ git clone git@github.com:edenhill/librdkafka.git# 进入到librdkafka,而后进行编译$ cd librdkafka$ yum install -y gcc gcc-c++ pcre-devel zlib-devel$ ./configure$ make && make install$ yum -y install make zlib-devel gcc-c++ libtool openssl openssl-devel$ cd /opt/hoult/software# 1.下载$ wget http://nginx.org/download/nginx-1.18.0.tar.gz# 2.解压$ tar -zxf nginx-1.18.0.tar.gz -C /opt/hoult/servers# 3. 下载模块源码$ cd /opt/hoult/software$ git clone git@github.com:brg-liuwei/ngx_kafka_module.git# 4. 编译$ cd /opt/hoult/servers/nginx-1.18.0$ ./configure --add-module=/opt/hoult/software/ngx_kafka_module/$ make && make install # 5.删除Nginx安装包$ rm /opt/hoult/software/nginx-1.18.0.tar.gz# 6.启动nginx$ cd /opt/hoult/servers/nginx-1.18.0$ nginx 3.相干配置3.1 nginx配置nginx.conf#pid logs/nginx.pid;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; kafka; kafka_broker_list linux121:9092; server { listen 9090; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; #------------kafka相干配置开始------------ location = /kafka/log { #跨域相干配置 add_header 'Access-Control-Allow-Origin' $http_origin; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; kafka_topic tp_individual; } #error_page 404 /404.html; }}3.2 启动kafka 生产者和消费者# 创立topickafka-topics.sh --zookeeper linux121:2181/myKafka --create --topic tp_individual --partitions 1 --replication-factor 1# 创立消费者kafka-console-consumer.sh --bootstrap-server linux121:9092 --topic tp_individual --from-beginning# 创立生产者测试kafka-console-producer.sh --broker-list linux121:9092 --topic tp_individual 3.3 编写Html + Jquery代码<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1,shrink-to-fit=no"> <title>index</title> <!-- jquery cdn, 可换其余 --> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script> </head> <body> <input id="click" type="button" value="点击" onclick="operate('click')" /> <input id="collect" type="button" value="珍藏" onclick="operate('job_collect')" /> <input id="send" type="button" value="投简历" onclick="operate('cv_send')" /> <input id="upload" type="button" value="上传简历" onclick="operate('cv_upload')" /> </body> <script> function operate(action) { var json = {'user_id': 'u_donald', 'act_time': current().toString(), 'action': action, 'job_code': 'donald'}; $.ajax({ url:"http://linux121:8437/kafka/log", type:"POST" , crossDomain: true, data: JSON.stringify(json), // 上面这句话容许跨域的cookie拜访 xhrFields: { withCredentials: true }, success:function (data, status, xhr) { // console.log("操作胜利:'" + action) }, error:function (err) { // console.log(err.responseText); } }); }; function current() { var d = new Date(), str = ''; str += d.getFullYear() + '-'; str += d.getMonth() + 1 + '-'; str += d.getDate() + ' '; str += d.getHours() + ':'; str += d.getMinutes() + ':'; str += d.getSeconds(); return str; } </script></html>将a.html 放在nginx的目录下,浏览器拜访192.168.18.128:9090 ...

December 6, 2020 · 2 min · jiezi

关于大数据:算法双指针问题解决思路

算法中的双指针应用,有时候会感觉很奇妙,解决了很多的问题,有必要演绎总结一下,首先双指针也是个很宽泛的概念,它相似于遍历中的 i 和 j 然而其区别是,两个指针是同时挪动的,即没有奉献复杂度从O(N) 到 O(N*N) ,所以被很多算法大佬所推崇,所以基于此演绎总结出双指针的常见解法和套路。 1.题型演绎这里将题型演绎为三种,别离如下: 快慢指针(前后按不同步调的两个指针)前后双端指针(一个在首,一个在尾部,向两头聚拢)固定距离的指针(以i, i + k的间距的两个指针)后面讲到,这三种指针都是遍历一次数组即可实现,其工夫复杂度低于或者等于O(N) ,空间复杂度是O(1) 因为就两个指针存储。 2.常见题型2.1快慢指针相当经典的一道题: 判断链表是否有环-通过步调不统一的两个指针,一前一后一起挪动,直到指针重合了 https://leetcode.com/problems/linked-list-cycle/description,代码片段如下: public boolean hasCycle(ListNode head) { ListNode slow = head; ListNode fast = head; while (slow != null && fast != null) { ListNode n = fast.next; fast = n == null ? null : n.next; if (slow == fast) { return true; } slow = slow.next; } return false; }寻找反复复数,从数组中找出一个反复的整数:https://leetcode-cn.com/problems/find-the-duplicate-number/代码解决如下: ...

December 6, 2020 · 2 min · jiezi

关于大数据:基于done文件的数据监控理论

1 问题除了像Alibaba 的 Dataworks 外,很难有另外的公司可能把数据调度,数据监控,数据血统,元数据管理等作为一体化的平台了,包含我司在内的一些厂,往往把这些建设独立开来,由不同的团队负责,其中数据平台调度性能是绝大多数公司都有的根底平台,然而调度的性能水平就各不同了,上面的问题当作抛砖引玉,指出在生产环境中常遇到的问题,如果后续有产出,前面尽量开源一些代码进去,贴到本博客最初面。 监控从大的层面来说有两种,一种是监控用来拦挡的,即有依赖的,一种只是用来报警和剖析的。 因为依赖接入源较多,以下问题常有产生: 1.1数据延时产出,数据产出空分区,数据品质可能有问题(条数,工夫戳不对)个别处理过程:破费工夫30m+ 解决-延时问题→ 去易创上找依赖图,确认是哪个上游产出表没有产出->复制表名->去数据地图外面找负责人->个别会拉群跟进-->等解决完-->同步或者不同步/关注方→同步产出好了 1.2应用方有意识应用到谬误数据,破费工夫60m + 解决-空分区问题处理过程: 须要对最终的产出标签的散布等进行品质监控,临时没有->如果发现当前->复制表名->去数据地图外面找负责人->个别会拉群跟进-->等解决完-->同步或者不同步/关注方→回溯数据->告诉应用方数据问题 1.3应用方先意识应用到谬误数据破费工夫60m +数据品质问题 (条数,工夫戳)→ 个别只有等标签应用方发现能力意识到->问题复现->复制表名->去数据地图外面找负责人->个别会拉群跟进-->等解决完→同步或者不同步/关注方→同步产出好了 1.4 数据延时产出问题有一些例行的,必须在每天xx点产出的数据,如果没有生成好,就要人为去挨个找上游负责人去找问题,与1.1.3中的问题相似,都是要手动找上游。 2解决思路基于以上问题,咱们发现这些问题,都是监控不欠缺,欠缺的监控应该是怎么样的呢? 在已知问题内,只有给表或者数据的标签散布加了监控,那么当呈现问题时候,能够主动告诉到数据应用方,数据公布方,当问题抛出来给某人当前,他能够抉择,将此次报警置为解决中,后续在xx工夫内解决好,如果解决不好持续报警,然而报警范畴可能更大,比方给负责人经理电话,邮件,短信,拉群艾特等。这样有另外一个益处是数据的sla在肯定水平上保障了,能够过起初查问题,或者在将来的“某些非凡场合”应用到。 需要如上,那么设计 监控独立于调度零碎,与调度零碎惟一的交互是done文件,调度在done文件产出后才继续执行。 1.2.0 为什么基于done文件呢? 工作依赖,对于工作依赖来说,为了对数据源的品质检测,就要对每个工作进行配置工作检测依赖,会有两个问题,其一是工作检测脚本会更扩散,其二,检测逻辑很多是相似的,也会造成脚本冗余 表依赖,检测地位是表的分区,那么当数据品质检测通过后,生成一个表的分区,最终就是相似 dt=xxxx/rule=check_t1_count.done 相似这样 通过add partition 来增加 文件依赖,跟表依赖类似之处就是生成一个done文件,区别之处在于能够间接通过服务来调用生成done,较不便所以选文件依赖 1.2.1 done文件由一个惟一的表名+工作id.done组成 1.2.2 单点报警 + 多层解决报警,如果A表怎么样,B表怎么样,就报警给谁,具体有产出延时,失败报警 3设计开发1.工作信息 2.报警信息 3.表信息 4.监控逻辑表 5.监控与报警关联表 6.监控与表信息与工作信息的关联表 基于SpringBoot的后盾零碎 次要开发,等后续再分享,???????????????????????????????????????????????????? 4将来瞻望退出血统的监控和报警 吴邪,小三爷,混迹于后盾,大数据,人工智能畛域的小菜鸟。更多请关注

December 6, 2020 · 1 min · jiezi

关于大数据:大数据开发Flume频繁产生小文件原因和处理

1.问题背景通过flume间接上传实时数据到hdfs,会常遇到的一个问题就是小文件,须要调参数来设置,往往在生产环境参数大小也不同 1.flume滚动配置为何不起作用? 2.通过源码剖析得出什么起因? 3.该如何解决flume小文件? 2. 过程剖析接着上一篇,https://blog.csdn.net/hu_lichao/article/details/110358689 自己在测试hdfs的sink,发现sink端的文件滚动配置项起不到任何作用,配置如下: a1.sinks.k1.type=hdfs a1.sinks.k1.channel=c1 a1.sinks.k1.hdfs.useLocalTimeStamp=true a1.sinks.k1.hdfs.path=hdfs://linux121:9000/user/data/logs/%Y-%m-%da1.sinks.k1.hdfs.filePrefix=XXX a1.sinks.k1.hdfs.rollInterval=60 a1.sinks.k1.hdfs.rollSize=0 a1.sinks.k1.hdfs.rollCount=0 a1.sinks.k1.hdfs.idleTimeout=0 这里配置的是60秒,文件滚动一次,也就每隔60秒,会新产生一个文件【前提,flume的source端有数据来】这里留神 useLocalTimeStamp 是应用本地工夫戳来对hdfs上的目录来命名,这个属性的目标就是相当于工夫戳的拦截器,否则%Y 等等这些货色都辨认不了 要么用下面这个属性,要么用工夫戳拦截器。然而当我启动flume的时候,运行十几秒,一直写入数据,发现hdfs端频繁的产生文件,每隔几秒就有新文件产生而且在flume的日志输入能够频繁看到这句: [WARN] Block Under-replication detected. Rotating file.只有有这句,就会产生一个新的文件,意思就是检测到复制块正在滚动文件,联合源码看下: private boolean shouldRotate() { boolean doRotate = false; if (writer.isUnderReplicated()) { this.isUnderReplicated = true; doRotate = true; } else { this.isUnderReplicated = false; } if ((rollCount > 0) && (rollCount <= eventCounter)) { LOG.debug("rolling: rollCount: {}, events: {}", rollCount, eventCounter); doRotate = true; } if ((rollSize > 0) && (rollSize <= processSize)) { LOG.debug("rolling: rollSize: {}, bytes: {}", rollSize, processSize); doRotate = true; } return doRotate; } 这是判断是否滚动文件,然而这外面的第一判断条件是判断是否以后的HDFSWriter正在复制块 ...

December 6, 2020 · 2 min · jiezi

关于大数据:大数据开发Hive常用日期函数日期连续题sql套路

后面是罕用日期函数总结,前面是一道间断日期的sql题目及其解法套路。 1.以后日期和工夫select current_timestamp-- 2020-12-05 19:16:29.284 2.获取以后日期,以后是 2020-12-05SELECT current_date; ## OR SELECT current_date(); -- 2020-12-05 3.获取unix零碎下的工夫戳SELECT UNIX_TIMESTAMP();-- 1524884881 4.以后是 2020-12-05select substr(current_timestamp, 0, 10);-- current_timestamp 5.以后是 2020-12-05select date_sub(current_date, 1);--2020-12-04 6.yyyy-MM-dd HH:MM:ss 截取日期select to_date("2017-10-22 10:10:10");-- 2017-10-22 select date_format("2017-10-22" "yyyy-MM")-- 2017-10 7.两个日期之间的天数差select datediff("2017-10-22", "2017-10-12");-- 10select datediff("2017-10-22 10:10:10", "2017-10-12 23:10:10");-- 10select datediff("2017-10-22 01:10:10", "2017-10-12 23:10:10");-- 10 8.工夫截取select from_unixtime(cast(substr("1504684212155", 0,10) as int)) dt;-- 2017-09-06 15:50:12 9.工夫戳转日期语法: to_date(string timestamp) select to_date(from_unixtime(UNIX_TIMESTAMP()));-- 2018-04-28select FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd 10:30:00');-- 2018-04-28 10:30:00select concat(date_sub(current_date,1),' 20:30:00');-- 2018-04-27 20:30:00-- hive version 1.2.0select date_format(date_sub(current_date,1),'yyyy-MM-dd 20:30:00'); 10.日期减少留神:原始日期格局只反对两种:yyyy-MM-dd yyyy-MM-dd HH:mm:ss ...

December 6, 2020 · 1 min · jiezi

关于大数据:抖音爬虫结合AndServer实现抖音XGorgon算法设备id生成接口

联合AndServer实现接口开发Gradle引入依赖implementation 'com.yanzhenjie.andserver:api:2.0.5'annotationProcessor 'com.yanzhenjie.andserver:processor:2.0.5'implementation 'com.alibaba:fastjson:1.1.71.android'  接口类编写package com.yf.douyintool.controller; import android.text.TextUtils;import android.util.Log; import com.alibaba.fastjson.JSONObject;import com.bytedance.frameworks.core.encrypt.TTEncryptUtils;import com.google.gson.Gson;import com.ss.sys.ces.a;import com.yanzhenjie.andserver.annotation.GetMapping;import com.yanzhenjie.andserver.annotation.PostMapping;import com.yanzhenjie.andserver.annotation.RequestBody;import com.yanzhenjie.andserver.annotation.RestController;import com.yanzhenjie.andserver.util.MediaType;import com.yf.douyintool.DeviceUtil;import com.yf.douyintool.bean.DeviceBean; import java.io.ByteArrayOutputStream;import java.io.IOException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.ArrayList;import java.util.Calendar;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.TimeZone;import java.util.UUID;import java.util.concurrent.TimeUnit;import java.util.zip.GZIPOutputStream; import okhttp3.ConnectionPool;import okhttp3.FormBody;import okhttp3.Interceptor;import okhttp3.OkHttpClient;import okhttp3.Protocol;import okhttp3.Request;import okhttp3.Response; @RestControllerpublic class RequestController { private static final String NULL_MD5_STRING = "00000000000000000000000000000000"; public String sessionid = ""; public String xtttoken = ""; @PostMapping(value = "/request", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public String test(@RequestBody String requestBodyString) { JSONObject jsonObject = new JSONObject(); JSONObject requestBody = JSONObject.parseObject(requestBodyString); String ck = requestBody.getString("cookie"); String url = requestBody.getString("url"); String postData = requestBody.getString("postData"); if (ck == null || url == null) { jsonObject.put("status_code", 0); jsonObject.put("status_msg", "短少参数!"); return jsonObject.toJSONString(); } if (url.contains("douplus/order/create")) { // 如果是投放订单每次生产不同的DeviceData JSONObject deviceData = getNewDeviceData(); url = replaceUrlParam(url, "device_id", deviceData.getString("device_id")); url = replaceUrlParam(url, "iid", deviceData.getString("install_id"));// Log.i("orderCreate", "替换device_id胜利!"); }// String _ricket = System.currentTimeMillis() + ""; long time = System.currentTimeMillis() / 1000; String p = url.substring(url.indexOf("?") + 1, url.length()); boolean isPost = postData != null && !postData.equals(""); String result; if (isPost) { FormBody.Builder formBody = new FormBody.Builder(); String STUB = encryption(postData); Map<String, String> map = new HashMap<>(); String[] ks = postData.split("&"); for (int i = 0; i < ks.length; i++) { String[] ur = ks[i].split("="); if (ur.length == 1) { map.put(ur[0], ""); } else { map.put(ur[0], ur[1]); } } for (Map.Entry<String, String> m : map.entrySet()) { formBody.add(m.getKey(), m.getValue()); } String s = getXGon(p, STUB, ck, sessionid); String XGon = ByteToStr(a.leviathan((int) time, StrToByte(s))); result = doPostNet(url, formBody.build(), time, XGon, STUB, ck); } else { String s = getXGon(p, "", ck, sessionid); String XGon = ByteToStr(a.leviathan((int) time, StrToByte(s))); result = doGetNet(url, time, XGon, ck); } jsonObject = JSONObject.parseObject(result); if (jsonObject == null) { jsonObject = new JSONObject(); jsonObject.put("status_code", -2); jsonObject.put("status_msg", "未知谬误!"); } return jsonObject.toJSONString(); } @GetMapping(value = "/getDeviceData", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public String getDeviceData() { return getNewDeviceData().toJSONString(); } @GetMapping(value = "/getQuery", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public String getQuery() { String uuid = DeviceUtil.getRanInt(15); //设施id String openudid = DeviceUtil.getRanInt(16); //android_id String _rticket = System.currentTimeMillis() + ""; //获取以后工夫 String url = "https://log.snssdk.com/service/2/device_register/?mcc_mnc=46000&ac=wifi&channel=aweGW&aid=1128&app_name=aweme&version_code=550&version_name=5.5.0&device_platform=android&ssmix=a&device_type=SM-G925F&device_brand=samsung&language=zh&os_api=22&os_version=5.1.1&uuid=" + uuid + "&openudid=" + openudid + "&manifest_version_code=550&resolution=720*1280&dpi=192&update_version_code=5502&_rticket=" + _rticket + "&tt_data=a&config_retry=b"; String stb = url.substring(url.indexOf("?") + 1, url.length()); String STUB = encryption(stb).toUpperCase(); String ck = "odin_tt=9c1e0ebae55f3c2d9f71ab2aadce63126022e8960819bace07d441d977ad60eff6312161f546ebfe747528d03d53a161728250938c4287a588d86aa599c284b3; qh[360]=1; install_id=66715314288; ttreq=1$0b4589453328800ed93e002538883aa52da3e1d5"; int time = (int) (System.currentTimeMillis() / 1000); String s = getXGon(url, STUB, ck, null); String XGon = ByteToStr(a.leviathan(time, StrToByte(s))); String device = getDevice(openudid, uuid); JSONObject deviceJson = JSONObject.parseObject(device); final okhttp3.RequestBody formBody = okhttp3.RequestBody.create(okhttp3.MediaType.parse("application/octet-stream;tt-data=a"), this.toGzip(device)); String result = doPostNet(url, formBody, time, XGon, "", ck); JSONObject deviceResult = JSONObject.parseObject(result); JSONObject jsonObject = new JSONObject(); jsonObject.put("status_code", 0); JSONObject headerJson = deviceJson.getJSONObject("header"); String data = String.format("os_api=22&device_type=SM-G925F&ssmix=a&manifest_version_code=911&dpi=320&uuid=%s&app_name=aweme&version_name=9.1.1&ts=%d&app_type=normal&ac=wifi&update_version_code=9104&channel=huawei_1&_rticket=%s&device_platform=android&iid=%s&version_code=911&cdid=%s&openudid=%s&device_id=%s&resolution=720*1280&os_version=5.1.1&language=zh&device_brand=OPPO&aid=1128&mcc_mnc=46007", uuid, time, _rticket, deviceResult.getString("install_id_str"), headerJson.getString("clientudid"), openudid, deviceResult.getString("device_id_str")); jsonObject.put("data", data); Log.i("data", data); return jsonObject.toJSONString(); } public JSONObject getNewDeviceData() { String uuid = DeviceUtil.getRanInt(15); //设施id String openudid = DeviceUtil.getRanInt(16); //android_id String _rticket = System.currentTimeMillis() + ""; //获取以后工夫 String url = "https://log.snssdk.com/service/2/device_register/?mcc_mnc=46000&ac=wifi&channel=aweGW&aid=1128&app_name=aweme&version_code=550&version_name=5.5.0&device_platform=android&ssmix=a&device_type=SM-G925F&device_brand=samsung&language=zh&os_api=22&os_version=5.1.1&uuid=" + uuid + "&openudid=" + openudid + "&manifest_version_code=550&resolution=720*1280&dpi=192&update_version_code=5502&_rticket=" + _rticket + "&tt_data=a&config_retry=b"; String stb = url.substring(url.indexOf("?") + 1, url.length()); String STUB = encryption(stb).toUpperCase(); String ck = "odin_tt=9c1e0ebae55f3c2d9f71ab2a12ce63c46022e8912819bace07d441d977ad60eff6301161f546ebfe747528d03d53a161728250938c4287a588d86aa599c284b3; qh[360]=1; install_id=66715314288; ttreq=1$0b4589453328800ed93e002538883aa52da3e1d5"; int time = (int) (System.currentTimeMillis() / 1000); String s = getXGon(url, STUB, ck, null); String XGon = ByteToStr(a.leviathan(time, StrToByte(s))); final okhttp3.RequestBody formBody = okhttp3.RequestBody.create(okhttp3.MediaType.parse("application/octet-stream;tt-data=a"), this.toGzip(this.getDevice(openudid, uuid))); String result = doPostNet(url, formBody, time, XGon, "", ck); JSONObject jsonObject = JSONObject.parseObject(result); if (jsonObject == null) { jsonObject = new JSONObject(); jsonObject.put("status_code", -2); jsonObject.put("status_msg", "未知谬误!"); } return jsonObject; } public String getDevice(String openudid, String udid) { //DeviceBean String Serial_number = DeviceUtil.getRanInt(8); DeviceBean deviceBean = new DeviceBean(); deviceBean.set_gen_time(System.currentTimeMillis() + ""); deviceBean.setMagic_tag("ss_app_log"); //HeaderBean DeviceBean.HeaderBean headerBean = new DeviceBean.HeaderBean(); headerBean.setDisplay_name("抖音短视频"); headerBean.setUpdate_version_code(5502); headerBean.setManifest_version_code(550); headerBean.setAid(1128); headerBean.setChannel("aweGW"); headerBean.setAppkey("59bfa27c67e59e7d920028d9"); //appkey headerBean.setPackageX("com.ss.android.ugc.aweme"); headerBean.setApp_version("5.5.0"); headerBean.setVersion_code(550); headerBean.setSdk_version("2.5.5.8"); headerBean.setOs("Android"); headerBean.setOs_version("5.1.1"); headerBean.setOs_api(22); headerBean.setDevice_model("SM-G925F"); headerBean.setDevice_brand("samsung"); headerBean.setDevice_manufacturer("samsung"); headerBean.setCpu_abi("armeabi-v7a"); headerBean.setBuild_serial(Serial_number); android.os.Build.SERIAL headerBean.setRelease_build("2132ca7_20190321"); // release版本 headerBean.setDensity_dpi(192); headerBean.setDisplay_density("mdpi"); headerBean.setResolution("1280x720"); headerBean.setLanguage("zh"); headerBean.setMc(DeviceUtil.getMac()); //mac 地址 headerBean.setTimezone(8); headerBean.setAccess("wifi"); headerBean.setNot_request_sender(0); headerBean.setCarrier("China Mobile GSM"); headerBean.setMcc_mnc("46000"); headerBean.setRom("eng.se.infra.20181117.120021"); //Build.VERSION.INCREMENTAL headerBean.setRom_version("samsung-user 5.1.1 20171130.276299 release-keys"); //Build.DISPLAY headerBean.setSig_hash("aea615ab910015038f73c47e45d21466"); //app md5加密 固定 headerBean.setDevice_id(""); //获取之后的设施id headerBean.setOpenudid(openudid); //openudid headerBean.setUdid(udid); //真机的imei headerBean.setClientudid(UUID.randomUUID().toString()); //uuid headerBean.setSerial_number(Serial_number); //android.os.Build.SERIAL headerBean.setRegion("CN"); headerBean.setTz_name("Asia\\/Shanghai"); //timeZone.getID(); headerBean.setTimezone(28800); //String.valueOf(timeZone.getOffset(System.currentTimeMillis()) / 1000) headerBean.setSim_region("cn"); List<DeviceBean.HeaderBean.SimSerialNumberBean> sim_serial_number = new ArrayList<>(); DeviceBean.HeaderBean.SimSerialNumberBean bean = new DeviceBean.HeaderBean.SimSerialNumberBean(); bean.setSim_serial_number(DeviceUtil.getRanInt(20)); sim_serial_number.add(bean); headerBean.setSim_serial_number(sim_serial_number);// Log.i("deviceHeader", headerBean.toString()); deviceBean.setHeader(headerBean); TimeZone timeZone = Calendar.getInstance().getTimeZone(); timeZone.getID(); //r Gson gson = new Gson(); return gson.toJson(deviceBean); } public byte[] toGzip(String r) { try { byte[] bArr2 = r.getBytes("UTF-8"); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(8192); GZIPOutputStream gZIPOutputStream = new GZIPOutputStream(byteArrayOutputStream); gZIPOutputStream.write(bArr2); gZIPOutputStream.close(); bArr2 = byteArrayOutputStream.toByteArray(); bArr2 = TTEncryptUtils.a(bArr2, bArr2.length); return bArr2; } catch (Exception e) { e.printStackTrace(); } return null; } public class RetryIntercepter implements Interceptor { public int maxRetry;//最大重试次数 private int retryNum = 0;//如果设置为3次重试的话,则最大可能申请4次(默认1次+3次重试) public RetryIntercepter(int maxRetry) { this.maxRetry = maxRetry; } @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request();// System.out.println("retryNum=" + retryNum); boolean isSuccessful; Response response = null; try { response = chain.proceed(request); isSuccessful = response.isSuccessful(); } catch (Exception e) { isSuccessful = false; } while (!isSuccessful && retryNum < maxRetry) { retryNum++; System.out.println("retryNum=" + retryNum); response = chain.proceed(request); } return response; } } public String doGetNet(String url, long time, String XGon, String ck) {// Log.i("XGon", XGon);// Log.i("time", String.valueOf(time)); Request request = new Request.Builder() .url(url) .get() .addHeader("X-SS-REQ-TICKET", System.currentTimeMillis() + "") .addHeader("X-Khronos", time + "") .addHeader("X-Gorgon", XGon) .addHeader("sdk-version", "1") .addHeader("Cookie", ck) .addHeader("X-Pods", "") .addHeader("Connection", "Keep-Alive") .addHeader("User-Agent", "okhttp/3.10.0.1") .addHeader("x-tt-token", xtttoken) .addHeader("Accept-Encoding", "identity") .addHeader("Connection", "Upgrade, HTTP2-Settings") .addHeader("Upgrade", "h2c") .build(); List<Protocol> protocols = new ArrayList<>();// protocols.add(Protocol.H2_PRIOR_KNOWLEDGE); protocols.add(Protocol.HTTP_2); protocols.add(Protocol.HTTP_1_1); OkHttpClient okHttpClient = new OkHttpClient.Builder() .retryOnConnectionFailure(true) .protocols(protocols) .connectionPool(new ConnectionPool(10, 30, TimeUnit.SECONDS)) .addInterceptor(new RetryIntercepter(3)) .build(); Response response = null; try { response = okHttpClient.newCall(request).execute(); } catch (IOException e) { e.printStackTrace(); } //响应胜利 if (response.isSuccessful()) { try { return response.body().string(); } catch (IOException e) { e.printStackTrace(); } } JSONObject jsonObject = new JSONObject(); jsonObject.put("status_code", -2); jsonObject.put("status_msg", "未知谬误!"); return jsonObject.toJSONString(); } public String doPostNet(String url, okhttp3.RequestBody requestBody, long time, String XGon, String stub, String ck) { Request request = new Request.Builder() .url(url) .post(requestBody) .addHeader("X-SS-STUB", stub) .addHeader("X-SS-REQ-TICKET", System.currentTimeMillis() + "") .addHeader("X-Khronos", time + "") .addHeader("X-Gorgon", XGon) .addHeader("sdk-version", "1") .addHeader("Cookie", ck) .addHeader("X-Pods", "") .addHeader("Connection", "Keep-Alive") .addHeader("User-Agent", "okhttp/3.10.0.1") .addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") .addHeader("x-tt-token", xtttoken) //登录胜利头部返回的数据 .build(); List<Protocol> protocols = new ArrayList<>();// protocols.add(Protocol.H2_PRIOR_KNOWLEDGE); protocols.add(Protocol.HTTP_2); protocols.add(Protocol.HTTP_1_1); OkHttpClient okHttpClient = new OkHttpClient.Builder() .retryOnConnectionFailure(true) .protocols(protocols) .connectionPool(new ConnectionPool(10, 30, TimeUnit.SECONDS)) .addInterceptor(new RetryIntercepter(3)) .build(); Response response = null; try { response = okHttpClient.newCall(request).execute(); } catch (IOException e) { e.printStackTrace(); } //响应胜利 if (response.isSuccessful()) { try { return response.body().string(); } catch (IOException e) { e.printStackTrace(); } } JSONObject jsonObject = new JSONObject(); jsonObject.put("status_code", -2); jsonObject.put("status_msg", "未知谬误!"); return jsonObject.toJSONString(); } public static byte[] StrToByte(String str) { String str2 = str; Object[] objArr = new Object[1]; int i = 0; objArr[0] = str2; int length = str.length(); byte[] bArr = new byte[(length / 2)]; while (i < length) { bArr[i / 2] = (byte) ((Character.digit(str2.charAt(i), 16) << 4) + Character.digit(str2.charAt(i + 1), 16)); i += 2; } return bArr; } public static String ByteToStr(byte[] bArr) { int i = 0; char[] toCharArray = "0123456789abcdef".toCharArray(); char[] cArr = new char[(bArr.length * 2)]; while (i < bArr.length) { int i2 = bArr[i] & 255; int i3 = i * 2; cArr[i3] = toCharArray[i2 >>> 4]; cArr[i3 + 1] = toCharArray[i2 & 15]; i++; } return new String(cArr); } public String encryption(String str) { String re_md5 = null; try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(str.getBytes()); byte b[] = md.digest(); int i; StringBuffer buf = new StringBuffer(""); for (int offset = 0; offset < b.length; offset++) { i = b[offset]; if (i < 0) i += 256; if (i < 16) buf.append("0"); buf.append(Integer.toHexString(i)); } re_md5 = buf.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return re_md5.toUpperCase(); } public String getXGon(String url, String stub, String ck, String sessionid) { StringBuilder sb = new StringBuilder(); if (TextUtils.isEmpty(url)) { sb.append(NULL_MD5_STRING); } else { sb.append(encryption(url).toLowerCase()); } if (TextUtils.isEmpty(stub)) { sb.append(NULL_MD5_STRING); } else { sb.append(stub); } if (TextUtils.isEmpty(ck)) { sb.append(NULL_MD5_STRING); } else { sb.append(encryption(ck).toLowerCase()); } if (TextUtils.isEmpty(sessionid)) { sb.append(NULL_MD5_STRING); } else { sb.append(encryption(sessionid).toLowerCase());// sb.append(sessionid); } return sb.toString(); } /** * 替换url中的参数 * * @param url * @param name * @param value * @return */ public static String replaceUrlParam(String url, String name, String value) { int index = url.indexOf(name + "="); if (index != -1) { StringBuilder sb = new StringBuilder(); sb.append(url.substring(0, index)).append(name).append("=").append(value); int idx = url.indexOf("&", index); if (idx != -1) { sb.append(url.substring(idx)); } url = sb.toString(); } return url; }}AndServer服务类package com.yf.douyintool; import android.content.Context;import android.util.Log; import com.yanzhenjie.andserver.AndServer;import com.yanzhenjie.andserver.Server; import java.net.InetAddress;import java.net.UnknownHostException;import java.util.concurrent.TimeUnit; /** * Created by Zhenjie Yan on 2018/6/9. */public class ServerManager { private static final String TAG = "ServerManager"; private Server mServer; /** * Create server. */ public ServerManager(Context context) { InetAddress inetAddress = null; try { inetAddress = InetAddress.getByName("0.0.0.0"); } catch (UnknownHostException e) { e.printStackTrace(); } mServer = AndServer.serverBuilder(context) .inetAddress(inetAddress) .port(8080) .timeout(10, TimeUnit.SECONDS) .listener(new Server.ServerListener() { @Override public void onStarted() { // TODO The server started successfully. Log.d(TAG, "onStarted: "); } @Override public void onStopped() { // TODO The server has stopped. Log.d(TAG, "onStarted: "); } @Override public void onException(Exception e) { Log.e(TAG, "onException: ",e ); // TODO An exception occurred while the server was starting. } }) .build(); } /** * Start server. */ public void startServer() { if (mServer.isRunning()) { // TODO The server is already up. } else { mServer.startup(); } } /** * Stop server. */ public void stopServer() { if (mServer.isRunning()) { mServer.shutdown(); } else { Log.w("AndServer", "The server has not started yet."); } }}  ...

December 6, 2020 · 8 min · jiezi

关于大数据:抖音爬虫当你写爬虫抓不到APP请求包的时候该怎么办

这篇文章的次要内容是解决在遇到APP没有应用Android自带的HTTP客户端进行申请,并且对HTTP客户端的代码进行了混同,导致通用工具JustTrustMe生效的问题。而中级篇中除了JustTrustMe以外的所有办法也都会对这种状况大刀阔斧,起因是中级篇中的1、3、4办法实质上针对的是Android 7.0+零碎减少的SSL Pinning计划,而无奈对各个HTTP客户端本人实现的检测计划失效。(据说有个叫车速拍的APP就是这种类型呢)那么应该怎么做能力抓到这类APP的包呢?很简略,仍然是应用JustTrustMe之类的Hook工具就好了,只不过咱们须要针对混同后的名字对原来Hook的局部进行非凡解决。 这里我专门写了一个样例APP来进行演示(别抓我,我什么都不晓得),这个APP做的事件就是在你点击了按钮之后,对百度首页发动一次申请,然而这个申请在没有破解SSL Pinning的失常状况下是不可能胜利的,因为我设置的是一个轻易输出的证书哈希,所以在申请的时候会因为失常的证书哈希与我轻易输出的哈希不同导致呈现申请失败的状况。样例APP代码这个APP我曾经编译好放到GitHub上了,有两个版本,一个是对代码进行过混同的,一个是没混同的,文末会有下载地址,读者能够下载下来本人玩玩。两个编译好的APK开始演示之前说一下测试机的配置吧,这里用的测试机是Android 8.1.0的,曾经Root+Xposed,同时曾经装置并激活了JustTrustMe。测试机系统信息Xposed模块治理界面-JustTrustMe已开启 咱们先来看一下没混同过代码的版本,装上之后关上它,而后点击“点击发送申请”按钮。样例APP界面不出意外的话会呈现申请胜利的字样,如果呈现申请失败的话可能是你网络问题,证书问题会提醒“证书验证失败”。接下来咱们看看混同过代码的版本,操作同上。证书验证失败这次就是证书验证失败了,JustTrustMe并没有失常失效。 咱们将这两个APK都放到Jadx中反编译一下看看。在Jadx中反编译两个样例APK能够看到混同过的版本里,okhttp3下的所有类名曾经变成了abcd这种名字。而后咱们来看一下JustTrustMe的代码。JustTrustMe代码中Hook okhttp3的证书验证局部能够看到它的代码中是对okhttp3.CertificatePinner类下的check办法进行Hook的,这个CertificatePinner类和check办法在没混同过的APK中能够很分明地看到。反编译检测代码1反编译检测代码2那么当初JustTrustMe面对混同后的版本就生效的起因曾经很清晰了,因为它找不到这个okhttp3.CertificatePinner.check,所以基本就不可能Hook到检测办法,天然不会有任何成果。所以...应该怎么办呢?这里仍然是给出多种办法供读者抉择:1、批改JustTrustMe代码中Hook的类名和办法名而后从新编译很简略,找到对应的检测办法,把JustTrustMe代码中Hook的className和methodName改成混同后的名字即可,比方在这个混同后的样例APP里,okhttp3.CertificatePinner.check变成了okhttp3.f.a。反编译检测代码-混同后咱们批改JustTrustMe中的Hook局部,同样改为f和a。JustTrustMe对okhttp3的证书检测Hook批改JustTrustMe对okhttp3的证书检测Hook改完之后编译一下,装置到手机上替换原来的就好了。2、应用Frida进行Hook这个办法比办法1要更不便、更间接一些,因为须要的时候间接批改脚本马上就能用,不须要从新编译、重启手机或APP,这里间接拿瘦蛟舞大佬写的解除SSL Pinning脚本批改一下,同样是批改Hook okhttp3.CertificatePinner.check的局部,改成混同后的名字即可。批改瘦蛟舞的ObjectionUnpinningPlus脚本3、魔改JustTrustMe,减少一个能够在运行时依据状况调整每种HTTP客户端的SSL Pinning检测局部的类名和办法名的性能这个我临时没空弄,感兴趣的同学能够本人实现一下。4、魔改JustTrustMe,对Hook局部减少动静适配性能,做到即便开发者对代码进行了混同也能主动找到实在的检测类和办法同上,实现形式能够参考微信巫师框架局部的主动适配代码,实现当前实践上来讲是最不便的方法之一,因为是齐全主动的操作,不须要人工染指。5、批改反编译APP失去的代码再打包回去我感觉应该没人会用这么蠢的方法吧...用Hook的形式做起来要不便太多了。抉择任意一种办法操作后,再关上混同版本的APP就能够失常申请了。 这时候可能会有同学要问了,怎么样晓得APP用的是哪个HTTP客户端?又怎么样疾速定位混同后的检测办法地位呢?很简略,咱们先关掉破解工具,连上代理而后抓个包看看混同版本APP的申请。抓包查看申请User-Agent局部和平时遇到SSL Pinning的状况一样,这里只会抓到一个CONNECT申请,留神左边的headers,从User-Agent中能够看出这个APP应用的是okhttp3,那么咱们在混同后的代码中定位检测局部代码的地位时,就只须要对照着okhttp3的原始代码来找就好了(其余HTTP客户端同理)。当然了,也不排除有些APP会把User-Agent改掉,如果从User-Agent上看不出来的话,那就看一下反编译进去的源代码局部构造,看看有没有像okhttp3之类的这种特地显著的HTTP客户端的名字,有的话就把它干掉就好了。—————————————————————————————————————————— TiToData:业余的短视频、直播数据接口服务平台。 更多信息请分割: TiToData笼罩支流平台:抖音,快手,小红书,TikTok,YouTube

December 6, 2020 · 1 min · jiezi

关于大数据:抖音爬虫AndServerService打造Android服务器实现so文件调用

so 文件调用随着 Android 挪动平安的高速倒退,不论是为了执行效率还是程序的安全性等,要害代码下沉 native 层已成为基本操作。native 层的开发就是通指的 JNI/NDK 开发,通过 JNI 能够实现 java 层和 native 层(次要是 C/C++ )的互相调用,native 层经编译后产生 so 动态链接库,so 文件具备可移植性广,执行效率高,保密性强等长处。那么问题来了,如何调用 so 文件显得异样重要,当然你也能够间接剖析 so 文件的伪代码,利用强悍的编程功底间接模仿要害操作,然而我想对于普通人来说头发还是比拟重要的。以后调用 so 文件的支流操作应该是:1,基于 Unicorn 的各种实现(还在学习中,暂且不表)2,Android 服务器的搭建,在 App 内起 http 服务实现调用 so 的需要(当然前提是过了 so 的效验等操作)至于为什么选用 AndServer,好吧,不为什么,只是因为搜寻到了它为什么联合 Service,在学习 Android 开发的时候理解到了 Service 的生命周期,集体了解用 Service 去创立 Http 服务比拟好。当然也有 Application 的简略应用,因为在正式环境中,大多数 so 文件的逻辑中都有 context 的一些包名了,签名了的效验等,自定义 Application 的话获取 context 传参就好了。 libyemu.so 简介这是我编译好的一个 so 文件,就是依据入参做下简略的字符串拼接(以下是 native 层编译前的 c 代码) ...

December 6, 2020 · 3 min · jiezi

关于大数据:抖音爬虫教程从0到1环境配置

前言该系列内容次要介绍抖音爬虫的相干过程。因为科研须要,所以抉择爬取抖音的视频数据,包含点赞等。爬取思路是首先爬取用户,而后依据用户爬取其对应公布的视频数据。这一个博客我将介绍环境配置。 一、抓包软件 1. 抓包软件抉择这里应用的抓包软件是:Fiddle,因为最新版本的Fiddle比拟奇怪,所以我还是抉择应用老版本的Fiddle(5.0版本)。 2. 抓包软件配置 2.1. 装置这里没有什么须要留神的 2.2. 配置这是初始界面,抉择不更新这是能用到的两个次要的工具按钮开始配置点击Tools -> Options,就能够看到Options的主面板 在Options的主面板中,点击 Https,设置捕捉HTTPS的包等,详见下图 点击Actions -> Trust Root Certificate,为电脑装置证书:- 点击Yes这样就在电脑端装好了证书 配置容许近程电脑连贯(这样就能够抓手机的包了)在Options的主面板中,点击 Connections,设置连贯规定等。包含端口号的设定,肯定要记得选中容许近程电脑连贯,咱们就能够应用这个作为手机的代理,从而抓取手机的包了。 前面的话应用默认的配置就能够了 二、手机设置 1. 抖音版本抉择试了好多版本的抖音,发现6.3.0版本的最好抓包,所以我就应用了6.3.0版本的抖音,大家如果需要的话能够关注公众号获取安装包。 装置好抖音之后,记得不要更新,也能够把利用市场的自动更新禁掉。 2. 配置手机网络 2.1. 保障手机和电脑在同一个局域网内应用同一个路由器下的网络就行,学校内网应该也是能够的,或者没有路由器的话,用另一个手机开热点给它俩连也能够 2.2. 设置手机代理首先查看电脑的ip设置手机代理这个时候手机代理就设置好了,如果以上步骤都没有问题的话,这个时候应该曾经能够联网了,能够用手机上一下百度,测试一个,如果不能够联网,检查一下你的手机网络代理设置是不是正确的:(电脑ip正确不,后面设置的Fiddle的Options外面的Connetions外面的端口是不是和手机上设置的一样),如果没问题,倡议重启一下手机,我的手机连不上网的时候重启一下就好了,而后连贯网络,而后就能够上网了。 装置证书因为要爬HTTPS 的包,所以须要装置证书,后面曾经晓得了你的电脑的ip地址,还有fiddle中设置的端口号,在手机浏览器中输出:http://电脑ip:端口号,例如你的电脑的ip是192.168.0.1,设置的端口号是:8888,那么你就要输出:http://192.168.0.1:8888如果上一步你的代理设置胜利了,那么就会呈现这个页面:点击下载证书,而后装置,过程如下:到这里手机就装置好证书了,这个时候关上抖音,咱们能够看到Fiddle曾经能够抓到抖音的数据包了下面的图就是抖音某用户公布的视频的抓包,咱们能够通过剖析申请头以及对应的响应获取咱们想要的数据了。—————————————————————————————————————————— TiToData:业余的短视频、直播数据接口服务平台。 更多信息请分割: TiToData笼罩支流平台:抖音,快手,小红书,TikTok,YouTube

December 5, 2020 · 1 min · jiezi

关于大数据:快手爬虫-解决粉丝数-关注数等字体加密

想拿一下粉丝数 关注数 形容等发现字体是加密的 elements是这样的源代码里是这样的找了找js 原来是用 &#xed69;&#xe34c;&#xf149;&#xf6d6;&#xf19d;这些玩意 去这个ttf里一一对应 而后用 js + css画进去的找到问题所在,就fuck掉它把js扣进去?用execjs去执行?太LOW了既然做python 那就用python去重写首先用re去拿这个ttf的url (因为每次都变)先给这玩意下载下来 把这个ttf文件扔fonteditor里 而后去http://fontstore.baidu.com/static/editor/index.html瞅瞅这个时候就发现了货色不就是这玩意吗,找到对应关系了 那就ok了TTF文件没方法间接搞啊 ?怎么办保留成xml !而后就成了这玩意 ok对应关系也有了 python也能搞了去写一下 整逻辑就是先去拿 ttf文件 url 申请url 保留 而后转xml而后 拿加密前的特殊字符 # 就是这玩意&#xed69;&#xe34c;&#xf149;&#xf6d6;&#xf19d;而后去切割 对应 OK完事对应关系的代码依据看到的 id : 0啥也不说从1~15 就是这些货色上代码 # 对应关系 def kuaishou_un_font(soup, font_size): # soup 就是传的 ttf转码成xml的 font_dict = {} for font_m in soup.glyphorder.children: if font_m != '\n' and 'humans' not in font_m: id = font_m.get('id') name = font_m.get('name') if id != '0' and int(id) < 11: font_dict[name] = str(int(id)-1) elif id == '11': font_dict[name] = '.' elif id == '12': font_dict[name] = 'w' elif id == '13': font_dict[name] = 'k' elif id == '14': font_dict[name] = 'm' elif id == '15': font_dict[name] = '+' size_dict = {} for font_k in soup.cmap_format_4.children: if 'map' in str(font_k): code = font_k.get('code')[-4:] name = font_k.get('name') size_dict[code] = name return font_dict[size_dict[font_size]]而后是拿TTF 文件而后转成xml ...

December 5, 2020 · 1 min · jiezi

关于大数据:抖音协议抖音爬虫获取-initgorgonxgorgon加密算法

1、用到的工具等:Charles (轻易一个抓包工具即可,哪个棘手用哪个)动静字段: x-gorgon:0408* (结尾)抖音Version:12.8.0 (发帖时的最新版本)or 抖音极速版 (文件少,编译快)IDA or JEBJadx-guifridaPycharmroot 真机(Android) or 模拟器2、反编译:Apk 间接丢入 Jadx-gui or Apk==>zip ==> 解压 ==> .dex 全副打包丢入 Jadx-gui查找关键字: x-girgon先看调用处:这个so 文件全名: libcms.so apk压缩包中能够找到。接下来看看函数申明处:代码不能被工具完满还原,试了几个工具都这球样,不用浪费工夫折腾了。间接看吧,功底好的能够间接看Smali 代码。能够看到r8 即为想要的值,向上查找r8其中 com.ss.a.b.a.a() 是重载函数,hook时须要留神下。贴附一段Frida 代码: 留神overload("")这块儿的代码是能够失常展现的,很好还原:接下来到了难点:byte[] r0 = com.ss.sys.ces.a.leviathan(r8, r7, r0)这个不太好还原, 三个参数:native 润饰的 leviathan ()函数, 对应的办法体在最早加载的 cms.so 中。能够应用ida or jeb 进行查看,会发现没有到处函数,其应用了花指令混同的加密措施。破解难度太大,能够思考换了一种简略的调用形式进行解决优先举荐 : frida-rpc, 实现思路如下: 具体的自行欠缺(我本人应用的java 进行被动调用的,想理解的能够关注后留言,或者微信)这种形式比较简单,还能够开微服务。其中传递进去的参数能够应用frida hook 进行获取输入后果为:参数1: -1参数2: 十位工夫戳(来自url参数中的十三位工夫戳)同 x-khronos 雷同。参数3: post参数的data 局部,就是下图中的r0参数整顿:r0 = md5(url?后的参数) 对网址的参数进行md5r13 = x-ss-stub,只有post时才无效,否则是32个0r11 = md5(cookie) 对cookie进行md5r12 = md5(cookie['sessionid']) 对cookie外面对sessionid进行md5,否则也是32个0—————————————————————————————————————————— ...

December 5, 2020 · 1 min · jiezi

关于大数据:抖音爬虫获取抖音cookiesCK

剖析Cookie中文名称为小型文本文件,指某些网站为了分别用户身份而贮存在用户本地终端(Client Side)上的数据(通常通过加密)。有时也用其复数模式Cookies,指某些网站为了分别用户身份、进行session跟踪而贮存在用户本地终端上的数据(通常通过加密)。抖音外围的cookies是sessionID值, 可嵌套到接口的headers里的Cookie里进行申请。目前有钻研出有三种获取ck的办法:(1). 通过web端的扫码获取到cookies(2). 通过app端抖音的账号和明码进行获取到cookies(3). 通过app端的验证码进行获取cookies 一、web扫码获取通过抖音企业治理平台: https://e.douyin.com/site/ 抓包剖析红色标记为 base64 图片, 进行本地保留并关上, 即是登录的二维码而后在去实时的申请二维码状态, 数据包的data.status 字段状态new未扫码scanned已扫码待确认登录confirmed已确认登录 局部代码截图 二、账号密码登录获取Cookie(为爱护隐衷,打码请了解) 抓包剖析 申请为POST, 在申请体中mobile和password进行加密, 破解了mobile和password就能够申请登录后cookies里的session值了 间接上代码返回的cookies可间接嵌套到申请其余接口的headers头外面, 即可进行进行点赞和关注等操作接口了 三、发送验证码登录获取Cookie 抓包剖析红色标识的是将YZ发送到10690032183903进行验证点击登录后, 发送验证接口, 确认发送胜利进行登录, 红色标记为登录时的verify_ticket值, 进行验证验证码状态 字段状态auth_failed未发送验证码 间接上代码将session_key嵌套到headers里的Cookie里即可—————————————————————————————————————————— TiToData:业余的短视频、直播数据接口服务平台。 更多信息请分割: TiToData笼罩支流平台:抖音,快手,小红书,TikTok,YouTube

December 4, 2020 · 1 min · jiezi

关于大数据:抖音爬虫数据采集热搜话题抓包分析

咱们筹备实现的是抖音的热搜榜和话题的相干数据抓取。抓包工具: charles模拟器: 木木模拟器 抖音的热搜榜一:能够间接通过抓包工具获取接口将获取到的接口地址复制进去(简化后):https://aweme-hl.snssdk.com/aweme/v1/hot/search/list/接着就能够间接申请,来获取热搜数据了。二:通过热搜的分享页面获取接口点击右上角的分享选项,复制链接后,用浏览器关上。在浏览器中关上后 https://www.iesdouyin.com/share/billboard/同样也能够获取到接口地址。可间接进行get申请https://www.iesdouyin.com/web/api/v2/hotsearch/billboard/word/ 热搜下对应的话题数据咱们点击一个话题,来找一下热搜下对应的话题数据:右上角的播放量数据在https://aweme-hl.snssdk.com/aweme/v1/hot/search/list/?&source=3&os_api=23&version_code=860咱们通过寻找其余数据的接口,将链接复制下来(简化后):https://aweme-hl.snssdk.com/aweme/v1/hot/search/video/list/?hotword=吴亦凡 脖子想要的数据就有了,比方以后话题总参加人数,能够间接GET申请接口来解析数据。 热搜的数据很简略就能够获取到,然而目前针对于指定话题,一些加密的参数还没有钻研明确。欢送大家留言交换然而为了实现话题数据的抓取,不得不另寻他路,没想到还真找到了其余的接口。 指定话题的数据获取办法以一个话题示例:咱们须要的是该话题对应的播放量和视频数量。通过抓包,找到了如下接口:https://aweme-hl.snssdk.com/aweme/v1/challenge/detail/?query_type=0&ch_id=1635753360881672这里须要 ch_id 能力获取到咱们须要的数据。如何能力简略快捷的获取到这个ch_id呢,通过一段时间的剖析。我发现: 该话题《从地球登程》的ch_id:1635753360881672,能够在该相干用户的详情中找到。那么还是老办法,获取分享页面的链接,从浏览器关上查看分享页面中的接口数据。果不其然,找到了咱们须要的id。 话题下的视频详情:那么如何获取话题下的视频详情呢,回到模拟器,又发现了右上方的分享选项将链接复制下来之后,应用浏览器关上,在接口中能够找到咱们所须要的数据https://www.iesdouyin.com/share/challenge/1635753360881672察看一下这个接口的参数ch_id 曾经晓得了,_signature 签名,在之前的文章中有解说过。这里就不再反复了。 代码局部案例代码,绝对比拟简介,须要大家自行欠缺。热搜榜数据: import requestsimport pprint# 抖音热搜榜hot_search = 'https://aweme-hl.snssdk.com/aweme/v1/hot/search/list/?detail_list=1'headers = {"User-Agent":"Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Mobile Safari/537.36"}hot_json = requests.get(hot_search,headers=headers).json()hot_list = []for data in hot_json['data']['word_list']: item = {} keyword = data['word'] hot_value = data['hot_value'] item[keyword] = hot_value hot_list.append(item)pprint.pprint(hot_list) 热搜词对应的浏览人数这里取其中一个热搜词。 import requestsheaders = {"User-Agent":"Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Mobile Safari/537.36"}hot_word = '鹿晗吃播'hot_reading = 'https://aweme-hl.snssdk.com/aweme/v1/hot/search/video/list/?hotword={}'.format(hot_word)hot_json = requests.get(hot_reading,headers=headers).json()print("持续时间:",hot_json['aweme_list'][2]['duration'])print("热度值:",hot_json['aweme_list'][2]['hot_info']['value'])print("以后排名:",hot_json['aweme_list'][2]['hot_info']['rank']) ...

December 4, 2020 · 1 min · jiezi

关于大数据:抖音协议抖音爬虫接口分析搜索同城推荐同城推荐粉丝列表等等

抖音搜寻接口接口名类型链接搜寻用户综合信息posthttps://aweme-hl.snssdk.com/aweme/v1/challenge/search/?搜寻相干用户列表posthttps://search-hl.amemv.com/aweme/v1/discover/search/?搜寻相干话题列表posthttps://search-hl.amemv.com/aweme/v1/challenge/search/?query string parameters 参数:(链接上的附加参数) params = {'update_version_code': '9802', 'aid': '1128', 'cdid': '46423769-97c1-4fae-a612-44f5ccf4b778', 'resolution': '810*1440', 'language': 'zh', '_rticket': '1588840942288', 'ac': 'wifi', 'os_api': '23', 'channel': 'tengxun_new', 'openudid': 'c055533a0591b2dc', 'device_brand': 'Xiaomi', 'device_type': 'MI%205s', 'device_platform': 'android', 'ssmix': 'a', 'uuid': '008796763985702', 'ts': '1588840941', 'version_name': '9.8.1', 'dpi': '320', 'version_code': '981', 'app_name': 'aweme', 'os_version': '6.0.1', 'manifest_version_code': '981', 'device_id': '699185385', 'iid': '4230556658973179', 'app_type': 'normal'}我这里应用模拟器抓的包,params外面有设施信息:device_type、device_brand、device_platform、device_idDEVICEID可惟一标识一个存储设备,搜寻接口基于该参数做有肯定的申请限度。(我贴出来的参数中 设施id是假的,须要更换为本人的)Post表单参数: data = { 'cursor': 0, 'keyword':'鞠婧祎', 'count': 20, 'hot_search': 0, 'is_pull_refresh': 1, 'search_source': 'challenge', 'search_id':None, 'query_correct_type': 1 }headers参数:xgorgon是申请所需的加密参数、xtttoken在搜寻接口用于用户身份的标示。X-Gorgon解密办法:https://blog.csdn.net/weixin_43582101/article/details/107099581 ...

December 4, 2020 · 2 min · jiezi

关于大数据:抖音Xgorgon算法0408版设备注册加密算法-抖音协议抖音爬虫-实现

抖音app版本更新贼快,虽说小版本之前加密算法根本一样,但还是有稍微差别。今日实现了120601版本(貌似9月初公布)的Xgorgon加签及设施注册的加密。通过Xgorgon可失常爬取到数据,通过设施信息的加密可注册到新的设施号(device_id)。 一、反编译APK(Xgorgon)1、jadx关上apk并搜寻xgorgon,可定位到init_gorgon2、读init_gorgon()外面的伪代码,你会发现最新版在调用native前所进行的一系列操作,和老版本无二,那就依照老版本操作即可;3、再读伪代码,会发现byte[] r0 = com.ss.sys.ces.a.leviathan(r14, r10, r0),这个就是调用本地so库进行最终的加密4、发一个最终成果看看(爬取视频的评论列表) 申请的url:https://api3-normal-c-hl.amemv.com/aweme/v2/comment/list/?aweme_id=6870816591416773899&cursor=0&count=20&address_book_access=1&gps_access=1&forward_page_type=1&channel_id=0&city=530100&hotsoon_filtered_count=0&hotsoon_has_more=0&follower_count=0&is_familiar=0&page_source=0&user_avatar_shrink=64_64&storage_type=2&manifest_version_code=120601&_rticket=1599995937170&app_type=normal&iid=xxx&channel=aweGW&device_type=Redmi+6A&language=zh&cpu_support64=false&host_abi=armeabi-v7a&uuid=xxx&resolution=720*1344&openudid=xxx&update_version_code=12609900&cdid=xxx&appTheme=dark&os_api=27&mac_address=xxx&dpi=320&oaid=xxx&ac=wifi&device_id=xxx&os_version=8.1.0&version_code=120600&app_name=aweme&version_name=12.6.0&device_brand=xiaomi&ssmix=a&device_platform=android&aid=1128&ts=1599995937Xgorgon:040850000810d1290a78de2cbd25321d8cad6e072903b17e0700获取后果:{"status_code":0,"comments":[{"cid":"6870835395178299406","text":"哈哈哈哈哈","aweme_id":"6870816591416773899","create_time":1599741031,"digg_count":379672,"status":1,"user":{"uid":"58857507866","short_id":"7046031","nickname":"演员吴晴","gender":2,"signature":"????演员,歌手。微博:吴晴Kate (1045万粉丝) \n(不定时直播)\n????电影代表作:《忠犬大营救》《毒战》《血戒》《四平风波》《迷城》《恋爱101度》《千门江湖》《荀灌娘》《特工少女》等作品\n????个人专辑????《相思心》《抱的太使劲》《越痛越想你》《墨染江南》《最情话》《别叫我女神经》等\n❤️感激大家的守护 私信音讯会回复\nV:WQ777777768","avatar_larger":{"uri":"1080x1080/315bc00082e86dca01f05","url_list":["https://p26-dy.byteimg.com/aweme/1080x1080/315bc00082e86dca01f05.webp?from=2956013662\u0026s=PackSourceEnum_COMMENT_LIST\u0026se=false\u0026sh=\u0026sc=avatar\u0026l=202009131919050100280680780B463AF3","https://p1-dy-ipv6.byteimg.com/aweme/1080x1080/315bc00082e86dca01f05.webp?from=2956013662\u0026s=PackSourceEnum_COMMENT_LIST\u0026se=false\u0026sh=\u0026sc=avatar\u0026l=202009131919050100280680780B463AF3","https://p29-dy.byteimg.com/aweme/1080x1080/315bc00082e86dca01f05.webp?from=2956013662\u0026s=PackSourceEnum_COMMENT_LIST\u0026se=false\u0026sh=\u0026sc=avatar\u0026l=202009131919050100280680780B463AF3","https://p26-dy.byteimg.com/aweme/1080x1080/315bc00082e86dca01f05.jpeg?from=2956013662\u0026s=PackSourceEnum_COMMENT_LIST\u0026se=false\u0026sh=\u0026sc=avatar\u0026l=202009131919050100280680780B463AF3"],"width":720,"height":720},"avatar_thumb":{"uri":"100x100/315bc00082e86dca01f05","url_list":["https://p3-dy-ipv6.byteimg.com/aweme/100x100/315bc00082e86dca01f05.webp?from=2956013662\u0026s=PackSourceEnum_COMMENT_LIST\u0026se=false\u0026sh=\u0026sc=avatar\u0026l=202009131919050100280680780B463AF3","https://p29-dy.byteimg.com/aweme/100x100/315bc00082e86dca01f05.webp?from=2956013662\u0026s=PackSourceEnum_COMMENT_LIST\u0026se=false\u0026sh=\u0026sc=avatar\u0026l=202009131919050100280680780B463AF3","https://p26-dy.byteimg.com/aweme/100x100/315bc00082e86dca01f05.webp?from=2956013662\u0026s=PackSourceEnum_COMMENT_LIST\u0026se=false\u0026sh=\u0026sc=avatar\u0026l=202009131919050100280680780B463AF3","https://p3-dy-ipv6.byteimg.com/aweme/100x100/315bc00082e86dca01f05.jpeg?from=2956013662\u0026s=PackSourceEnum_COMMENT_LIST\u0026se=false\u0026sh=\u0026sc=avatar\u0026l=202009131919050100280680780B463AF3"],"width":720,"height":720},"avatar_medium": 二、反编译APK(设施注册明文加密)1、jadx关上apk并搜寻EncryptorUtil,可定位到ttEncrypt2、读代码,能够看到调用native传入了两个参数,一个是bArr(即明文压缩后的byte),还有一个是bArr的长度。至于传入的bArr是什么,间接hook就行了;3、再发一个最终成果看看(注册device_id) 申请的url:https://log-hl.snssdk.com/service/2/device_register/?ac=wifi&mac_address=80:6b:0a:ae:16:77&channel=aweGW&aid=1128&app_name=aweme&version_code=120000&version_name=12.0.0&device_platform=android&ssmix=a&device_type=Redmi+6A&device_brand=xiaomi&language=zh&os_api=27&os_version=8.1.0&uuid=867986272266552&openudid=086ea119dc4c389e&manifest_version_code=120001&resolution=720*1344&dpi=320&update_version_code=12009900&_rticket=1599995560251&storage_type=2&appTheme=dark&cpu_support64=false&host_abi=armeabi-v7a&app_type=normal&ts=1599995560&cdid=6227e97c-e9da-455d-b3f5-29f8a5d4968b&oaid=59423f0098833c63&tt_data=a加密后body:[116, 99, 5, 16, 0, 0, -97, -99, 35, 54, 17, -97, 18, -93, 11, 49, -127, -128, 108, -87, -77, -5, -12, -98, 33, -6, -45, -90, 18, -78, -53, 58, -45, 89, 4, -74, -108, -13, 6, -49, -73, 105, -79, 56, -16, 46, -126, 110, -90, 3, 121, 11, -70, -125, -22, -47, -48, -96, 98, 91, 33, 80, -16, 8, 89, -62, -100, 6, -74, 113, -128, -119, 76, -18, -6, -110, -31, 73, 82, 98, 43, -100, -18, 57, 69, -88, -4, -128, -90, -89, -7, -125, 13, -20, 65, 29, 89, -2, 58, -41, 122, -56, 111, 86, 21, -95, -20, -34, -28, 63, 116, -4, -124, -47, -20, -86, 22, 64, 8, 25, -12, 99, 25, 81, -63, 112, -20, -85, -37, 75, 79, 80, 93, 106, 54, 59, -22, 79, -83, -121, 104, 67, -8, 73, -98, 120, 64, 15, 29, -70, -42, 121, 32, 98, -75, -88, 115, -10, -37, -18, 122, -4, 32, -24, 100, -38, 79, 26, 77, -42, -51, 19, -79, 92, 8, 116, -17, -53, -127, -68, 113, -32, 61, -106, 124, 91, -57, 94, 47, 0, 8, -62, 46, -97, 84, 90, -2, 73, -12, 88, 48, 78, 49, -42, -66, 18, 96, -120, 94, -59, -105, -42, 62, 27, -83, -58, 27, 54, -54, 43, -109, -29, 75, 7, -53, -103, 87, 45, -124, -98, -125, 44, 58, 94, -30, 46, -61, 87, 123, 22, -99, 46, -84, -21, -41, -115, 10, -6, 11, -1, -5, 9, -120, -70, -21, 5, -80, -27, -54, 37, 16, -46, -3, -53, -125, 13, 36, 27, -52, -62, -112, -15, -47, 61, -41, 89, -97, -81, 11, 12, 41, -6, 32, 109, -128, -117, 73, -15, 125, -116, 14, 113, 54, 18, 37, -44, -70, -10, 94, -44, -21, -43, 125, -62, -123, 31, -38, 113, 64, 95, 113, 106, -117, 100, -32, -124, 78, 57, 1, -62, 114, 64, 18, -21, 4, -11, -88, -26, -15, 22, 53, 48, 21, -24, 90, -57, -55, -76, -57, 29, -67, 110, 50, -22, -74, 22, -61, -111, 19, -103, -117, -73, 124, -39, 39, 81, -59, 116, 16, 66, -61, -70, -51, 59, -123, -72, 97, -4, 18, -16, -24, -59, 8, -107, -72, -62, -98, -52, -64, 115, -23, 52, -49, -13, -12, 61, 45, 83, -100, 109, 113, -61, -18, 85, -5, -100, 4, 97, 105, -89, 100, 25, 86, -30, 122, 43, -1, -120, -14, -87, 56, 36, -83, 55, 38, -92, 127, -48, 40, -83, 10, 121, 7, 115, 127, 81, -77, -30, 51, -102, 59, 98, 111, -110, -64, 56, 108, -42, 106, -119, -100, -80, -79, 96, 99, -18, -80, 3, -45, 46, -62, -110, -39, 111, -19, -36, -62, 76, 35, 122, -113, 122, -65, -61, 113, 91, 102, 49, 52, -34, -5, 94, 41, -19, -27, 93, 73, 115, 4, 108, 52, -44, -10, 82, 125, -10, -72, -82, 29, -81, 38, 60, -112, -27, 45, 7, 116, 73, 36, 73, -18, -88, -48, 19, -3, -21, -10, 31, 55, 102, 96, -61, 2, -6, -88, 125, 35, 55, -103, 62, 74, 97, -18, -1, -88, -8, -2, 39, -43, 102, -60, -81, 57, -79, -29, -22, 7, -33, -74, 83, 77, -123, -128, 82, 0, 67, 71, -7, 124, -37, -38, 108, 98, 3, -124, -100, 64, 12, 34, 97, 40, 89, 118, -11, -51, 52, -59, -119, 108, 127, -92, -94, -52, -31, -65, -90, -89, -28, -98, 107, 40, 126, 98, -58, -49, -125, 26, -39, 67, -25, 91, 83, -54, 82, -127, -103, 25, -127, -32, -108, -118, -12, -43, -103, -102, -1, -57, 88, 4, 41, -9, 115, -70, -19, -17, -34, 19, -24, 98, -107, -103, 15, 41, 78, 68, 121, -1, -91, -101, -24, -103, 12, -32, 32, -16, -17, -97, -81, 84, 100, 89, 65, -39, -124, 16, 67, -37, -67, 50, -58, -18, -59, -67, -48, -46, 0, 36, 1, -105, 120, 78, 84, 23, -76, -105, -59, -40, -106, 4, -16, 24, 64, -37, -51, 122, 78, -28, 48, -89, 66, -120, 70, -106, -111, -103, 65, -37, 7, 83, -99, -81, 17, -32, 99, 18, -118, -27, 122, 79, 45, 80, 93, -51, 35, -1, 123, 70, 39, -21, -1, -90, -106, 37, -74, 126, -15, 106, -60, 82, 27, -104, -67, 38, -8, -29, 121, -66, 112, -38, 59, 27, 98, 3, -3, -79, 119, 98, -50, -49, 110, 21, 53, -54, 116, 7, -83, -61, -28, 107, 117, -39, -1, 73, 11, -52, -97, -75, -95, -38, -20, 126, -36, 16, 124, -36, 66, 102, -67, 96, 110, -122, -97, -41, -44]注册后果:{"server_time":1599995569,"device_id":773668702534483,"install_id":3834709470876636,"device_id_str":"773668702534483","install_id_str":"3834709470876636","new_user":1}搞定,每次可注册一个新设施号。—————————————————————————————————————————— ...

December 3, 2020 · 4 min · jiezi

关于大数据:快手协议签名算法实现

1、抓包工具抓取一个申请POST /rest/n/feed/nearby?app=0&kpf=ANDROID_PHONE&ver=6.5&c=HUAWEI_KWAI&mod=HUAWEI%28HWI-AL00%29&appver=6.5.5.9591&ftt=&isp=CUCC&kpn=KUAISHOU&lon=102.698614&language=zh-cn&sys=ANDROID_9&max_memory=384&ud=0&country_code=cn&oc=HUAWEI_KWAI&hotfix_ver=&did_gt=1584622753889&iuid=&net=WIFI&did=ANDROID_9ba4839bf09a1834&lat=25.002707 HTTP/1.1 type=10&page=1&token=&count=20&id=9&refreshTimes=0&coldStart=false&source=1&browseType=1&seid=60ed7899-e25e-4b9b-b971-3f75b4df00fd&os=android&sig=75e33af6cb4a795c039e0f94a9bd27bf&client_key=3c2cd3f3 2、剖析        能够看到申请的参数中,有一个字段叫sig,咱们次要要做的工作就是通过参数计算出这个sig,通过逆向剖析发现,这个sig计算形式为: 把url中的参数放入map1中;把表单中的参数放入map2中;把map1和map2中的元素以key=value的模式放入arraylist中对arraylist进行排序;把arraylist中的元素按程序拼接成一个字符串str;把str转成bytearray;调用CPU.getClock(),传入str计算签名;CPU.getClock()是一个native办法,在libcore.so中实现 3、放代码from sig import signatureimport requestspara = { "app":"0", "kpf":"ANDROID_PHONE", "ver":"6.5", "c":"HUAWEI_KWAI", "mod":"HUAWEI(HWI-AL00)", "appver":"6.5.5.9591", # "ftt":"", "isp":"CUCC", "kpn":"KUAISHOU", # "lon":"102.698614", "language":"zh-cn", "sys":"ANDROID_9", "max_memory":"384", "ud":"0", "country_code":"cn", "oc":"HUAWEI_KWAI", # "hotfix_ver":"", "did_gt":"1584622753889", # "iuid":"", "net":"WIFI", "did":"ANDROID_9ba4839bf09a1834", # "lat":"25.002707"}post = { "type":"10", "page":"1", "token":"", "count":"20", "id":"9", "refreshTimes":"0", "coldStart":"false", "source":"1", "browseType":"1", "seid":"60ed7899-e25e-4b9b-b971-3f75b4df00fd", "os":"android", "client_key":"3c2cd3f3"}j = signature.WeChat_YY_yhzf.sig_post("https://apissl.ksapisrv.com/rest/n/feed/nearby",para,post)header = {"Content-Type":"application/x-www-form-urlencoded"} resp = requests.post(j["para"], data=j["data"],headers=header)print(resp.text)申请后果如下:搞定,完满。其余接口相似解决即可。—————————————————————————————————————————— ...

December 3, 2020 · 1 min · jiezi

关于大数据:抖音协议抖音接口批量评论技术探讨

1、抓包获取评论APIPOST /aweme/v1/comment/publish/?manifest_version_code=750&_rticket=1585579972079&app_type=normal&iid=109603465232&channel=wandoujia_aweme2&device_type=HWI-AL00&language=zh&uuid=868793039197273&resolution=1080*2160&openudid=9ba4839bf09a1834&update_version_code=7502&os_api=28&dpi=480&ac=wifi&device_id=50745463573&mcc_mnc=46001&os_version=9&version_code=750&app_name=aweme&version_name=7.5.0&js_sdk_version=1.19.4.16&device_brand=HUAWEI&ssmix=a&device_platform=android&aid=1128&ts=1585579971 HTTP/1.1 body:aweme_id=6809397725809872141&text=你好&text_extra=%5B%5D&is_self_see=0&channel_id=0 2、X-GORGON获取通过参数进行组装排序申请加密函数,失去X-GORGON 3、上代码轻易写了个演示的,将就着看吧: import requestsimport time#评论for line in open("vids.txt","r",encoding='UTF-8'): print(line) host = 'http://host' sid_guard = 'xxx' proxyip = 'xxx' para = { "manifest_version_code": "750", "app_type": "normal", "iid": "xx", "channel": "wandoujia_aweme2", "device_type": "HWI-AL00", "language": "zh", "uuid": "xx", "resolution": "1080*2160", "openudid": "xx", "update_version_code": "7502", "os_api": "28", "dpi": "480", "ac": "wifi", "device_id": "xx", "mcc_mnc": "46001", "os_version": "9", "version_code": "750", "app_name": "aweme", "version_name": "7.5.0", "js_sdk_version": "1.19.4.16", "device_brand": "HUAWEI", "ssmix": "a", "device_platform": "android", "aid": "1128" } commentUrl = host+'/operate/video/comment?token=xxx&aweme_id=xxx&txt='+line.split("-")[1]+'&sid_guard=xxx&proxyip=xxx cResp = requests.post(commentUrl,data=para) print(cResp.text)执行后果如下: ...

December 3, 2020 · 4 min · jiezi

关于大数据:Hive架构及Hive-SQL的执行流程解读

1、Hive产生背景MapReduce编程的不便性HDFS上的文件短少Schema(表名,名称,ID等,为数据库对象的汇合)2、Hive是什么Hive的应用场景是什么? 基于Hadoop做一些数据荡涤啊(ETL)、报表啊、数据分析 能够将结构化的数据文件映射为一张数据库表,并提供类SQL查问性能。 Hive是SQL解析引擎,它将SQL语句转译成M/R Job而后在Hadoop执行。 由Facebook开源,最后用于解决海量结构化的日志数据统计问题构建在Hadoop之上的数据仓库Hive定义了一品种SQL查询语言:HQL(相似SQL但不完全相同)通常用于进行离线数据处理(晚期采纳MapReduce)底层反对多种不同的执行引擎(当初能够间接把Hive跑在Spark下面)Hive底层的执行引擎有:MapReduce、Tez、Spark 3、Hive 特点Hive 最大的特点是 Hive 通过类 SQL 来剖析大数据,而防止了写 MapReduce 程序来剖析数据,这样使得剖析数据更容易Hive 是将数据映射成数据库和一张张的表,库和表的元数据信息个别存在关系型数据库上(比方 MySQL)Hive 自身并不提供数据的存储性能,数据个别都是存储在 HDFS 上的(对数据完整性、格局要求并不严格)Hive 很容易扩大本人的存储能力和计算能力,这个是继承自 hadoop 的(实用于大规模的并行计算)Hive 是专为 OLAP(在线剖析解决) 设计,不反对事务4、Hive体系架构Hive是C/S模式 客户端: Client端有JDBC/ODBC和Thrift Client,可近程拜访Hive 能够通过shell脚本的形式拜访,或者通过Thrift协定,依照平时编写JDBC的形式实现对Hive的数据操作 Server:CLI、Thrift Server、HWI(Hive web Interface)、Driver、Metastore 其中CLI、Thrift Server、HWI是裸露给Client拜访的独立部署的Hive服务Driver、Metastore是Hive外部组件,Metastore还能够供第三方SQL on Hadoop框架应用beeine(Hive 0.11引入),作为Hive JDBC Client拜访HiveServer2,解决了CLI并发拜访问题Driver: 输出了sql字符串,对sql字符串进行解析,转化程形象语法树,再转化成逻辑打算,而后应用优化工具对逻辑打算进行优化,最终生成物理打算(序列化反序列化,UDF函数),交给Execution执行引擎,提交到MapReduce上执行(输出和输入能够是本地的也能够是HDFS/Hbase)见下图的hive架构 Metastore: Metastore进行元数据管理:Derby(内置 )、Mysql;Derby:Derby只承受一个Hive的会话拜访;Mysql:Hive跑在Hadoop之上的,Mysql进行主备(定时同步操作) 由上图可知,hadoop 和 mapreduce 是 hive 架构的根基。 MetaStore:存储和治理Hive的元数据,应用关系数据库来保留元数据信息。 解析器和编译器:将SQL语句生成语法树,而后再生成DAG模式的Job链,成为逻辑打算 优化器:只提供了基于规定的优化 列过滤:去除查问中不须要的列行过滤:Where条件判断等在TableScan阶段就进行过滤,利用Partition信息,只读取符合条件的Partition谓词下推:缩小前面的数据量Join形式。 Map端join: 调整Join程序,确保以大表作为驱动表,小表载入所有mapper内存中。 shuffle join:依照hash函数,将两张表的数据发送给join。对于数据分布不平衡的表Group by时,为防止数据集中到多数的reducer上,分成两个map-reduce阶段。第一个阶段先用Distinct列进行shuffle,而后在reduce端局部聚合,减小数据规模,第二个map-reduce阶段再按group-by列聚合。。 sort merge join:排序,依照程序切割数据,雷同的范畴发送给雷同的节点(运行前在后盾创建设两张排序表,或者建表的时候指定)。 在map端用hash进行局部聚合,减小reduce端数据处理规模。执行器:执行器将DAG转换为MR工作。执行器会程序执行其中所有的Job,如果Job不存在依赖关系,采纳并发的形式进行执行。 5、基于Hadoop上的Hive SQL的执行流程 ...

December 2, 2020 · 1 min · jiezi

关于大数据:js前端对于大量数据的展示方式及处理

最近临时脱离了演示我的项目,开始了公司内比拟常见的以表单和列表为主的我的项目。干一个,爱一个了。从开始的感觉本人都做了炫酷的演示我的项目了,这对我来说就是个小意思,缓缓也开始踩坑,有了些经验总结可谈。 现下不得不说是个数据的时代,有数据就必然有前端来展现。芜杂的数据通过数据分析(未碰到的点,不讲请搜),提炼出业务相干的数据维度,而前端所做的就是把这些一个个数据通过不同维度(key-value)的形容来展现到页面上。 除去花哨的展现形式(图表等),展现一般的大量列表数据有两种罕用形式,分页和触底加载(滚动加载)。 分页是一种比拟经典的展现形式,碰到的问题比拟少,最多是因为一页展现的数据量大些的时候能够用图片懒加载,来减速一些(不过根本一页也不太会超过200个,不然就失去了分页的意义了)。 而最近在实现滚动加载时,呈现了卡顿的状况。 问题背景:数据量:1500左右;数据形容模式:图片 + 局部文字描述;卡顿呈现在两个中央: 滚动卡顿,往往是动一下滚轮,就要卡个2-3s单个数据卡片事件响应卡顿:鼠标浮动,本应0.5s向下延展,然而延展之前也会卡个1-2s;鼠标点击,本应弹出图片大图,然而弹出前也要卡个1-2s剖析过程:卡顿首先想到是渲染帧被缩短了,用控制台的Performance查看,能够看出是重排重绘费时间:如图,Recalculate Style占比远远大于其余,一瞬间要渲染太多的卡片节点,重排重绘的量太大,所以造成了次要的卡顿。因而,须要缩小霎时的渲染量。 渲染的数据项与图片渲染无关,于是会想到图片资源的加载和渲染,看控制台的Network的Img申请中,有大量的pending项(pending项参考下图所示)。图片在不停地加载而后渲染,影响了页面的失常运行,因而能够作懒加载优化。解决过程:首先针对最次要的缩小霎时渲染量,逐渐由简入繁尝试: 1. 主动触发的延时渲染由定时器来操作,setTimeout和setInterval都能够,留神及时跳出循环即可。我应用了setTimeout来作为第一次尝试(上面代码为后续补的手写,大略意思如此) 应用定时器来分页获取数据,而后push进展现的列表数据中: data() { return { count: -1, params: { ... // 申请参数 pageNo: 0, pageSize: 20 }, timer:null, list: [] }},beforeDestroy() { if (this.timer) { clearTimeout(this.timer) this.timer = null }},methods: { getListData() { this.count = -1 this.params = { ... // 申请参数 pageNo: 0, pageSize: 20 } this.timer = setTimeout(this.getListDataInterval, 1000) }, getListDataInterval() { params.pageNo++ if (params.pageNo === 1) { this.list.length = 0 } api(params) // 申请接口 .then(res => { if (res.data) { this.count = res.data.count this.list.push(...res.data.list) } }) .finally(() => { if (count >= 0 && this.list.length < count) { this.timer = setTimeout(this.getListDataInterval, 1000) } }) } ...}后果:首屏渲染速度变快了,不过滚动和事件响应还是略卡顿。起因剖析:滚动的时候还是有局部数据在渲染和加载,其次图片资源的加载渲染量未变(暂未作图片懒加载)。 ...

December 2, 2020 · 4 min · jiezi

关于大数据:专访京东集团副总裁符庆明深耕云计算11年乘新基建东风基础设施技术发展按下加速键

企业数智化转型降级的背地,抉择与谁同行至关重要 作者周文猛 随同着 2020 年新基建产业政策的出台,全行业数字化转型降级的过程被进一步减速,互联网科技巨头纷纷推出了本人的新基建策略布局布局,动辄数千亿投资,一举一动间流露出强烈的数字化浪潮追赶信心。 泛滥踊跃拥抱新基建的互联网巨头当中,往年 3 月,京东正式官宣——京东云与 AI 事业部正式将原京东云、京东人工智能、京东物联三个品牌对立为“京东智联云”品牌,并于 3 月 5 日正式启用,将依靠京东“ABCDE”策略,打造社会化的云服务根底平台设施。 事实上,在更早之前的 2019 年 12 月,不断加强技术布局的京东才刚实现京东云与 AI 事业部的整合成立,将技术服务回升成为与批发、物流、数科并列的京东四大外围业务幅员。在京东智联云动作频发的背地,同样也反映出了京东智联云作为京东对外输入技术服务的外围通道与技术基石,也正在减速参加着新一轮的产业数值化浪潮布局。 在由新基建政策号召所带来的产业数字化转型降级浪潮当中,企业数字化转型降级将面临着怎么的挑战?京东智联云作为数字化浪潮当中的一员又将会如何布局本人的新基建策略?而面向未来,有哪些新的方向与可能性正在一直吸引着泛滥的新基建参与者们络绎不绝? 在近日由 InfoQ 特地策动并推出的「新基建 50 人」系列采访报道过程中,InfoQ 记者与京东团体副总裁、京东智联云根底研发部负责人符庆明进行了一次深刻的沟通。局部答案在对话中得以揭晓。 △ 京东团体副总裁、京东智联云根底研发部负责人 符庆明 △ 01,京东智联云的新定位与新思路目前,符庆明次要负责京东基础设施研发与经营方面的工作,承接京东团体整体的根底服务,保障团体外部业务运行、提供继续竞争力,对外输入基础设施服务,满足云客户多样化需要。 作为国内最早一批从事云计算的资深从业者,2009 年任职新浪期间,符庆明便率领团队研发并推出了过后国内最早的 PaaS 平台 SAE;随后又在 2010 年推出国内最早的社交分享存储——微盘。来到新浪后,符庆明又先后在金山云、乐视云,负责首席技术官,并在 2017 年底退出京东。 联合本人多年的云计算行业思考,以及先后在新浪、金山云、乐视云等企业从事云计算技术研发、商业摸索等方面的教训积攒,符庆明总结了本人对于京东智联云倒退的整体思考。 不同于行业内一些企业,京东长期经营批发、电商业务,通过上下游的一直延展,过程中积攒了大量的产业资源和技术能力,通过自营模式整合了供应链,造成了一个劣势平台,这些起始背景的不同,使得智联云从一开始就具备了“产业生态”的倒退思路——不以单点技术为外围,而是以京东团体长期积攒的平台劣势,整合内外部所有能够整合的资源,在无效撑持团体业务的同时,以“面”的模式向行业提供技术赋能,做大生态。 在具体的做法上,今年年初,京东团体确定了“以供应链为根底的技术与服务企业”的新定位,致力于依靠团体长期在批发、电商、物流等方面积攒,减速各业务线对于 AI、大数据、云计算等新兴技术的应用,并进一步将各业务线中用到的共性技术、服务抽离进去,对外赋能行业。 "京东不仅仅是一家互联网企业,它同时更链接着供需两端,可能同时触达生产互联网和工业互联网,是一家被数字化、智能化革新最为彻底并且把实体经济搬到互联网的企业。" 在符庆明的介绍中,因为守业之初就保持自营的路线,这使得京东可能触达并洞察从创意设计到生产制作、营销、交易、仓储、配送到售后服务的各个环节,连贯着商品流、信息流、物流和金融流。因而,智联云作为承载了京东团体外部根底技术撑持和对外技术能力输入的要害业务部门,也具备了更多同行企业不具备的比拟劣势。 02,数智化转型关键在于与谁同行随同着全行业数字化转型降级的步调减速,各行业内企业对于数字化、智能化转型方面的志愿都失去了凸显。然而,因为企业对于产业数字化、智能化转型等了解不够,同时对于本身业务策略方面的布局也不够清晰,于是往往也并不分明本身心愿往哪个方向倒退的困惑。 “尽管转型降级的方向很多,然而却不足零碎的判断与剖析。”在符庆明的介绍中,在减速企业数字化转型降级的过程中,相干企业领导在强化学习和排汇相干的数字化常识理念,做好企业自身业务策略的同时,是否抉择与适宜本人的合作伙伴同行,一起制订配合业务策略的数字化、智能化计划,曾经变得极为重要。 以企业业务上云为例,符庆明联合本人在云计算畛域的长期深耕,论述了本人对于下一步国内整体的云计算产业倒退及企业云化发展的趋势性预判。 据 Gartner 公布 2019 年市场数据显示,中国云计算市场底层资源型服务占 60%,SaaS 服务层面只占 30%。而反观寰球,以美国为主导的海内云计算市场底层资源服务只占不到 25%,SaaS 服务则高达 64%。在符庆明看来,对于国内云计算产业而言,在通过了长期的云资源倒退布局之后,目前整个行业由 IaaS 层向下层 PaaS、SaaS 层倒退的趋势曾经极为显著。 ...

December 2, 2020 · 1 min · jiezi

关于大数据:抖音协议直播间弹幕信息解析

抖音协定直播间弹幕信息解析 前言:        抖音直播间公屏信息解析,说白了就是将抖音直播间公屏上加密的数据小白化,而后间接拉取出来保留在本地,比方某某送了礼物、某某关注了主播、某某说了句什么话、某某分享了直播间等等,这些数据保留在本地后,可进行二次剖析,具备肯定的价值。 怎么实现:        1、应用jadx反编译apk,或者反编译抖音apk包中对应的某一个dex即可;        2、找到直播间相干文件(函数);        3、剖析要害函数,并抽取要害函数为己用;        4、通过协定形式申请直播间数据(每距离1秒申请一次),获取返回数据(返回数据是加密过的);        5、对返回数据进行解密。 jadx: 后果:1、进入直播间音讯: { "action": 1, "common": { "display_text": { "default_format": { "color": "#b8ffffff", "weight": 400 }, "default_pattern": "{0:user} 来了{1:string}", "key": "live_room_enter_toast", "pieces": [ { "format": { "color": "#8CE7FF", "weight": 400 }, "type": 11, "user_value": { "user": { "avatar_thumb": { "uri": "100x100/31b4100035fdb534a13bf", "url_list": [ "https://p3-dy.byteimg.com/aweme/100x100/31b4100035fdb534a13bf.jpeg?from\u003d4010531038", "https://p9-dy.byteimg.com/aweme/100x100/31b4100035fdb534a13bf.jpeg?from\u003d4010531038", "https://p29-dy.byteimg.com/aweme/100x100/31b4100035fdb534a13bf.jpeg?from\u003d4010531038" ] }, "badge_image_list": [ { "height": 16, "image_type": 1, "uri": "webcast/aweme_honor_level_icon_new_9.png", "url_list": [ "http://p9-webcast-dycdn.byteimg.com/img/webcast/aweme_honor_level_icon_new_9.png~tplv-obj.image", "http://p3-webcast-dycdn.byteimg.com/img/webcast/aweme_honor_level_icon_new_9.png~tplv-obj.image" ], "width": 32 } ], "display_id": "DY19940224", "fans_club": { "data": { "available_gift_ids": [], "badge": { "icons": { "0": { "url_list": [] } } } }, "prefer_data": {} }, "follow_info": { "follower_count": 1288, "following_count": 1 }, "gender": 1, "id": 92401378365, "new_real_time_icons": [], "nickname": "百小格", "pay_grade": { "grade_icon_list": [], "level": 9, "new_im_icon_with_level": { "height": 16, "image_type": 1, "uri": "webcast/aweme_honor_level_icon_new_9.png", "url_list": [ "http://p9-webcast-dycdn.byteimg.com/img/webcast/aweme_honor_level_icon_new_9.png~tplv-obj.image", "http://p3-webcast-dycdn.byteimg.com/img/webcast/aweme_honor_level_icon_new_9.png~tplv-obj.image" ], "width": 32 }, "new_live_icon": { "height": 12, "image_type": 1, "uri": "webcast/aweme_pay_grade_2x_5_9.png", "url_list": [ "http://p9-webcast-dycdn.byteimg.com/img/webcast/aweme_pay_grade_2x_5_9.png~tplv-obj.image", "http://p1-webcast-dycdn.byteimg.com/img/webcast/aweme_pay_grade_2x_5_9.png~tplv-obj.image" ], "width": 12 } }, "real_time_icons": [], "sec_uid": "MS4wLjABAAAA9y_l6W8IqGhdMXCC7m0hE7nrCmYJc75tsvYSo-GJmaQ", "short_id": 3468880547, "top_fans": [], "user_attr": {} } } } ] }, "is_show_msg": true, "method": "WebcastMemberMessage", "msg_id": 6847185181007268612, "room_id": 6847101220063021837 }, "member_count": 6618, "user": { "avatar_thumb": { "uri": "100x100/31b4100035fdb534a13bf", "url_list": [ "https://p3-dy.byteimg.com/aweme/100x100/31b4100035fdb534a13bf.jpeg?from\u003d4010531038", "https://p9-dy.byteimg.com/aweme/100x100/31b4100035fdb534a13bf.jpeg?from\u003d4010531038", "https://p29-dy.byteimg.com/aweme/100x100/31b4100035fdb534a13bf.jpeg?from\u003d4010531038" ] }, "badge_image_list": [ { "height": 16, "image_type": 1, "uri": "webcast/aweme_honor_level_icon_new_9.png", "url_list": [ "http://p9-webcast-dycdn.byteimg.com/img/webcast/aweme_honor_level_icon_new_9.png~tplv-obj.image", "http://p3-webcast-dycdn.byteimg.com/img/webcast/aweme_honor_level_icon_new_9.png~tplv-obj.image" ], "width": 32 } ], "display_id": "DY19940224", "fans_club": { "data": { "available_gift_ids": [], "badge": { "icons": { "0": { "url_list": [] } } } }, "prefer_data": {} }, "follow_info": { "follower_count": 1288, "following_count": 1 }, "gender": 1, "id": 92401378365, "new_real_time_icons": [], "nickname": "百小格", "pay_grade": { "grade_icon_list": [], "level": 1, "new_im_icon_with_level": { "height": 16, "image_type": 1, "uri": "webcast/aweme_honor_level_icon_new_9.png", "url_list": [ "http://p9-webcast-dycdn.byteimg.com/img/webcast/aweme_honor_level_icon_new_9.png~tplv-obj.image", "http://p3-webcast-dycdn.byteimg.com/img/webcast/aweme_honor_level_icon_new_9.png~tplv-obj.image" ], "width": 32 }, "new_live_icon": { "height": 12, "image_type": 1, "uri": "webcast/aweme_pay_grade_2x_5_9.png", "url_list": [ "http://p9-webcast-dycdn.byteimg.com/img/webcast/aweme_pay_grade_2x_5_9.png~tplv-obj.image", "http://p1-webcast-dycdn.byteimg.com/img/webcast/aweme_pay_grade_2x_5_9.png~tplv-obj.image" ], "width": 12 } }, "real_time_icons": [], "sec_uid": "MS4wLjABAAAA9y_l6W8IqGhdMXCC7m0hE7nrCmYJc75tsvYSo-GJmaQ", "short_id": 3468880547, "top_fans": [], "user_attr": {} }}2、互动音讯: ...

December 2, 2020 · 6 min · jiezi

关于大数据:抖音协议点赞评论直播弹幕加密算法研究分析

首先这里有一篇对于Android逆向工程的文章,反编译了抖音的libuserinfo.so文件的种种加密入口限度,使得本人的Android程序能够调用该so文件间接加密校验。这样的成果就是无需真正意义破解加密算法。 这里间接讲抖音的加密算法自身。火山小视频也一样。咱们拿来进行钻研剖析学习下。仅供学习交换。 抖音外围协定的步骤是: 1、在查问串插入一个固定的键rstr 2、对查问串进行按键排序并取值,对空格和+进行本义为a 3、而后取MD5;如果时间轴&1为1,那么取多一次MD5 4、将MD5后果别离和56、1**4进行2次错位排序算法 5、将4的后果再进行一次错位排序,失去26位字符 6、将字符别离取18位给到as和cp字段,追加到查问串最初 在最新的SDK版本有了新的mas字段辅助校验,这个齐全能够疏忽,只有把查问串的version_code设置到169之前就能够跳过这个字段了。 另外aid为必填字段,其余和接口自身无关的字段都可去掉。 抖音协定、火山小视频通信协议 抖音协定、火山小视频通信协议 因为这里波及到抖音公司的外围利益,就不放具体代码和要害Key值了。仅供钻研加密算法学习。 —————————————————————————————————————————————— TiToData:业余的短视频、直播数据接口服务平台。更多信息请分割: TiToData笼罩支流平台:抖音,快手,小红书,TikTok,YouTube

December 2, 2020 · 1 min · jiezi

关于大数据:抖音爬虫最新方法首页推荐视频列表关注视频列表同城视频列表视频详情用户粉丝列表

最近有需要须要爬取抖音的一些数据,网上的一些办法都比拟老,因为抖音降级较快曾经不太实用了,所以只能本人解决了。本次是对最新版本抖音app(13.6.0版本)进行的数据的抓取。次要是通过脱壳、frida的逆向开发,在java层和Native层申请参数逆向还原,以及ida动静调试so文件破解申请参数和加密算法实现的爬取。目前曾经能爬取到抖音的集体核心、首页举荐视频列表、关注视频列表、同城视频列表、视频详情、用户粉丝列表、用户关注列表、用户作品列表、用户喜爱列表、用户权限、抖音热榜、明星榜、直播榜、音乐榜等。 一、集体核心数据(以明星万茜为例){ "user":{ "custom_verify":"演员万茜", "followers_detail":[ { "name":"抖音", "icon":"http://p3.pstatp.com/origin/50ec00079b64de2050dc", "fans_count":3117098, "open_url":"snssdk1128://user/profile/2559257897875871?", "apple_id":"1142110895", "download_url":"https://d.douyin.com/JsvN/", "package_name":"com.ss.android.ugc.aweme", "app_name":"aweme" }, { "fans_count":837857, "open_url":"snssdk143://profile?uid=54131370834", "apple_id":"529092160", "download_url":"https://d.toutiao.com/YjjY/", "package_name":"com.ss.android.article.news", "app_name":"news_article", "name":"头条", "icon":"http://p3.pstatp.com/origin/50ed00079a1b6b8d1fb1" }, { "apple_id":"1086047750", "download_url":"http://d.huoshanzhibo.com/eFvB/", "package_name":"com.ss.android.ugc.live", "app_name":"live_stream", "name":"抖音火山版", "icon":"http://p3.pstatp.com/origin/2ea5c000abe106154adef", "fans_count":0, "open_url":"snssdk1112://profile?id=0" } ], "commerce_info":{ "offline_info_list":[ ], "challenge_list":[ ], "task_list":null, "head_image_list":null, "smart_phone_list":null }, "watch_status":false, "is_activity_user":false, "is_block":false, "with_commerce_entry":true, "profile_tab_type":0, "sec_uid":"MS4wLjABAAAA4_lIixBk6FAtLaq52ONCBDAqOd-qQtLAgMgGpjVEd0mLgZ8CM8nZA4TImrHTGnah", "enterprise_user_info":"{"commerce_info":{"offline_info_list":[],"challenge_list":[],"task_list":null,"head_image_list":null,"smart_phone_list":null},"homepage_bottom_toast":[],"permissions":[{"Id":4,"Key":"LiveShop","Name":"直播电商","AppId":1128,"Status":1,"Extra":null,"Customization":null,"Parent":0,"Actions":null},{"Id":5,"Key":"UserShop","Name":"集体橱窗","AppId":1128,"Status":1,"Extra":null,"Customization":null,"Parent":0,"Actions":null},{"Id":3,"Key":"ItemShop","Name":"视频电商","AppId":1128,"Status":1,"Extra":null,"Customization":null,"Parent":0,"Actions":null}]}", "follow_status":1, "sync_to_toutiao":1, "secret":0, "ins_id":"", "dongtai_count":28, "life_story_block":{ "life_story_block":false }, "tab_settings":{ "private_tab":{ "show_private_tab":false, "private_tab_style":1 } }, "message_chat_entry":true, "nickname":"万茜", "aweme_count":28, "school_name":"", "twitter_id":"", "with_fusion_shop_entry":true, "mplatform_followers_count":3954955, "country":"中国", "following_count":7, "room_id":0, "star_billboard_rank":16, "is_effect_artist":false, "is_star":true, "is_mix_user":false, "signature":"演员万茜", "show_favorite_list":true, "forward_count":0, "uid":"2559257897875871", "twitter_name":"", "follower_status":0, "district":"滨江", "video_cover":{ }, "original_musician":{ "music_used_count":0, "digg_count":0, "music_count":0 }, "r_fans_group_info":{ }, "birthday_hide_level":1, "city":"杭州", "follower_count":3117098, "youtube_channel_title":"", "short_id":"0", "enterprise_verify_reason":"", "youtube_channel_id":"", "iso_country_code":"", "with_commerce_enterprise_tab_entry":false, "is_blocked":false, "display_wvalantine_activity_entry":true, "location":"杭州", "verification_type":1, "unique_id":"dyzd1sj2p8p3", "apple_account":0, } }, "extra":{ "now":1605952430000, "fatal_item_ids":[ ], "logid":"2020112117535001020208903058B1B831" }, "log_pb":{ "impr_id":"2020112117535001020208903058B1B831" }, "status_code":0}  ...

December 1, 2020 · 1 min · jiezi

关于大数据:使用python爬取抖音app视频

记录一下如何用python爬取app数据,本文以爬取抖音视频app为例。编程工具:pycharmapp抓包工具:mitmproxyapp自动化工具:appium运行环境:windows10思路:假如曾经配置好咱们所须要的工具1、应用mitmproxy对手机app抓包获取咱们想要的内容2、利用appium自动化测试工具,驱动app模仿人的动作(滑动、点击等)3、将1和2相结合达到自动化爬虫的成果 一、mitmproxy/mitmdump抓包确保曾经装置好了mitmproxy,并且手机和PC处于同一个局域网下,同时也配置好了mitmproxy的CA证书,网上有很多相干的配置教程,这里我就略过了。因为mitmproxy不反对windows零碎,所以这里用的是它的组件之一mitmdump,它是mitmproxy的命令行接口,能够利用它对接咱们的Python脚本,用Python实现监听后的解决。在配置好mitmproxy之后,在管制台上输出mitmdump并在手机上关上抖音app,mitmdump会出现手机上的所有申请,如下图      能够在抖音app始终往下滑,看mitmdump所展现的申请,会发现前缀别离为 http://v1-dy.ixigua.com/;http://v3-dy.ixigua.com/;http://v9-dy.ixigua.com/这3个类型前缀的url正是咱们的指标抖音视频url。那接下来就要编写python脚本将视频下载下来,须要应用 mitmdump -s scripts.py(此处为python文件名)来执行脚本。 import requests# 文件门路path = 'D:/video/'num = 1788 def response(flow): global num # 经测试发现视频url前缀次要是3个 target_urls = ['http://v1-dy.ixigua.com/', 'http://v9-dy.ixigua.com/', 'http://v3-dy.ixigua.com/'] for url in target_urls: # 过滤掉不须要的url if flow.request.url.startswith(url): # 设置视频名 filename = path + str(num) + '.mp4' # 应用request获取视频url的内容 # stream=True作用是推延下载响应体直到拜访Response.content属性 res = requests.get(flow.request.url, stream=True) # 将视频写入文件夹 with open(filename, 'ab') as f: f.write(res.content) f.flush() print(filename + '下载实现') num += 1 代码写得比拟毛糙,不过根本的逻辑还是比拟清晰的,这样咱们就能够把抖音的视频下载下来,不过这个办法有个缺点,就是获取视频须要人来一直地滑动抖音的下一个视频,这时候咱们能够用一个弱小的appium自动化测试工具来解决。  ...

December 1, 2020 · 1 min · jiezi

关于大数据:快手API视频评论的子评论

快手视频API、快手爬虫、快手去水印、快手视频下载、快手视频解析TiToData:业余的短视频、直播数据接口服务平台。更多信息请分割: TiToData笼罩支流平台:抖音,快手,小红书,TikTok,YouTube 快手API:视频评论的子评论申请APIhttp://主机地址/kwshow/video/sub/comments?token=xxx&photoId=5254293427996693557&rootCommentId=266591870402申请形式GET参数字段类型阐明tokenstring接口受权码photoIdstring视频的photoId,能够是5190398608707912800这个格局或者3xr4s9mcx8x8axm这个格局rootCommentIdint一级评论的idcursorint翻页游标,依据后果返回的cursor传入作为下一页翻页参数,初始为0返回示例{ "code": 200, "data": { "result": 1, "pcursor": "269358157849", "host-name": "sd-bjpg-rs768.yz02", "subComments": [ { "content": "机智[赞]", "replyToUserName": "凉凉的18", "commentBottomTags": [], "likedCount": 105, "time": "2020-10-10 12:46:02", "timestamp": 1602305161670, "type": 0, "photo_id": "5254293427996693557", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2019/04/20/13/BMjAxOTA0MjAxMzI5MzVfNDMzMTg3NTY1XzFfaGQ2NjVfMTQw_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2019/04/20/13/BMjAxOTA0MjAxMzI5MzVfNDMzMTg3NTY1XzFfaGQ2NjVfMTQw_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2019/04/20/13/BMjAxOTA0MjAxMzI5MzVfNDMzMTg3NTY1XzFfaGQ2NjVfMTQw_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 433187565, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2019/04/20/13/BMjAxOTA0MjAxMzI5MzVfNDMzMTg3NTY1XzFfaGQ2NjVfMTQw_s.jpg", "author_id": 433187565, "comment_id": 266672673226, "reply_to": 977032978, "user_sex": "F", "author_name": "车行鹿姐" }, { "content": "我遇到过,很多年前的事", "replyToUserName": "凉凉的18", "commentBottomTags": [], "likedCount": 7, "time": "2020-10-10 21:56:36", "timestamp": 1602338196457, "type": 0, "photo_id": "5254293427996693557", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/08/23/17/BMjAyMDA4MjMxNzAzMjlfMjA2NDU5OTYxMl8yX2hkOTQ4XzEwOA==_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/08/23/17/BMjAyMDA4MjMxNzAzMjlfMjA2NDU5OTYxMl8yX2hkOTQ4XzEwOA==_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/08/23/17/BMjAyMDA4MjMxNzAzMjlfMjA2NDU5OTYxMl8yX2hkOTQ4XzEwOA==_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 433187565, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/08/23/17/BMjAyMDA4MjMxNzAzMjlfMjA2NDU5OTYxMl8yX2hkOTQ4XzEwOA==_s.jpg", "author_id": 2064599612, "comment_id": 266831095277, "reply_to": 977032978, "user_sex": "U", "author_name": "蓝色梦幻" }, { "content": "-[赞]", "replyToUserName": "车行鹿姐", "commentBottomTags": [], "likedCount": 2, "time": "2020-10-10 22:16:14", "timestamp": 1602339373848, "type": 0, "photo_id": "5254293427996693557", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2019/10/25/22/BMjAxOTEwMjUyMjMwMjJfMTU0ODQ4OTE0M18yX2hkNjk3Xzc5OQ==_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2019/10/25/22/BMjAxOTEwMjUyMjMwMjJfMTU0ODQ4OTE0M18yX2hkNjk3Xzc5OQ==_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2019/10/25/22/BMjAxOTEwMjUyMjMwMjJfMTU0ODQ4OTE0M18yX2hkNjk3Xzc5OQ==_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 433187565, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2019/10/25/22/BMjAxOTEwMjUyMjMwMjJfMTU0ODQ4OTE0M18yX2hkNjk3Xzc5OQ==_s.jpg", "author_id": 1548489143, "comment_id": 266839371945, "reply_to": 433187565, "user_sex": "F", "author_name": "婷婷92745" } ] }, "msg": "success", "app": "kwshow"}

December 1, 2020 · 1 min · jiezi

关于大数据:快手API视频评论

快手视频API、快手爬虫、快手去水印、快手视频下载、快手视频解析TiToData:业余的短视频、直播数据接口服务平台。更多信息请分割: TiToData笼罩支流平台:抖音,快手,小红书,TikTok,YouTube 快手API:视频评论申请APIhttp://主机地址/kwshow/video/comments?token=xxx&photoId=5190398608707912800申请形式GET参数字段类型阐明tokenstring接口受权码photoIdstring视频的photoId,能够是5190398608707912800这个格局或者3xr4s9mcx8x8axm这个格局cursorint翻页游标,依据后果返回的cursor传入作为下一页翻页参数,初始为0返回示例{ "code": 200, "data": { "result": 1, "pcursor": "275198378931", "host-name": "webservice-xm-c232.idczw.hb1.kwaidc.com", "subCommentsMap": { "257587597350": { "pcursor": "257661254422", "subComments": [ { "content": "哈哈", "replyToUserName": "雨青", "commentBottomTags": [], "likedCount": 505, "time": "2020-09-10 18:55:27", "timestamp": 1599735327264, "type": 0, "photo_id": "5190398608707912800", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/09/30/13/BMjAyMDA5MzAxMzE5MDZfMjAwNDk2OTEzMF8yX2hkMTcyXzkwMQ==_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/09/30/13/BMjAyMDA5MzAxMzE5MDZfMjAwNDk2OTEzMF8yX2hkMTcyXzkwMQ==_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/09/30/13/BMjAyMDA5MzAxMzE5MDZfMjAwNDk2OTEzMF8yX2hkMTcyXzkwMQ==_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 1338192401, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/09/30/13/BMjAyMDA5MzAxMzE5MDZfMjAwNDk2OTEzMF8yX2hkMTcyXzkwMQ==_s.jpg", "author_id": 2004969130, "comment_id": 257594998052, "reply_to": 1998802261, "user_sex": "F", "author_name": "温顺杀手(小号)互粉" }, { "content": "光线问题理解一下", "replyToUserName": "雨青", "commentBottomTags": [], "likedCount": 889, "time": "2020-09-10 20:58:37", "timestamp": 1599742717032, "type": 0, "photo_id": "5190398608707912800", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/08/31/00/BMjAyMDA4MzEwMDIxMTdfMTY4MjA2OTA5MF8yX2hkNzM0XzU3MA==_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/08/31/00/BMjAyMDA4MzEwMDIxMTdfMTY4MjA2OTA5MF8yX2hkNzM0XzU3MA==_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/08/31/00/BMjAyMDA4MzEwMDIxMTdfMTY4MjA2OTA5MF8yX2hkNzM0XzU3MA==_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 1338192401, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/08/31/00/BMjAyMDA4MzEwMDIxMTdfMTY4MjA2OTA5MF8yX2hkNzM0XzU3MA==_s.jpg", "author_id": 1682069090, "comment_id": 257636891846, "reply_to": 1998802261, "user_sex": "F", "author_name": "不谈恋爱º" }, { "content": "反正都是白[狞笑]", "replyToUserName": "雨青", "commentBottomTags": [], "likedCount": 821, "time": "2020-09-10 21:46:32", "timestamp": 1599745592338, "type": 0, "photo_id": "5190398608707912800", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/08/18/07/BMjAyMDA4MTgwNzQ0MzBfMTc2NjgyMzUwNV8yX2hkMTAxXzY5OA==_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/08/18/07/BMjAyMDA4MTgwNzQ0MzBfMTc2NjgyMzUwNV8yX2hkMTAxXzY5OA==_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/08/18/07/BMjAyMDA4MTgwNzQ0MzBfMTc2NjgyMzUwNV8yX2hkMTAxXzY5OA==_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 1338192401, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/08/18/07/BMjAyMDA4MTgwNzQ0MzBfMTc2NjgyMzUwNV8yX2hkMTAxXzY5OA==_s.jpg", "author_id": 1766823505, "comment_id": 257654613584, "reply_to": 1998802261, "user_sex": "M", "author_name": "硅胶花滋滋滋" } ] } }, "rootComments": [ { "content": "镜子里是冷白皮,镜子外是衰弱白。 所以镜子有美颜效用,我说镜子里的我怎么这么难看[狞笑]", "commentBottomTags": [], "recallType": 1, "hot": true, "likedCount": 23062, "subCommentCount": 78, "time": "2020-09-10 18:30:08", "timestamp": 1599733807548, "type": 0, "photo_id": "5190398608707912800", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/09/28/18/BMjAyMDA5MjgxODA0MzVfMTk5ODgwMjI2MV8yX2hkNzg1XzcwMQ==_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/09/28/18/BMjAyMDA5MjgxODA0MzVfMTk5ODgwMjI2MV8yX2hkNzg1XzcwMQ==_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/09/28/18/BMjAyMDA5MjgxODA0MzVfMTk5ODgwMjI2MV8yX2hkNzg1XzcwMQ==_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 1338192401, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/09/28/18/BMjAyMDA5MjgxODA0MzVfMTk5ODgwMjI2MV8yX2hkNzg1XzcwMQ==_s.jpg", "author_id": 1998802261, "comment_id": 257587597350, "reply_to": 0, "user_sex": "F", "author_name": "雨青" }, { "content": "打榜路过", "commentBottomTags": [], "likedCount": 0, "time": "2020-11-14 00:56:39", "timestamp": 1605286598959, "type": 0, "photo_id": "5190398608707912800", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/11/14/01/BMjAyMDExMTQwMTAwMDlfMTQ0OTkwODEwMl8yX2hkOTk5Xzg2_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/11/14/01/BMjAyMDExMTQwMTAwMDlfMTQ0OTkwODEwMl8yX2hkOTk5Xzg2_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/11/14/01/BMjAyMDExMTQwMTAwMDlfMTQ0OTkwODEwMl8yX2hkOTk5Xzg2_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 1338192401, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/11/14/01/BMjAyMDExMTQwMTAwMDlfMTQ0OTkwODEwMl8yX2hkOTk5Xzg2_s.jpg", "author_id": 1449908102, "comment_id": 275992920022, "reply_to": 0, "user_sex": "F", "author_name": "열 둘." }, { "content": "爱了", "commentBottomTags": [], "likedCount": 0, "time": "2020-11-13 23:35:09", "timestamp": 1605281708536, "type": 0, "photo_id": "5190398608707912800", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/10/24/14/BMjAyMDEwMjQxNDIxMDFfMjEwNzE2NzEzNV8yX2hkNTgyXzkzOQ==_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/10/24/14/BMjAyMDEwMjQxNDIxMDFfMjEwNzE2NzEzNV8yX2hkNTgyXzkzOQ==_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/10/24/14/BMjAyMDEwMjQxNDIxMDFfMjEwNzE2NzEzNV8yX2hkNTgyXzkzOQ==_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 1338192401, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/10/24/14/BMjAyMDEwMjQxNDIxMDFfMjEwNzE2NzEzNV8yX2hkNTgyXzkzOQ==_s.jpg", "author_id": 2107167135, "comment_id": 275980930791, "reply_to": 0, "user_sex": "F", "author_name": "贩卖迪迪" }, { "content": "[赞][赞][赞]", "commentBottomTags": [], "likedCount": 0, "time": "2020-11-13 22:00:59", "timestamp": 1605276059042, "type": 0, "photo_id": "5190398608707912800", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/11/13/22/BMjAyMDExMTMyMjE2MTNfNjgyNDA5MDExXzJfaGQ1NzhfOTc5_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/11/13/22/BMjAyMDExMTMyMjE2MTNfNjgyNDA5MDExXzJfaGQ1NzhfOTc5_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/11/13/22/BMjAyMDExMTMyMjE2MTNfNjgyNDA5MDExXzJfaGQ1NzhfOTc5_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 1338192401, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/11/13/22/BMjAyMDExMTMyMjE2MTNfNjgyNDA5MDExXzJfaGQ1NzhfOTc5_s.jpg", "author_id": 682409011, "comment_id": 275949240440, "reply_to": 0, "user_sex": "F", "author_name": "原来,星星????也哭过……" }, { "content": "美", "commentBottomTags": [], "likedCount": 0, "time": "2020-11-13 20:15:07", "timestamp": 1605269707095, "type": 0, "photo_id": "5190398608707912800", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/07/20/18/BMjAyMDA3MjAxODUyNDFfMjI5MTg1MTYwXzJfaGQ1NTFfNDM3_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/07/20/18/BMjAyMDA3MjAxODUyNDFfMjI5MTg1MTYwXzJfaGQ1NTFfNDM3_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/07/20/18/BMjAyMDA3MjAxODUyNDFfMjI5MTg1MTYwXzJfaGQ1NTFfNDM3_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 1338192401, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/07/20/18/BMjAyMDA3MjAxODUyNDFfMjI5MTg1MTYwXzJfaGQ1NTFfNDM3_s.jpg", "author_id": 229185160, "comment_id": 275899538408, "reply_to": 0, "user_sex": "F", "author_name": "嘉益的小迷妹" }, { "content": "迪丽热巴[爱心]", "commentBottomTags": [], "likedCount": 0, "time": "2020-11-13 07:31:26", "timestamp": 1605223885681, "type": 0, "photo_id": "5190398608707912800", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/10/29/11/BMjAyMDEwMjkxMTQ1NDlfMTMzNDgyNjkyOF8yX2hkODBfNzQ4_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/10/29/11/BMjAyMDEwMjkxMTQ1NDlfMTMzNDgyNjkyOF8yX2hkODBfNzQ4_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/10/29/11/BMjAyMDEwMjkxMTQ1NDlfMTMzNDgyNjkyOF8yX2hkODBfNzQ4_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 1338192401, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/10/29/11/BMjAyMDEwMjkxMTQ1NDlfMTMzNDgyNjkyOF8yX2hkODBfNzQ4_s.jpg", "author_id": 1334826928, "comment_id": 275721818805, "reply_to": 0, "user_sex": "F", "author_name": "南北朝.o" }, { "content": "[爱心]", "commentBottomTags": [], "likedCount": 0, "time": "2020-11-12 23:35:44", "timestamp": 1605195344040, "type": 0, "photo_id": "5190398608707912800", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/11/09/08/BMjAyMDExMDkwODIwNTZfMTM5NTA5ODAwNl8yX2hkNzQyXzc1OA==_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/11/09/08/BMjAyMDExMDkwODIwNTZfMTM5NTA5ODAwNl8yX2hkNzQyXzc1OA==_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/11/09/08/BMjAyMDExMDkwODIwNTZfMTM5NTA5ODAwNl8yX2hkNzQyXzc1OA==_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 1338192401, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/11/09/08/BMjAyMDExMDkwODIwNTZfMTM5NTA5ODAwNl8yX2hkNzQyXzc1OA==_s.jpg", "author_id": 1395098006, "comment_id": 275694080516, "reply_to": 0, "user_sex": "M", "author_name": "俄木里布????" }, { "content": "啊啊啊啊啊啊啊啊啊", "commentBottomTags": [], "likedCount": 0, "time": "2020-11-12 23:12:07", "timestamp": 1605193927258, "type": 0, "photo_id": "5190398608707912800", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/11/12/23/BMjAyMDExMTIyMzEzMzhfODI0NjQzNjM2XzJfaGQxNTFfOTg3_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/11/12/23/BMjAyMDExMTIyMzEzMzhfODI0NjQzNjM2XzJfaGQxNTFfOTg3_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/11/12/23/BMjAyMDExMTIyMzEzMzhfODI0NjQzNjM2XzJfaGQxNTFfOTg3_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 1338192401, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/11/12/23/BMjAyMDExMTIyMzEzMzhfODI0NjQzNjM2XzJfaGQxNTFfOTg3_s.jpg", "author_id": 824643636, "comment_id": 275689886669, "reply_to": 0, "user_sex": "F", "author_name": "Dummer✨✨✨✨✨" }, { "content": "[爱心]", "commentBottomTags": [], "likedCount": 0, "time": "2020-11-12 20:21:27", "timestamp": 1605183687271, "type": 0, "photo_id": "5190398608707912800", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/08/06/14/BMjAyMDA4MDYxNDE5MjFfNDg1NTA2ODM3XzJfaGQ0NzdfMTQ3_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/08/06/14/BMjAyMDA4MDYxNDE5MjFfNDg1NTA2ODM3XzJfaGQ0NzdfMTQ3_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/08/06/14/BMjAyMDA4MDYxNDE5MjFfNDg1NTA2ODM3XzJfaGQ0NzdfMTQ3_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 1338192401, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/08/06/14/BMjAyMDA4MDYxNDE5MjFfNDg1NTA2ODM3XzJfaGQ0NzdfMTQ3_s.jpg", "author_id": 485506837, "comment_id": 275637501770, "reply_to": 0, "user_sex": "F", "author_name": "❤️丽姐吖????" }, { "content": "是心动啊", "commentBottomTags": [], "likedCount": 0, "time": "2020-11-12 11:26:47", "timestamp": 1605151607047, "type": 0, "photo_id": "5190398608707912800", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/08/05/09/BMjAyMDA4MDUwOTI1MTFfMTk3ODc4OTg1Ml8yX2hkODc0XzQ4NQ==_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/08/05/09/BMjAyMDA4MDUwOTI1MTFfMTk3ODc4OTg1Ml8yX2hkODc0XzQ4NQ==_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/08/05/09/BMjAyMDA4MDUwOTI1MTFfMTk3ODc4OTg1Ml8yX2hkODc0XzQ4NQ==_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 1338192401, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/08/05/09/BMjAyMDA4MDUwOTI1MTFfMTk3ODc4OTg1Ml8yX2hkODc0XzQ4NQ==_s.jpg", "author_id": 1978789852, "comment_id": 275520978290, "reply_to": 0, "user_sex": "F", "author_name": "双辞❤" }, { "content": "[爱心]", "commentBottomTags": [], "likedCount": 0, "time": "2020-11-11 18:19:04", "timestamp": 1605089943819, "type": 0, "photo_id": "5190398608707912800", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/10/31/11/BMjAyMDEwMzExMTEwNTFfMTA1ODYzODgyMV8yX2hkOTkzXzYxNA==_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/10/31/11/BMjAyMDEwMzExMTEwNTFfMTA1ODYzODgyMV8yX2hkOTkzXzYxNA==_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/10/31/11/BMjAyMDEwMzExMTEwNTFfMTA1ODYzODgyMV8yX2hkOTkzXzYxNA==_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 1338192401, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/10/31/11/BMjAyMDEwMzExMTEwNTFfMTA1ODYzODgyMV8yX2hkOTkzXzYxNA==_s.jpg", "author_id": 1058638821, "comment_id": 275371801267, "reply_to": 0, "user_sex": "F", "author_name": "李文章????" }, { "content": "怎么能够这么美", "commentBottomTags": [], "likedCount": 1, "time": "2020-11-11 17:35:45", "timestamp": 1605087345487, "type": 0, "photo_id": "5190398608707912800", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/11/11/17/BMjAyMDExMTExNzE4MDdfMjEzNzU1ODE2MF8yX2hkNDY3Xzk4OQ==_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/11/11/17/BMjAyMDExMTExNzE4MDdfMjEzNzU1ODE2MF8yX2hkNDY3Xzk4OQ==_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/11/11/17/BMjAyMDExMTExNzE4MDdfMjEzNzU1ODE2MF8yX2hkNDY3Xzk4OQ==_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 1338192401, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/11/11/17/BMjAyMDExMTExNzE4MDdfMjEzNzU1ODE2MF8yX2hkNDY3Xzk4OQ==_s.jpg", "author_id": 2137558160, "comment_id": 275360514419, "reply_to": 0, "user_sex": "F", "author_name": "????" }, { "content": "打榜路过", "commentBottomTags": [], "likedCount": 0, "time": "2020-11-11 12:11:25", "timestamp": 1605067885048, "type": 0, "photo_id": "5190398608707912800", "author_liked": false, "headurls": [ { "cdn": "tx2.a.yximgs.com", "url": "https://tx2.a.yximgs.com/uhead/AB/2020/10/26/13/BMjAyMDEwMjYxMzIxNDdfMTgyODAyODg4Ml8yX2hkNDcyXzQzOQ==_s.jpg" }, { "cdn": "js2.a.yximgs.com", "url": "https://js2.a.yximgs.com/uhead/AB/2020/10/26/13/BMjAyMDEwMjYxMzIxNDdfMTgyODAyODg4Ml8yX2hkNDcyXzQzOQ==_s.jpg", "urlPattern": "https://js2.a.yximgs.com/uhead/AB/2020/10/26/13/BMjAyMDEwMjYxMzIxNDdfMTgyODAyODg4Ml8yX2hkNDcyXzQzOQ==_s.jpg@base@tag%3DimgScale%26r%3D0%26q%3D85%26w%3D{w}%26h%3D{h}%26rotate" } ], "user_id": 1338192401, "headurl": "https://tx2.a.yximgs.com/uhead/AB/2020/10/26/13/BMjAyMDEwMjYxMzIxNDdfMTgyODAyODg4Ml8yX2hkNDcyXzQzOQ==_s.jpg", "author_id": 1828028882, "comment_id": 275306117143, "reply_to": 0, "user_sex": "F", "author_name": "樱桃小迪呀????" } ], "commentCount": 23381 }, "msg": "success", "app": "kwshow"}

December 1, 2020 · 4 min · jiezi

关于大数据:ClickHouse集群搭建二

重叠泪痕缄锦字,人生只有情难死。 分布式集群装置在上一章咱们曾经实现ClickHouse分布式集群装置,也创立本地表和分布式表进行了测试,然而,如果停掉一个节点会产生神马状况? node03上kill掉clickhouse-server过程[root@node03 ~]# ps -ef | grep clickhouseclickho+ 2233 1 73 13:07 ? 00:00:02 clickhouse-server --daemon --pid-file=/var/run/clickhouse-server/clickhouse-server.pid --config-file=/etc/clickhouse-server/config.xmlroot 2306 1751 0 13:07 pts/0 00:00:00 grep --color=auto clickhouse[root@node03 ~]# service clickhouse-server stopStop clickhouse-server service: DONE[root@node03 ~]# ps -ef | grep clickhouseroot 2337 1751 0 13:07 pts/0 00:00:00 grep --color=auto clickhousenode01上查问分布式表node01 :) select * from cluster3s1r_all; # node03没有被杀掉时SELECT *FROM cluster3s1r_all┌─id─┬─website─────────────────┬─wechat─────┬─FlightDate─┬─Year─┐│ 2 │ http://www.merryyou.cn/ │ javaganhuo │ 2020-11-28 │ 2020 │└────┴─────────────────────────┴────────────┴────────────┴──────┘┌─id─┬─website───────────────┬─wechat───┬─FlightDate─┬─Year─┐│ 1 │ https://niocoder.com/ │ java干货 │ 2020-11-28 │ 2020 │└────┴───────────────────────┴──────────┴────────────┴──────┘┌─id─┬─website──────────────┬─wechat─┬─FlightDate─┬─Year─┐│ 3 │ http://www.xxxxx.cn/ │ xxxxx │ 2020-11-28 │ 2020 │└────┴──────────────────────┴────────┴────────────┴──────┘3 rows in set. Elapsed: 0.037 sec. node01 :) select * from cluster3s1r_all; # node03节点被杀掉时SELECT *FROM cluster3s1r_all┌─id─┬─website─────────────────┬─wechat─────┬─FlightDate─┬─Year─┐│ 2 │ http://www.merryyou.cn/ │ javaganhuo │ 2020-11-28 │ 2020 │└────┴─────────────────────────┴────────────┴────────────┴──────┘↘ Progress: 1.00 rows, 59.00 B (8.87 rows/s., 523.62 B/s.) 0%Received exception from server (version 20.8.3):Code: 279. DB::Exception: Received from localhost:9000. DB::Exception: All connection tries failed. Log: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 20.8.3.18)Code: 210, e.displayText() = DB::NetException: Connection refused (node03:9000) (version 20.8.3.18)Code: 210, e.displayText() = DB::NetException: Connection refused (node03:9000) (version 20.8.3.18): While executing Remote. 1 rows in set. Elapsed: 0.114 sec. 只返回了node01节点上的数据,node03节点上的两条数据失落。 ...

November 30, 2020 · 11 min · jiezi