专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

迁移工具Air2phin宣布开源,2步迁移Airflow至D

  近日,调度系统迁移工具Air2phin宣布开源。借助Air2phin,用户可2步将调度系统从Airflow迁移至ApacheDolphinScheduler,为有调度系统迁移需要的用户带来极大便利。
  Air2phin是什么?
  Air2phin是一个最近宣布开源的调度系统迁移工具,旨在将ApacheAirflowDAGs文件转换成ApacheDolphinSchedulerPythonSDK定义文件,从而实现用户将调度系统(Workfloworchestration)从Airflow迁移到DolphinScheduler的目的。它是一个基于多规则的AST转换器,使用LibCST来解析和转换Airflow的DAG代码,其全部规则使用Yaml文件定义,并提供了一定的自定义规则扩展能力。
  近期,Air2phin已经发布了0。0。12版本,提供了丰富的功能,可以更好地帮助用户完成Airflow到ApacheDolphinScheduler的迁移。AST是AbstractSyntaxTree(抽象语法树)的缩写,它是一种以树状结构表示代码语法结构的数据结构。在编译器中,AST是由词法分析器和语法分析器生成的。词法分析器将源代码转换成标记流(tokenstream),语法分析器将标记流转换成抽象语法树。AST是一种树状结构,它由一系列节点组成,每个节点表示代码中的一个语法结构(如表达式、语句、函数、类等),节点之间的关系表示语法结构之间的嵌套关系。
  为什么开源Air2phin?
  可能有人会问,为什么我需要一个迁移工具?这是因为随着业务的发展,企业或组织原来使用的工作流编排系统已经无法满足当前的需求,需要将工作流编排系统迁移到新的平台或者更新到新的版本。经过调研,很多用户有了将调度系统从开源工作流编排系统Airflow迁移到ApacheDolphinScheduler上来的需求。
  在迁移过程中,由于数据处理任务可能涉及多个系统之间的依赖关系,迁移过程需要确保在不影响业务运行的前提下完成。此时,调度系统迁移工具就可以发挥重要作用,它能减少人工干预,尽量自动化地完成两个调度系统间的迁移工作,并且能兼容多个系统间的多个版本,几乎可以做到用户无干预完成迁移。
  为此,白鲸开源专门研发了开源迁移工具Air2phin,可以让用户2步将调度系统从Airflow迁移至ApacheDolphinScheduler,为用户带来极大的便利。
  为了让大家更好地理解Air2phin的重要性,我们先从调度系统的相关背景知识开始,了解将调度系统从Airflow迁移至ApacheDolphinScheduler的好处。
  为什么要从Airflow迁移至DolphinScheduler?
  什么是工作流编排系统?
  工作流编排系统,是以尊重编排规则和业务逻辑的方式管理数据流。工作流编排工具让用户可以将多个有关联的任务转换为可以安排、运行和观测的工作流,帮助企业更好地管理和控制业务流程,从而提高业务效率。工作流编排是数据处理流程中不可或缺的组件之一,负责根据预先定义的规则和逻辑执行数据处理任务,确保数据处理流程按照预期顺利执行,常见工作流编排系统包括ApacheDolphinScheduler、ApacheAirflow、ApacheOozie,Azkaban等。
  Airflow是什么?
  其中,ApacheAirflow是一个开源的工作流编排系统,它可以帮助用户创建、调度和监控复杂的工作流程。Airflow最初由Airbnb开发,并于2016年开源,现在由Apache软件基金会维护。Airflow使用Python语言编写,具有高度的可扩展性和灵活性,支持多种任务类型,如计算、数据处理、通知、交互等。Airflow的工作流程是通过编写Python脚本来定义的,可以使用Airflow提供的操作符和钩子,以及自定义操作符和钩子来扩展其功能。但其有着不可忽视的缺陷,比如需要需要深度二次开发,脱离社区版本,升级成本高;Python技术栈维护迭代成本高;schedulerloop扫描Dagfolder延迟降低性能的问题;以及在生产环境中使用稳定性差等。
  在新数据时代业务需求下诞生的ApacheDolphinScheduler是一个开源的分布式工作流调度系统,弥补了以往调度系统的弱势,旨在为企业用户提供一种可靠、高效、易于使用的工作流调度平台,支持多种任务类型,如计算、数据处理、ETL等。与Airflow相比,DolphinScheduler采用了分布式架构,提供了多种任务类型,用户可以定义任务之间的依赖关系,设置任务的优先级和调度策略等,其使用可视化的界面来创建和管理工作流程的特性更是与Airflow形成鲜明对比,变得更加易于操作,对非编程人员来说更加友好。经过调研对比,对于很多用户来说,将调度系统迁移至ApacheDolphinScheduler是一个降本增效的更优选择。
  Air2phin如何安装和使用
  Air2phin是一个python的包,可以通过Python的包安装工具pip完成安装,详见air2phingettingstart。spanclasscodesnippetouterpythonmpipspanclasscodesnippetkeywordinstallspanspanclasscodesnippetcommentupgradeair2phinspanspan
  一个简单的例子
  我们通过一个简单的例子,来说明如何使用Air2phin的。我们截取了airflowtutorial。py中的部分代码作为Air2phin转化的例子,来说明Air2phin如何逐步完成转化成dolphinschedulerpythonsdk。
  图1:airflowtutorial。py中的部分代码图2:Air2phin如何逐步完成转化成dolphinschedulerpythonsdk
  假设将airflowtutorial。py部分内容保存至文件tutorialpart。py,想要将其转化成dolphinschedulerpythonsdk定义,只需要一行命令就能完成。结果如图2所示,因为命令增加了inplace参数,所以Air2phin会直接将原文件覆盖,如果不需要覆盖原问题,可以不使用inplace参数,Air2phin会新增一个tutorialpartair2phin。py文件来保存转化后的内容。spanclasscodesnippetouterspanclasscodesnippetselectortagair2phinspanspanclasscodesnippetselectortagmigratespanspanclasscodesnippetselectortaginplacespanspanclasscodesnippetselectortagtutorialpartspanspanclasscodesnippetselectorclass。pyspanspan通过观察,我们发现这次转化分别触发了多条转化规则,包括将airflow。DAG转换成
  pydolphinscheduler。core。processdefinition。ProcessDefinition,这个规则在第三行(import语句)以及第六行DAGcontext
  将airflow。operators。bash。BashOperator转换成
  pydolphinscheduler。tasks。shell。Shell,这个规则在任务t1,t2中都被使用
  除了对应的类转化之外,我们需要将类的属性进行转化,如将
  airflow。DAG。scheduleinterval转换成了ProcessDefinition。schedule,同时修改了部分值的内容,如将timedelta(days1)转成000?
  最后,我们只需要安装pydolphinscheduler,并且将转化后的文件通过python运行,就能完成工作流的迁移了,详见pydolphinscheduler使用(https:dolphinscheduler。apache。orgpythonmainstart。htmlinstallingpydolphinscheduler)。spanclasscodesnippetouterspanclasscodesnippetcomment安装apachedolphinschedulerspanspanspanclasscodesnippetouterspanclasscodesnippetattrpythonspanspanclasscodesnippetstringmpipinstallapachedolphinschedulerspanspanspanclasscodesnippetouterspanclasscodesnippetcomment将工作流提交到dolphinschedulerspanspanspanclasscodesnippetouterspanclasscodesnippetattrpythonspanspanclasscodesnippetstringtutorialpart。pyspanspan在运行pythontutorialpart。py时,需要保证dolphinschedulerAPI和pythongateway服务已经启动,并且开放了对应的端口,详见启动pythongatewayservice。至此,我们通过一个简单的例子,说明了Air2phin是如何完成迁移的。
  工作原理
  Airflow和dolphinschedulerpythonsdk如何工作?在了解Air2phin如果工作之前,先了解Airflow和dolphinschedulerpythonsdk如何工作是非常重要的前置条件,帮助我们更好地了解Air2phin的迁移步骤,当遇到问题的时候也能更加从容地应对。Airflow如何工作:Airflow工作流相关的信息都保存在DAG文件中,之后将DAG文件放置到Airflow的指定目录,Airflow的Scheduler会间隔一定时间去扫描和解析Airflow的DAG文件,所以DAG文件是被动被扫描和更新的。
  dolphinschedulerpythonsdk:同Airflow类似,将全部工作流相关的信息都通过Python文件定义,但是dolphinschedulerpythonsdk是通过人为主动触发的方式,将工作流信息提交,运行命令python工作流文件名即可完成主动任务提交。
  Air2phin工作流程
  了解完两者是如何使用,如何提交发现工作流的,将更加利于我们对Air2phin的工作原理的理解。因为Airflow的DAG文件以及DolphinScheduler的Pythonsdk定义文件都是Python编写的,所以Air2phin的大部分代码都是处理两者间的差异,最后将Airflow的代码转化成dolphinschedulerpythonsdk和定义。Air2phin使用了LibCST(https:libcst。readthedocs。ioenlatest)来实现airflowpythonDAG代码的抽象语法树解析,然后通过LibCST的Transformer(https:libcst。readthedocs。ioenlatesttutorial。htmlBuildVisitororTransformer)结合转化规则最后转化成dolphinschedulerpythonsdk的定义。Air2phin整体工作流程如下:从标准输入或者文件中获取原本的AirflowDAG内容
  从Yaml文件加载所有转换规则
  将AirflowDAG内容通过LibCST解析成CST树
  通过LibCSTTransformer转换dolphinschedulerpythonsdk定义内容
  Air2phin最佳实践
  迁移整个文件夹而不是单个文件
  当用户想要迁移Airflow到DolphinScheduler的时候,都是想要整体做迁移而不是单个文件迁移的,Air2phin提供整体文件夹迁移的能力,只需要将路径从文件路径改成文件夹即可。spanclasscodesnippetouter迁移整个spanclasscodesnippetregexpairflowspandags文件夹spanspanclasscodesnippetouterair2phinmigrateinplacespanclasscodesnippetregexpairflowspandagsspan增加自定义的规则
  部分使用Airflow的用户自定义Hook或者Operator,用户自定义的Operator无法通过Air2phin内置的转化规则完成转化,需要用户增加自定义的规则,并告诉Air2phin规则的位置。例如我们有一个叫MyCustomOperator的算子是继承PostgresOperator的大部分功能,只是命名不一样,其定义如下:spanclasscodesnippetouterspanclasscodesnippetattrfromairflow。providers。postgres。operators。postgresimportPostgresOperatorspanspanspanclasscodesnippetouterspanclasscodesnippetattrclassspanspanclasscodesnippetstringMyCustomOperator(PostgresOperator):spanspanspanclasscodesnippetouterspanclasscodesnippetattrdefspanspanclasscodesnippetstringinit(spanspanspanclasscodesnippetouterspanclasscodesnippetattrself,spanspanspanclasscodesnippetouterspanclasscodesnippetattr,spanspanspanclasscodesnippetouterspanclasscodesnippetattrsqlspan:spanclasscodesnippetstringstrIterable〔str〕,spanspanspanclasscodesnippetouterspanclasscodesnippetattrmycustomconnidspan:spanclasscodesnippetstringstrpostgresdefault,spanspanspanclasscodesnippetouterspanclasscodesnippetattrautocommitspan:spanclasscodesnippetstringboolFalse,spanspanspanclasscodesnippetouterspanclasscodesnippetattrparametersspan:spanclasscodesnippetstringIterableMappingNoneNone,spanspanspanclasscodesnippetouterspanclasscodesnippetattrdatabasespan:spanclasscodesnippetstringstrNoneNone,spanspanspanclasscodesnippetouterspanclasscodesnippetattrruntimeparametersspan:spanclasscodesnippetstringMappingNoneNone,spanspanspanclasscodesnippetouterspanclasscodesnippetattrkwargs,spanspanspanclasscodesnippetouterspanclasscodesnippetmeta)spanspanclasscodesnippetstringNone:spanspanspanclasscodesnippetouterspanclasscodesnippetattrsuper()。init(spanspanspanclasscodesnippetouterspanclasscodesnippetattrsqlspanspanclasscodesnippetstringsql,spanspanspanclasscodesnippetouterspanclasscodesnippetattrpostgresconnidspanspanclasscodesnippetstringmycustomconnid,spanspanspanclasscodesnippetouterspanclasscodesnippetattrautocommitspanspanclasscodesnippetstringautocommit,spanspanspanclasscodesnippetouterspanclasscodesnippetattrparametersspanspanclasscodesnippetstringparameters,spanspanspanclasscodesnippetouterspanclasscodesnippetattrdatabasespanspanclasscodesnippetstringdatabase,spanspanspanclasscodesnippetouterspanclasscodesnippetattrruntimeparametersspanspanclasscodesnippetstringruntimeparameters,spanspanspanclasscodesnippetouterspanclasscodesnippetattrkwargs,spanspanspanclasscodesnippetouterspanclasscodesnippetattr)spanspan
  它在Airflow的多个DAG中被使用,使用的方式如下:spanclasscodesnippetouterspanclasscodesnippetattrfromcustom。mycustomoperatorimportMyCustomOperatorspanspanspanclasscodesnippetouterspanclasscodesnippetattrwithspanspanclasscodesnippetstringDAG(spanspanspanclasscodesnippetouterspanclasscodesnippetattrdagidspanspanclasscodesnippetstringmycustomdag,spanspanspanclasscodesnippetouterspanclasscodesnippetattrdefaultargsspanspanclasscodesnippetstringdefaultargs,spanspanspanclasscodesnippetouterspanclasscodesnippetattrscheduleintervalspanspanclasscodesnippetstringonce,spanspanspanclasscodesnippetouterspanclasscodesnippetattrstartdatespanspanclasscodesnippetstringdaysago(2),spanspanspanclasscodesnippetouterspanclasscodesnippetattrtagsspanspanclasscodesnippetstring〔example〕,spanspanspanclasscodesnippetouterspanclasscodesnippetmeta)spanspanclasscodesnippetstringasdag:spanspanspanclasscodesnippetouterspanclasscodesnippetattrt1spanspanclasscodesnippetstringMyCustomOperator(spanspanspanclasscodesnippetouterspanclasscodesnippetattrtaskidspanspanclasscodesnippetstringmycustomtask,spanspanspanclasscodesnippetouterspanclasscodesnippetattrsqlspanspanclasscodesnippetstringselectfromtable,spanspanspanclasscodesnippetouterspanclasscodesnippetattrmycustomconnidspanspanclasscodesnippetstringmycustomconnid,spanspanspanclasscodesnippetouterspanclasscodesnippetattr)spanspan
  现在需要对这个Operator进行转化,我们可以自定义一个转化规则,并将其命名为MyCustomOperator。yaml,内容如下,最主要的内容是migration。module和migration。parameter的定义,其确定了转化规则:spanclasscodesnippetouterspanclasscodesnippetattrnamespan:spanclasscodesnippetstringMyCustomOperatorspanspanspanclasscodesnippetouterspanclasscodesnippetattrdescriptionspan:spanclasscodesnippetstringTheconfigurationformigratingairflowcustomoperatorMyCustomOperatortoDolphinSchedulerSQLtask。spanspanspanclasscodesnippetouterspanclasscodesnippetattrmigrationspan:spanclasscodesnippetstringspanspanspanclasscodesnippetouterspanclasscodesnippetattrmodulespan:spanclasscodesnippetstringspanspanspanclasscodesnippetouterspanclasscodesnippetmetaspanspanclasscodesnippetstringaction:replacespanspanspanclasscodesnippetouterspanclasscodesnippetattrsrcspan:spanclasscodesnippetstringcustom。mycustomoperator。MyCustomOperatorspanspanspanclasscodesnippetouterspanclasscodesnippetattrdestspan:spanclasscodesnippetstringpydolphinscheduler。tasks。sql。Sqlspanspanspanclasscodesnippetouterspanclasscodesnippetattrparameterspan:spanclasscodesnippetstringspanspanspanclasscodesnippetouterspanclasscodesnippetmetaspanspanclasscodesnippetstringaction:replacespanspanspanclasscodesnippetouterspanclasscodesnippetattrsrcspan:spanclasscodesnippetstringtaskidspanspanspanclasscodesnippetouterspanclasscodesnippetattrdestspan:spanclasscodesnippetstringnamespanspanspanclasscodesnippetouterspanclasscodesnippetmetaspanspanclasscodesnippetstringaction:replacespanspanspanclasscodesnippetouterspanclasscodesnippetattrsrcspan:spanclasscodesnippetstringmycustomconnidspanspanspanclasscodesnippetouterspanclasscodesnippetattrdestspan:spanclasscodesnippetstringdatasourcenamespanspan
  再使用customrules参数指定转化自定义参数,就能应用自定义规则的转化:spanclasscodesnippetouterspanclasscodesnippetcomment指定自定义规则路径为pathtoMyCustomOperator。yamlspanspanspanclasscodesnippetouterspanclasscodesnippetattributeair2phinspanmigrateinplacecustomrulespathtoMyCustomOperator。yamlairflowdagsspan
  让Air2phin运行地更快
  Air2phin默认是一个进程运行DAG文件的转化的,当你有许多DAG文件时,Air2phin转化非常耗时,我们提供了一个启动多进程运行Air2phin转化的参数multiprocess,可以将其指定为用户机器的CPU数量来缩短转化时间:spanclasscodesnippetouterspanclasscodesnippetcomment指定air2phin启动12个进程同时进行转化spanspanspanclasscodesnippetouterspanclasscodesnippetattributeair2phinspanmigrateinplacecustomrulespathtoMyCustomOperator。yamlmultiprocessspanclasscodesnippetnumber12spanairflowdagsspan
  存在的问题
  目前,作为一个转化工具,Air2phin的使用方式已经算比较完善了,能够满足用户迁移调度系统的基本需求,但还有一些地方有待完善。内置规则还不够多转化规则还不够多,目前只有五个,分别是:airflow。DAGairflow。operators。bash。BashOperatorairflow。operators。dummyoperator。DummyOperatorairflow。operators。pythonoperator。PythonOperatorairflow。operators。sparksqloperator。SparkSqlOperator
  如果有更多的规则,Air2phin将成为一个更加好用的转化工具,这里欢迎各位随时提交转化规则的PR(https:github。comWhaleOpsair2phinpulls)。部分Airflow的用法不能被迁移过来部分概念仅仅在Airflow中有,在DolphinScheduler中还没有,如任务的成功、失败、重试、触发callback,任务的owner,variable,工作流并发数,tag等,这部分AirflowDAG可以被迁移,但兼容的属性将会丢失,无法迁移到DolphinScheduler。
  Air2phin常见问题解答
  Q:为什么选择解析AirflowDAG文件而不是数据库?A:因为AirflowDAG文件中才有完成的工作流信息,Airflow的数据库中只有工作流基本信息,没有任务定义的信息,也没有任务的关系,我们选择通过解析Airflow的DAG文件而不是数据库来完成转化。Q:为什么要通过dolphinschedulerpythonsdk做中转不自己提交到DolphinScheduler?A:因为AirflowDAG就是Python定义的,在AirflowDAG中有很多Python的特性,我们不想将这部分特性转化成结构化的数据(转化可能存在信息丢失),恰好DolphinScheduler已经有了Python的sdk,所以直接通过LibCST转化是成本更加低的做法。Q:为什么使用LibCST而不是python内置的AST?A:因为LibCST更加符合我们,Python内置的AST库解析成AST的时候会丢失掉comment的信息,但是我们呢希望保留着部分信息。且LibCST提供更加多visitor保证我们更加方便的实现替换。参考链接:air2phin(https:github。comWhaleOpsair2phin)腾讯回应进军类ChatGPT;Meta新语言模型能运行在单张显卡上;OpenAI创始人提出新摩尔定律极客头条ChatGPT带火的提示工程师岗,不用写代码,也能获得年薪数百万?
  ChatGPT正在取代员工,最新ChatGPT调查报告发布!

西媒阿尔维斯在监狱踢了一场球赛引官员囚犯共同观看直播吧1月29日讯阿尔维斯因涉嫌性侵已经入狱一周多的时间。西班牙媒体先锋报今日再次发文披露阿尔维斯在监狱内的一些情况。据先锋报报道,阿尔维斯目前的狱友中有一位他的老相识,此人名叫库半年之约,冲刺吧大运!新春伊始,距离第31届世界大学生夏季运动会7月28日举行还有半年时间。就在1月20日,成都大运会代表团团长春季会议邀请函已经发出,3月底,来自五大洲的代表团团长或其代表,将从全球会苹果手机那些隐藏功能!我发现一个很有意思的事情,有的人花一两万买一个苹果手机,用了两三年可能就只用了苹果手机的百分之1的功能。今天咱们就来聊一聊苹果手机的隐藏功能,我敢说有些苹果店的店员都不一定知道!1国产手机比苹果卖的还贵,断崖式降价也没人买,无奈接受现实点击关注,每天精彩不断!导读国产手机比苹果卖的还贵,断崖式降价也没人买,无奈接受现实!众所周知,苹果手机是业内公认的最好的手机之一,也是目前卖的比较贵的手机,一直以来,在国内手机市苹果ARVR头显没法取代iPhone!果粉之家,专业苹果手机技术研究十年!您身边的苹果专家彭博社记者马克古尔曼最新称,尽管苹果在增强现实(AR)和虚拟现实(VR)的能力有朝一日会创造出iPhone的替代产品,但是这第一苹果流媒体iTunes将被拆分,Windows用户该怎么办?快看!在众多的音乐软件中,AppleMusic可以说是众多人中的心头好。但是,在Windows上面,如果你也想听苹果音乐的话。那么,iTunes可以说是苹果各种流媒体服务用户的唯一选择!胎儿偏小发育不良,吃得多不一定管用有的准妈妈做完B超,发现胎儿偏小。明明自己体重一个劲儿在长,怎么宝宝还偏小了呢?为了让胎宝宝长起来,准妈妈们抛弃了对自己身材的执着,一心进补,希望靠多吃点能让胎宝宝长大。其实,引起丸美聚焦重组胶原蛋白研发,引领国内抗衰新浪潮数据显示,全球抗衰老市场规模已从2015年的1395亿美元增长至2021年的2160亿美元,未来,预计全球抗衰老市场规模将持续保持较高增速,发展潜力巨大,成为了美妆护肤行业争相竞逐万国怎么选?这三大热门,闭眼买,不出错腕表之家腕表说万国在国内有三大热门,分别是飞行员计时葡萄牙计时柏涛菲诺计时。这3只万国计时表,自打2000年之后,名表在国内开始流行,就进入到玩家中广泛流通,就是万国在国内接受度最钻石面膜备受争议涉嫌虚假宣传,以招会员为主的四级制度是否靠谱随着爱美人士的增多,一些普通的化妆品已经无法满足消费者变美的需求,医美成为了大部分人的选择。根据国际权威机构数据显示,2015年我国的医疗美容市场规模为638亿元,2019年该规模湖南湘江新区三大主题活动六条旅游路线邀您玩转新春不出长沙,这些地方照样玩转新春湖南湘江新区推出三大主题活动六条旅游路线1月28日至2月5日,贝拉小镇非遗传承展带你重拾传统年味。通讯员供图不到一周就过年了,这个新春你有什么安排呢?
微信8。0。34内测版上线,新增这些变化,附内测资格申请入口微信最新8。0。34安卓内测版已经悄悄上线,距离上个安卓内测版本发布的时间整整一个月。本次微信8。0。34内测版的安装包大小为248。9MB,与上一个版本相比略有下降,但是变化不大闻声而动,多维沉浸,歌尔举行第二届(声学触觉)新技术分享会3月17日,歌尔第二届新技术分享会在深圳举行。会上,歌尔推出了新一代扬声器和多维沉浸触觉解决方案。声学领域,歌尔发布了兼顾音质和私密性的DPS(DiPoleSpeakerforAd青海拉开春季义务植树序幕互联网全民义务植树成新方式图为青海省化隆县开展义务植树。李玉峰供图中新网西宁3月17日电(张添福李玉峰)3月中旬开始,地处中国西北部的青海省,多地将先后拉开春季义务植树序幕。青海省林草部门此前发布消息,今年尝湖鲜拍美景,湘阴发布三条春季精品旅游线路!相约左公故里,遇见美好湘阴。3月18日,春风十里桃醉湘阴2023湘江新区花乡生活节之湘阴桃李芬芳踏春季在湘阴东塘镇赛美桃园拉开帷幕,桃李芬芳踏春游湖鲜美食品鉴游园群众摄影打卡非遗展最美百佳优秀!日照市公共文化空间又获大奖3月16日,由文化和旅游部公共服务司指导,上海市文化和旅游局上海市浦东新区人民政府主办的2022年长三角及全国部分省市最美公共文化空间大赛颁奖典礼在上海浦东举行。日照市城市书房樱花藏红花开!太原植物园新宠儿来了近日,太原植物园里的藏红花陆续开放,为植物园的春日增添了一抹绚丽的色彩,吸引众多市民前去拍照打卡。藏红花又名番红花西红花,鸢尾科植物番红花属,多年生球茎草本植物,适于生长在冬季最低削平33座大山,投资一千亿,延安在山顶建了一座新城延安是我国的革命圣地,共和国的摇篮,在中国近代革命进程占有重要的历史地位。这里孕育了伟大的延安精神,延安精神是中国共产党的传家宝,是中华民族宝贵的精神财富延安也是我国知名度最高的红江西萍乡厚田村神奇的丹霞地貌景观苍天酬土厚盛世画尧田初访萍乡市湘东区东桥镇厚田村(作者群子)桃红柳绿,丽日风清。正是户外探春好时节。近日,三五诗朋文友就着和煦的阳光,前往东桥镇厚田踏春而行。厚田村位于东桥镇西南角再谈职业道德关于对旅行社导游的看法云衡微语领了导游证,意味着在旅游这个行业就有资格组团解说,可以在这个领域拿到铁饭碗。但导游与游客必须按契约处理双方遇到的困难矛盾,不能有一方擅自意愿,特别是导游从业人员,更要严格纪粤媒韦世豪等是免费为广州队踢球俱乐部感谢球员未在社媒讨薪直播吧3月19日讯据南方日报报道,当前广州队的困难依然难以得到解决,俱乐部高层理解一些球员不愿在欠薪问题上和解的做法,而且对于球员从未公开讨薪的做法也表达了感谢。俱乐部有困难,且一西藏旅游包列活动十三周年!2023林芝桃花专列广州启程今天上午9点,百余位游客在广州火车站集结,准备乘车前往西藏在桃花期赴一场林芝之约。包括他们在内,今天共有超300名游客通过多种方式启程前往西藏游玩,意味第十三周年西藏旅游包列活动的
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网