纠纷奇闻社交美文家庭
投稿投诉
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

万字长文详解Flink作业提交流程(二)

3月19日 飞虹塔投稿
  2。1。3虚拟Transformation的转换
  虚拟的Transformation生成的时候不会转换为SteramNode,而是添加为虚拟节点。
  privatevoidaddEdgeInternal(IntegerupStreamVertexID,IntegerdownStreamVertexID,inttypeNumber,StreamP?partitioner,ListStringoutputNames,OutputTagoutputTag,ShuffleModeshuffleMode){当上游是sideoutput时,递归调用,并传入sideoutput信息if(virtualSideOutputNodes。containsKey(upStreamVertexID)){intvirtualIdupStreamVertexID;upStreamVertexIDvirtualSideOutputNodes。get(virtualId)。f0;if(outputTagnull){outputTagvirtualSideOutputNodes。get(virtualId)。f1;}addEdgeInternal(upStreamVertexID,downStreamVertexID,typeNumber,partitioner,null,outputTag,shuffleMode);}当上游是select时,递归调用,并传入select信息elseif(virtualSelectNodes。containsKey(upStreamVertexID)){intvirtualIdupStreamVertexID;upStreamVertexIDvirtualSelectNodes。get(virtualId)。f0;if(outputNames。isEmpty()){selectionsthathappendownstreamoverrideearlierselectionsoutputNamesvirtualSelectNodes。get(virtualId)。f1;}addEdgeInternal(upStreamVertexID,downStreamVertexID,typeNumber,partitioner,outputNames,outputTag,shuffleMode);}当上游是Partition时,递归调用,并传入Partition信息elseif(virtualPartitionNodes。containsKey(upStreamVertexID)){intvirtualIdupStreamVertexID;upStreamVertexIDvirtualPartitionNodes。get(virtualId)。f0;if(partitionernull){partitionervirtualPartitionNodes。get(virtualId)。f1;}shuffleModevirtualPartitionNodes。get(virtualId)。f2;addEdgeInternal(upStreamVertexID,downStreamVertexID,typeNumber,partitioner,outputNames,outputTag,shuffleMode);}不是以上逻辑转换的情况,真正构建StreamEdgeelse{StreamNodeupstreamNodegetStreamNode(upStreamVertexID);StreamNodedownstreamNodegetStreamNode(downStreamVertexID);Ifnopartitionerwasspecifiedandtheparallelismofupstreamanddownstreamoperatormatchesuseforwardpartitioning,userebalanceotherwise。没有指定partitioner时,会为其选择forward或者rebalanceif(partitionernullupstreamNode。getParallelism()downstreamNode。getParallelism()){partitionernewForwardPartitionerObject();}elseif(partitionernull){partitionernewRebalancePartitionerObject();}if(partitionerinstanceofForwardPartitioner){if(upstreamNode。getParallelism()!downstreamNode。getParallelism()){thrownewUnsupportedOperationException(Forwardpartitioningdoesnotallowchangeofparallelism。Upstreamoperation:upstreamNodeparallelism:upstreamNode。getParallelism(),downstreamoperation:downstreamNodeparallelism:downstreamNode。getParallelism()Youmustuseanotherpartitioningstrategy,suchasbroadcast,rebalance,shuffleorglobal。);}}if(shuffleModenull){shuffleModeShuffleMode。UNDEFINED;}创建StreamEdge,并将该SteramEdge添加到上游的输出,下游的输入。StreamEdgeedgenewStreamEdge(upstreamNode,downstreamNode,typeNumber,outputNames,partitioner,outputTag,shuffleMode);getStreamNode(edge。getSourceId())。addOutEdge(edge);getStreamNode(edge。getTargetId())。addInEdge(edge);}}2。2作业图
  JobGraph可以由流计算的StreamGraph和批处理的OptimizedPlan转换而来。流计算中,在StreamGraph的基础上进行了一些优化,如果通过OperatorChain机制将算子合并起来,在执行时,调度在同一个Task线程上,避免数据的跨线程、跨网段的传递。
  2。2。1JobGraph核心对象JobVertex
  经过算子融合优化后符合条件的多个SteramNode可能会融合在一起生成一个JobVertex,即一个JobVertex包含一个或多个算子,JobVertex的输入是JobEdge,输出是IntermediateDataSet。JobEdge
  JobEdge是JobGraph中连接IntermediateDataSet和JobVertex的边,表示JobGraph中的一个数据流转通道,其上游数据源是IntermediateDataSet,下游消费者是JobVertex。数据通过JobEdge由IntermediateDataSet传递给JobVertex。IntermediateDataSet
  中间数据集IntermediateDataSet是一种逻辑结构,用来表示JobVertex的输出,即该JobVertex中包含的算子会产生的数据集。不同的执行模式下,其对应的结果分区类型不同,决定了在执行时刻数据交换的模式。
  IntermediateDataSet的个数与该JobVertex对应的StreamNode的出边数量相同,可以是一个或者多个。2。2。2JobGraph生成过程
  StreamingJobGraphGenerator负责流计算JobGraph的生成,在转换前需要进行一系列的预处理。privateJobGraphcreateJobGraph(){preValidate();makesurethatallverticesstartimmediately设置调度模式jobGraph。setScheduleMode(streamGraph。getScheduleMode());Generatedeterministichashesforthenodesinordertoidentifythemacrosssubmissionifftheydidntchange。为每个节点生成确定的hashid作为唯一表示,在提交和执行过程中保持不变。MapInteger,byte〔〕hashesdefaultStreamGraphHasher。traverseStreamGraphAndGenerateHashes(streamGraph);Generatelegacyversionhashesforbackwardscompatibility为了向后保持兼容,为每个节点生成老版本的hashidListMapInteger,byte〔〕legacyHashesnewArrayList(legacyStreamGraphHashers。size());for(StreamGraphHasherhasher:legacyStreamGraphHashers){legacyHashes。add(hasher。traverseStreamGraphAndGenerateHashes(streamGraph));}MapInteger,ListTuple2byte〔〕,byte〔〕chainedOperatorHashesnewHashMap();真正对SteramGraph进行转换,生成JobGraph图setChaining(hashes,legacyHashes,chainedOperatorHashes);setPhysicalEdges();设置共享slotgroupsetSlotSharingAndCoLocation();setManagedMemoryFraction(Collections。unmodifiableMap(jobVertices),Collections。unmodifiableMap(vertexConfigs),Collections。unmodifiableMap(chainedConfigs),idstreamGraph。getStreamNode(id)。getMinResources(),idstreamGraph。getStreamNode(id)。getManagedMemoryWeight());配置checkpointconfigureCheckpointing();jobGraph。setSavepointRestoreSettings(streamGraph。getSavepointRestoreSettings());如果有之前的缓存文件的配置,则重新读入JobGraphGenerator。addUserArtifactEntries(streamGraph。getUserArtifacts(),jobGraph);settheExecutionConfiglastwhenithasbeenfinalizedtry{设置执行环境配置jobGraph。setExecutionConfig(streamGraph。getExecutionConfig());}catch(IOExceptione){thrownewIllegalConfigurationException(CouldnotserializetheExecutionConfig。Thisindicatesthatnonserializabletypes(likecustomserializers)wereregistered);}returnjobG}
  预处理完毕后,开始构建JobGraph中的点和边,从Source向下遍历StreamGraph,逐步创建JObGraph,在创建的过程中同事完成算子融合(OperatorChain)优化。
  执行具体的Chain和JobVertex生成、JobEdge的关联、IntermediateDataSet。从StreamGraph读取数据的StreamNode开始,递归遍历同时将StreamOperator连接在一起。
  整理构建的逻辑如下(看上图!!!):
  1)从Source开始,Source与下游的FlatMap不可连接,Source是起始节点,自己成为一个JobVertx。
  2)此时开始一个新的连接分析,FlatMap是起始节点,与下游的KeyedAgg也不可以连接,那么FlatMap自己成为一个JobVertex。
  3)此时开始一个新的连接分析。KeyedAgg是起始节点,并且与下游的Sink可以连接,那么递归地分析Sink节点,构造Sink与其下游是否可以连接,因为Slink没有下游,所以KeyedAgg和Sink节点连接在一起,共同构成了一个JobVertex。在这个JobVertex中,KeyedAgg是起始节点,index编号为0,sink节点index编号为1。
  构建JobVertex的时候需要将StreamNode中的重要配置信息复制到JobVertex中。构建好JobVertex之后,需要构建JobEdge将JobVertex连接起来。KeyedAgg和Sink之间构成了一个算子连接,连接内部的算子之间无序构成JobEdge进行连接。
  在构建JobEdge的时候,很重要的一点是确定上游JobVertex和下游JobVertex的数据交换方式。此时根据ShuffleMode来确定ResultPartition类型,用FlinkPartition来确定JobVertex的连接方式。
  Shuffle确定了ResultPartition,那么就可以确定上游JobVertex输出的IntermediateDataSet的类型了,也就知道JobEdge的输入IntermediateDataSet。
  ForwardPartitioner和RescalePartitioner两种类型的Partitioner转换为DistributionPattern。POINTWISE的分发模式。其他类型的Partitioner统一转换为DistributionPattern。ALLTOALL模式。
  JobGraph的构建和OperatorChain优化:privateListStreamEdgecreateChain(IntegerstartNodeId,IntegercurrentNodeId,MapInteger,byte〔〕hashes,ListMapInteger,byte〔〕legacyHashes,intchainIndex,MapInteger,ListTuple2byte〔〕,byte〔〕chainedOperatorHashes){if(!builtVertices。contains(startNodeId)){ListStreamEdgetransitiveOutEdgesnewArrayListStreamEdge();ListStreamEdgechainableOutputsnewArrayListStreamEdge();ListStreamEdgenonChainableOutputsnewArrayListStreamEdge();StreamNodecurrentNodestreamGraph。getStreamNode(currentNodeId);获取当前节点的出边,判断是否符合OperatorChain的条件分为两类:chainableoutputs,nonchainableoutputsfor(StreamEdgeoutEdge:currentNode。getOutEdges()){if(isChainable(outEdge,streamGraph)){chainableOutputs。add(outEdge);}else{nonChainableOutputs。add(outEdge);}}对于chainable的边,递归调用createchain返回值添加到transitiveOutEdges中for(StreamEdgechainable:chainableOutputs){transitiveOutEdges。addAll(createChain(startNodeId,chainable。getTargetId(),hashes,legacyHashes,chainIndex1,chainedOperatorHashes));}对于无法chain在一起的边,边的下游节点作为Operatorchain的Head节点进行递归调用,返回值添加到transitiveOutEdges中for(StreamEdgenonChainable:nonChainableOutputs){transitiveOutEdges。add(nonChainable);createChain(nonChainable。getTargetId(),nonChainable。getTargetId(),hashes,legacyHashes,0,chainedOperatorHashes);}ListTuple2byte〔〕,byte〔〕operatorHasheschainedOperatorHashes。computeIfAbsent(startNodeId,knewArrayList());byte〔〕primaryHashByteshashes。get(currentNodeId);OperatorIDcurrentOperatorIdnewOperatorID(primaryHashBytes);for(MapInteger,byte〔〕legacyHash:legacyHashes){operatorHashes。add(newTuple2(primaryHashBytes,legacyHash。get(currentNodeId)));}chainedNames。put(currentNodeId,createChainedName(currentNodeId,chainableOutputs));chainedMinResources。put(currentNodeId,createChainedMinResources(currentNodeId,chainableOutputs));chainedPreferredResources。put(currentNodeId,createChainedPreferredResources(currentNodeId,chainableOutputs));if(currentNode。getInputFormat()!null){getOrCreateFormatContainer(startNodeId)。addInputFormat(currentOperatorId,currentNode。getInputFormat());}if(currentNode。getOutputFormat()!null){getOrCreateFormatContainer(startNodeId)。addOutputFormat(currentOperatorId,currentNode。getOutputFormat());}如果当前节点是起始节点,则直接创建JobVertex,否则返回一个空的StreamConfigStreamConfigconfigcurrentNodeId。equals(startNodeId)?createJobVertex(startNodeId,hashes,legacyHashes,chainedOperatorHashes):newStreamConfig(newConfiguration());将StreamNode中的配置信息序列化到Streamconfig中。setVertexConfig(currentNodeId,config,chainableOutputs,nonChainableOutputs);再次判断,如果是Chain的起始节点,执行connect()方法,创建JobEdge和IntermediateDataset否则将当前节点的StreamConfig添加到chainedConfig中。if(currentNodeId。equals(startNodeId)){config。setChainStart();config。setChainIndex(0);config。setOperatorName(streamGraph。getStreamNode(currentNodeId)。getOperatorName());for(StreamEdgeedge:transitiveOutEdges){connect(startNodeId,edge);}config。setOutEdgesInOrder(transitiveOutEdges);config。setTransitiveChainedTaskConfigs(chainedConfigs。get(startNodeId));}else{chainedConfigs。computeIfAbsent(startNodeId,knewHashMapInteger,StreamConfig());config。setChainIndex(chainIndex);StreamNodenodestreamGraph。getStreamNode(currentNodeId);config。setOperatorName(node。getOperatorName());chainedConfigs。get(startNodeId)。put(currentNodeId,config);}config。setOperatorID(currentOperatorId);if(chainableOutputs。isEmpty()){config。setChainEnd();}returntransitiveOutE}else{returnnewArrayList();}}2。2。3算子融合
  一个Operatorchain在同一个Task线程内执行。OperatorChain内的算子之间,在同一个线程内通过方法调用的方式传递数据,能减少线程之间的切换,减少消息的序列化反序列化,无序借助内存缓存区,也无须通过网络在算子间传递数据,可在减少延迟的同时提高整体吞吐量
  operatorchain的条件:
  1)下游节点的入度为1
  2)SteramEdge的下游节点对应的算子不为null
  3)StreamEdge的上游节点对应的算子不为null
  4)StreamEdge的上下游节点拥有相同的slotSharingGroup,默认都是default。
  5)下游算子的连接策略为ALWAYS。
  6)上游算子的连接策略为ALWAYS或者HEAD。
  7)StreamEdge的分区类型为ForwardPartitioner
  8)上下游节点的并行度一致
  9)当前StreamGraph允许chain2。3执行图
  2。3。1ExecutionGraph核心对象ExecutionJobVertex
  该对象和JobGraph中的JobVertex一一对应。该对象还包含了一组ExecutionVertex,数量与该JobVertex中所包含的SteramNode的并行度一致。
  ExecutionJobVertex用来将一个JobVertex封装成一ExecutionJobVertex,并以此创建ExecutionVertex、Execution、IntermediateResult和IntermediateResultPartition,用于丰富ExecutionGraph。
  在ExecutionJobVertex的构造函数中,首先是依据对应的JobVertex的并发度,生成对应个数的ExecutionVertex。其中,一个ExecutionVertex代表一个ExecutionJobVertex的并发子Task。然后是将原来JobVertex的中间结果IntermediateDataSet转化为ExecutionGrap中IntermediateResultExecutionVertex
  ExecutionJobVertex中会对作业进行并行化处理,构造可以并行执行的实例,每个并行执行的实例就是ExecutionVertex。
  构建ExecutionVertex的同时,也回构建ExecutionVertex的输出IntermediateResult。并且将ExecutionEdge输出为IntermediatePartition。
  ExecutionVertex的构造函数中,首先会创建IntermediatePartition,并通过IntermediateResult。setPartition()建立IntermediateResult和IntermediateResultPartition之间的关系,然后生成Execution,并配置资源相关。IntermediateResult
  IntermediateResult又叫做中间结果集,该对象是个逻辑概念,表示ExecutionJobVertex的输出,和JobGraph中的IntermediateDataSet一一对应,同样,一个ExecutionJobVertex可以有多个中间二级果,取决于当前JobVertex有几个出边。
  一个中间结果集包含多个中间结果分区IntermediateResultPartition,其个数等于该JobVertex的并发度。IntermediateResultPartitionIntermediateResultPartition又叫做中间结果分区,表示1个ExecutionVertex输出结果,与ExecutionEdge相关联。ExecutionEdge
  表示ExecutionVertex的输入,连接到上游产生的IntermediateResultPartition。一个Execution对应于唯一的一个IntermediateResultPartition和一个ExecutionVertex。一个ExecutionVertex可以有多个ExecutionEdge。Execution
  ExecutionVertex相当于每个Task的模板,在真正执行的时候,会将ExecutionVertex中的信息包装为一个Execution,执行一个ExecutionVertex的一次尝试。JobManager和TaskManager之间关于Task的部署和Task执行状态的更新都是通过ExecutionAttemptID来标识实例的。在故障或者数据需要重算的情况下,ExecutionVertex可能会有多个ExecutionAttemptID。一个Execution通过ExecutionAttemptID标识。2。3。2ExecutionGrap生成过程
  初始话作业调度器的时候,根据JobGraph生活ExecutionGraph。在SchedulerBase的构造方法中触发构建,最终调用SchedulerBasecreateExecutionGraph触发实际的构建动作,使用ExecutionGraphBuiler构建ExecutionGraph。
  核心代码attachJobGraph:
  构建ExecutionEdge的连接策略:点对点连接(DistributionPattern。POINTWISE)
  该策略用来连接当前ExecutionVertex与上游的IntermediataeResultParition。
  连接分三种情况
  1)一对一连接:并发的Task数量与分区数相等。
  2)多对一连接:下游的Task数量小于上游的分区数,此时分两种情况:
  a:下游Task可以分配同数量的结果分区IntermediataeResultParition。如上游有4个结果分区,下游有2个Task,那么每个Task会分配两个结果分区进行消费。
  b:每个Task消费的上游分区结果数据不均,如上游有3个结果分区,下游有两个Task,那么一个Task分配2个结果分区消费,另一个分配一个结果分区消费。
  3)一对多连接:下游的Task数量多余上游的分区数,此时两种情况:a:每个结果分区的下游消费Task数据量相同,如上游有两个结果分区,下游有4个Task,每个结果分区被两个Task消费。b:每个结果分区的下游消费Task数量不相同,如上游有两个结果分区,下游有3个Task,那么一个结果分区分配2个Task消费,另一个结果分区分配一个Task消费。全连接(DistributionPattern。ALLTOALL)
  该策略下游的ExecutionVertex与上游的所有IntermediataeResultParition建立连接,消费其生产的数据。一般全连接的情况意味着数据在Shuffle。
投诉 评论

大专生真的那么的不堪吗?听真话我是一名大专生,被人瞧不起的大专生,读着所有人不看好的职业学校,我也经历过早8晚8,体验过卑躬屈膝,可是那会的我仍旧不知所谓,觉得没有什么难的,每天浑浑噩噩,贪图享乐与舒适。就……世乒赛团体赛国乒双冠捧杯,仍需赛后总结和思考首先恭喜中国队,男团女团均不负众望,拿下了团体赛冠军,证明中国乒乓球整体实力依然在世界首位。作为五局的团体赛,队员们的比赛相互独立,分别是五场单打比赛,但又相互关联,大比分五局……世界杯反例来了,光靠防守不行,巴西英格兰才是夺冠大热门可惜了巴尔韦德的努力和天赋,乌拉圭和韩国告诉我们什么叫防守,却忘了进攻才能赢球!在世界上赛场上,光有防守不行,这可不是在NBA打球,这是男足世界杯,看看英格兰和巴西的进攻火力吧……中国高铁并非100国产,3关键技术被外企垄断,国产何时能突围到底是啥生意?没有竞争对手,全国独一份儿,客户覆盖14亿人口,国家政策还扶持,可多年经济下来呢,每年都要亏上百亿。它就是中国高铁。……近期有出行计划的姐妹,长途飞行需要带什么?这篇清单很实用!头条创作挑战赛每次,我出门儿前装行李,列清单一直都是重中之重的事儿,马虎不得,每次装一件儿,在纸上划掉一条的感觉,真的太好了。而且这样做,也能有效地避免忘东忘西。没错,我说的是……谷爱凌斯坦福开学,与宿友合照就被曝光,网友妥妥的俊男靓女即使是大感冒流行的时期,但是全世界各地的教育是不能因此而停滞的,所以不仅仅是国内大学生,还是国外大学生甚至留学生,他们都不得不返回校园继续开始新学期的学习。讲到今年冬奥会……被严重低估的4款冷门手机,性能不输苹果,都是低价高配说起性能最优秀的手机,我想应该会有不少人首先想到的是苹果吧,iPhone手机的性能确实是比一些安卓机要强不少,但是并不代表他就没有对手了,以下这4款国产手机,性能强大,价格适中……大满贯影后,坐拥珠宝无数,却坚持58年不婚,陈瑾到底追求什么她像一只猫,一只特立独行的猫,流连在暗夜,穿梭在深巷,纵身一道漂亮的弧线,消失在月色之中,神秘而优雅。陈瑾大抵如此,在这个复杂的世界里,她活成了自己的样子,如山涧的清风,……哈登单核克制热火无限换防!恩比德伤病,76人冲击客场10?本赛季东部赛区季后赛第二轮最受关注的系列赛莫过于76人队与热火队的对决,其外界关注的火热程度甚至要超过雄鹿与凯尔特人的系列赛,恩比德与哈登组成登帝组合可以说是饱受外界期待。……四部门遏制天价月饼,对超过500元盒装月饼重点监管让月饼回归王鹏作(新华社发)离中秋节还有不到3个月,不少月饼企业已开始启动推广订货。6月10日,国家发展改革委、工业和信息化部、商务部、市场监管总局联合对外发布《关于遏制天价月饼、……万字长文详解Flink作业提交流程(二)2。1。3虚拟Transformation的转换虚拟的Transformation生成的时候不会转换为SteramNode,而是添加为虚拟节点。privatevoi……中汽协2月汽车销量197。6万辆环比增长19。8【中汽协:2月汽车销量197。6万辆环比增长19。8】财联社3月10日电,中汽协数据显示,2月,汽车产销分别完成203。2万辆和197。6万辆,环比分别增长27。5和19。8,……
周线底部放出巨量的个股名单(2022。12。24)1博通股份总市值14。56亿股东总数9178市盈(动)55教育2莫高股份总市值21。48亿股东总数3。45万市盈(动)饮料制造3昂立教育总市值33。98亿股东总数2……来自哈勃望远镜的宇宙真实照片哈勃空间望远镜(英语:HubbleSpaceTelescope,HST),是以天文学家爱德温哈勃为名,在地球轨道的望远镜。哈勃望远镜接收地面控制中心(美国马里兰州的霍普金斯大学……25元门票奇幻海洋展?网友我还以为海鲜自助排队拿菜呢近日,宁夏银川市一游客吐槽,去参观海洋馆结果发现只有几个鱼缸,引发网络热议。当事人称,在微信朋友圈刷到某商场海洋馆开业,转发集赞可免费参观奇幻海洋展的链接,到现场却被告知小朋友……什么油最不健康呢?大豆油吗?医生这3种油,能少吃就少吃人的生活当中,也是离不开柴米油盐酱醋茶,这也是生活中的必需品,尤其是食用油,在平时炒菜的时候也是格外需要的。而现在生活中,市面上的食用油种类也是越来越多,比如像一些花生油……阳春三月多喝汤,润燥降火补营养,八道汤记得收藏,一家老小爱喝大家好这里是香姐说美食,每天分享好吃的家常菜。春季是阳气生发的季节,气温在不断地上升,我们经常会觉得口干舌燥,如果不及时补充水分,就很容易上火,人也变得比较急躁,对身体健康非常……PS5情报局新款PS5重量变轻了!索尼再收购要大搞手游新款PS5重量变轻了早些时候有日本零售商泄露了关于PS5新型号的消息。但据外媒报道,这些新型号的PS5已在澳大利亚发布,而且此版本的主机重量更轻。据悉,这款新型号比……外贸SOHO之初体验(下)公众号Molly的外贸SOHO笔记文Molly零基础阿里平台操作思路创业之前,我和大部分外贸业务员一样,对阿里深恶痛绝。一个好好的B2B平台,为了卖流量把各种……十多年的胃病,中医靠这个思路帮她调理,半年症状改善大夫,我四肢无力,觉得胸部空空的,胸闷胸痛不舒服,食欲还可以,但不敢多吃,一般吃45分饱,您帮我看看吧。患者一进来就跟我说了许多症状。这个患者是找我来看萎缩性胃炎的。我看……据TAAMedical统恩医学了解梅西C罗都采用干细胞治疗来在更快、更高、更强的体育精神下,许多运动员在不懈努力中获得了金牌,同时许多观众也注意到,他们的脚踝、手腕和膝盖都总是被绷带包裹着,这是因为运动员在比赛前进行的长期训练,高强度甚……朱婷重返赛场意甲助力球队3比0完胜对手北京时间11月3日凌晨,意大利佛罗伦萨。20222023意大利女排A1联赛(意甲)第4轮,斯坎迪奇在常规赛第4轮以3比0(2826,2523,2520)完胜卡萨尔马焦雷,来自中……锂电池涂覆材料勃姆石龙头,壹石通三大主营业务驱动公司增长(报告出品方分析师:山西证券叶中正)1。锂电池涂覆材料勃姆石龙头,三大主营业务驱动公司增长1。1无机材料平台型企业,管理层产业经验丰富公司致力于先进无机非金属复合材……19年,赵本山的徒弟小鹏飞,向王金龙前妻丫蛋求婚,丫蛋,我愿2019年,赵本山的徒弟小鹏飞租了3艘豪华游艇,向王金龙的前妻丫蛋求婚,丫蛋红着脸大喊:我愿意!这本来是一件喜事,但赵本山知道后,气得七窍生烟,说:结婚别叫我,太丢人了。……
友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形