00:00
接下来呢,我们看第一章啊,就是这个资源配置调优啊,那资源配置怎么调呢?首先在这啊。这是我们可以给定配置的地方,对吧,就是我们提交任务的时候可以指定两安的队列对吧?呃,Job manager内存大小,Task manager内存大小,以及一个task里边几个和。对吧,啊,有几个几个lo啊,几个lo好,那接下来呢,我们怎么去配置呢?一般我们按照一个CPU4个G的内存,这样就配置就不会有问题,生产环境当中,包括我们了解到拼多多,对吧,从拼多多那边拿到数据也是这样,他们就可以按照ECU。啊,按照ECU叫ECU啊。ECU的配置就是呃呃1:4。1:4啊,就是一个CPU呢,配置四个G的内存好,那么接下来我们要聊一聊在生角镜当中,我们到底应该配置几个slot对吧?一个slot让它有几个CPU,然后呢,我们内存到底应该怎么去配,对吧?这块是我们要知道的,那参数呢还是在这儿对吧?呃,首先照本面力量呢,无所谓,两到四个力足够了。
01:15
啊,足够了,你要是并行度特别多,那你可以给四个,你并行度在十个以内,对吧,嗯,十几个,20几个,那你可以给两个G啊,因为现job manager呢,它就是跟我们task manager去交互的,对吧,所以你并行度越多,那你要的task manager数量越多,那你对应的task manager数量越多,那我内存需要高一点,因为我要交互的。对象越多对吧,所以我资源高一点,这个呢很合理啊,两到四个力就够了,一般就是这样,你不用管这个照面点他们就很少,因为生长环境当中,我们不可能用什么呢,不可能用memory。Stay backon。对吧,不可能用内存级别的这个状态后端,因为那如果你用内存级别的状态后端,它对于这个状闷着内存要求会高,因为它是将这个状态会放到远程的啊,会放到job manager的什么内存里边,那一般都肯定生产,不可能用这个,所以呢,Job manager内存的我们不用多关心,更关心的呢,我们要关心task没内存。
02:15
啊,那一般来说呢,比如说我们的个数确定的对吧,就是你的变异度,假如说是十个。假如说呢,你是十个对吧?好呃,那接下来呢,我们要知道我们CPU的个数跟lo的个数占比,对吧,我们一般这个一个CPU一个塑料或者呢1:2,这个是最合适的,对吧?如果你公司集群资源不是那么高,那你就1:2,如果呢,你资源很足,那就1:1。啊,就是一个CPU。一个。啊,一个CPU一个slot,好,那接下来就这假如说我们就1:1对吧,假如说我们就1:1,那接下来这个东西怎么配呢?对吧,我一个task manager里面几个slot呢,好这就聊到了,咱们呢,肯定是用雅安模式对不对。
03:02
延安模式雅安里边有一个配置信息啊,叫container,有印象吗?就是有一个资源容器叫container啊,Container这个这个名词记得的扣一。Container。它是不是资虚拟的资源容器啊。记得吗?对吧,它是一个资源容器,好,那么接下来他就会跟雅安这个配置信息有关系了,在雅安这个配置信息里边啊,注意它会有关于这个container的一个配置。它会有个关于container什么呢,合数。合数,比如说我这边呢是二。比如说在雅安里边啊,我呢,Container这个核心数,我配的是二。啊,然后你告诉我,然后呢,我希望。核数跟CPU的数量是,就是CPU的数量跟我们的数量是1:1,假如说这个啊,然后呢,我的container容器啊,它的核心数是二,那你告诉我这我配几。
04:06
抓我佩奇。我应该配几?想一下把这几个参数串起来啊。这个地方我应该配多少。嗯,我应该配多少啊。啊,不要总说二,其他同学呢,没反应过来是吗?注意我当前这个容器container容器核心数是两个啊,CPU数量是两个对吧,我配的是两个核心数啊,两个cos对吧?然后呢,我希望CPU跟我们的lo的个数是1:1的关系,对吧?然后就是说那task manager这个lo个数配几啊标总数二。
05:01
其他同学呢?你觉得应该配多少?应该配多少?啊,那个班长说一。班长说,一。嗯,其他同学呢,说一说自己的理解,对吧,是一还是二还是更多对吧啊,345啊到底是多少,总不可能是一个负数或者是小数对吧啊。肯定是一个正整数对吧。到底1234哪个?就两个同学答,一个是标总说二,还有一个班长说一。其他同学呢?不知道,懵了,根本就不听不懂,你在说什么啊。陶总说,二。还有呢?到底是一还是二啊?现在有两个不同答案是吧,一个一,一个二啊。这个反应不过来是吗?转换不过来。
06:04
完了,回了。延安也白学了。这个都算不明白吗?这把条件都给你了,那肯定是两个呀,是不是对吧,那container看啊它的CPU2个。我呢?要希望1:1,希望1:1对吧,那未来一个container,一个container,启动一个tasker,是不是叫一个container,也就换句话说,我启动的一个task man里边就是两个CPU。对吧,好,那我一个task manager,两个CPU对吧,那接下来。我希望CPU的个数跟lo的个数是1:1,我有两个CPU,那一个碳索面量必然是两个lo呀。对吧,必然是两个的呀,这个很难吗?这个计算。啊。哦,不能理解了啊好,那接下来继续啊,我呢希望一个CPU配置四个G内存,那我们的task内存给多少。
07:01
给八个G是不是。没毛病吧,就给八个G,因为我一个CPU希望是四个G内存,那么你看啊,你刚才是两个CPU,那不就8G嘛,这个总明白吧,这个是8G没毛病是不是。OK吗?听懂。听懂对吧,好,但是这里面有一个特殊情况,一定要注意一下什么呢?比如说我一个container给的是四个和。我一个container给的是四个和,那么呢,我还是要1:1,那这配几?这是不是配四?没毛病吧,我还是希望是1:1,然后我contain容器啊,给的是四个CPU,这是不是四。这样是不是四?没毛病吧,好,那么按照一个CPU配置四个G内存,那这就配16是不是?这是不是配16?这是不是配16没毛病吧,啊,这配16是对的,但是呢,你会发现如果说有一个参数没改,你这个16配了也没用。
08:03
你配的也没用,你要知道在雅安里边,雅安里边还有一个参数。还有一个参数,就是限定每一个container最大的内存。你知道你猜一下多少。它有一个参数限定它最大的内存,它这个容器最大的内存,它有一个限制。对吧,它默认默认值,如果你没改啊,你注意它是八个G。啊,标总是知道的对吧?哎,没毛病啊,它默认是八个G,那你想啊,我一个容器最大的是八个G,你告诉我你task想要16个G可能吗?可不可能不可能对吧,所以你不光要配这个,你不光要配这个16G,你还得把这个要改了,对吧,这个最大值你得改的更高才行,你不能说最大值限定了八个G,然后呢,你说你要16个G,不好意思,这个不行。啊,这个是不行的。
09:01
OK吧,啊,这个是不行的,所以呢,你还要多关注一下雅安那边的配置,因为我们基于雅安来运行的OK吧,这是我们第一个关于它内存的一个配置,对吧?啊关于内存的配置好。好,那第二个是病度的设置,病度设置呢,其实相对说比较简单一些哈。那一般呢,我们要最优变异度计算,那就是压测呗,对吧,压测产生压测啊,算出来有多少个变异度啊,压的标准呢,就是不产生反压。对吧,就是不产生反压为标准。啊,就是你可以自己增大这个压缩的数据量,对吧,然后呢,以不产生反压为基准啊,那至于怎么不产生反压,反压怎么看这个问题对吧,我们呢,呃,在后面给大家去介绍。啊,这块呢,就会有反压,所以呢,这块以不不产生反压为标准,对吧,你呢可以1.2倍,两倍或者十倍去压测,对吧,你要公司发展的比较好,你就十倍发展的呢,嗯,一般那就两倍或者1.21.5倍都行,对吧?好,但是这是我们说的这个点啊,接下来呢,我们从s transform跟THINK3个阶段啊,Source端呢,由于我们最多的就是卡夫卡,没有什么其他的,对吧?生态环境当中也一样,你未来最多的数据源就是卡夫卡,那这个很简单,就等于什么。
10:19
分区数就好了,S阶段的变异度就等于卡夫卡的分区数,主题的分区数对吧?这个我们一直也是按照这个标准来的对吧?好,这是第一个就搞定了,这个没什么好说的,第二个关于transform,对吧?Transform如果是KBY前。如果是K前,那与跟S保持一致,也就跟上一个阶段保持一致就完了。保持一致就够了。OK吧,跟上一个阶段保持一致就结束了,不用管了啊好,那如果K后。呃,K败后这个东西呢,会进行一个杀否?对吧,K半啊,它是按照这个K,那有可能呢,我们的数据量就不均匀了,对吧?啊是上不均匀,那这个时候呢,重分区啊,你要考虑到数据倾斜啊等等这些问题,一般来说呢,如果你的并行度比较小哈,你的并行度比较小,那么你就无所谓。
11:16
就无所谓。对吧,假如你病都很小啊,就无所谓,对吧,如果你病都比较大呢,建议设置成二的整次幂。设置成二的整侧面会更均匀一点啊,为什么呢?这里边儿有一个点啊,是这样子的。大家都知道K。K,它是怎么来划分这个数据的?就是我这条数据进到哪一个分区对吧,进到哪一个边度,它是怎么划分的知道吗。它进到哪个分区,它是怎么划分的,大家知道吗?两次哈希啊,两次哈希啊,具体一点呢。
12:01
具体一点呢,啊摸摸哈希,具体一点呢,就是哪两次。对,我们的值。啊,分组分区对了,有个k group对吧,有个k group啊,其实呃,K group呢,就主要是这个参数啊。主要是这个参数。它呢,K最小值是128哦,它是怎么算的,是这样子的叫max。Max有一个128,然后呢,第二个值。第二个值是什么呢?第二个值啊,是你的并行度。你设置的变形度。乘以1.5倍,比你并行度1.5倍大的最小的。二指的幂。注意听啊,注意听。它第二个参数给的是多少呢?是你的并行度,你设置不会设置并度了,是你变度的1.5倍,比这个值大的最小的。
13:07
二的整次幂。听懂。啊啊,举个例子,比如说我是个十。我是十,就刚才我们所说的这个东西,算出来应该多少。算出来应该是多少,就是比它1.5倍大的最小的二的整的币,算出来是多少呀。就现在我B度写的是十。对十六十六啊,没毛病对吧,因为十的1.5倍,那15吧,比15大的一个最小的二的整次幂,那不就16吗。对吧,是它啊,主要这个地方有一个二的整次幂,所以呢,我们希望如果你冰度特别大的时候,并方特别高的时候,对吧,那建议设置成二的整次幂,那这样的话就会比较均匀。啊,就会很均匀对吧,因为我k group是一定是二的整次幂,对吧,我的k group一定是二次幂,如果说你的B度也是二的次幂,那么我们俩一定能整除。
14:01
对吧,我俩之间一定能整除,那整除的话,那是不是更均匀一点啊,对吧,所以它有这个点在里边啊,有这个参数在里边k group啊,比如说你现在呢,是十个密度,那十个密度呢,它k group呢,肯定是一百二八,也就是说最大的冰度肯定是128啊,128呢,它是拿着你的K哈希啊去模拟这128。啊,然后呢,划分到这十个组里边啊,划分到这十个组里边,就是你模是模128,那出来的结果是不是零到127啊,他把这零到127呢,划分到这十个组里边,它是这样的一个过程,对吧?所以呢,我们并度与这个k group都是二的整次幂,那么他们俩能整除二的整次幂跟二的整次幂肯定能整除嘛,对吧,那整除的话,那。更均匀一点啊,对吧,这个意思啊,所以呢,要求你冰度特别大的时候呢,你可以设置成二的整存力小的,这个就无所谓了啊。好,那第三个是S端,S端呢,如果咱们对接的是这个卡夫卡。
15:02
对吧,如果对接的卡夫卡,那很简单,可以设置为卡夫卡的分居数。啊,如果是卡夫卡,可以直接设置为卡夫卡的分期数啊,就是这个点,如果不是卡卡的不是卡夫卡,那我们有对吧,我们有这个。还贝。啊,有这个克雷克house我们对接的下游对吧?啊,那埃斯的话其实无所谓,他都是新增对吧,直接往里写就完了,他写内存克雷house呢,写入速度其实也很快,而且克林浩咱们用的是JDBC的一个。方式写入的,他呢,自带的这个批量提交对吧,你把那个批量调大一点啊,你假如说五条不行,你十条二两。1000条2000条对吧,生产环境当中呢,你如果数据量很大,那我可以呢。5000条1万条写一次,对吧,我不要那么频繁的去写,就是你来一条写一条,来一条写一条,这样的话,你肯定会数据库的压力比较大嘛,对吧,假如你设置一。他压力会比较大,很容易会崩掉,好像这个咱们班之前有同学出现过这个情况,对吧,他他这个参数呢,每次造数据造的就非常多。
16:07
然后呢,我们是不是五五条一写,五条一写啊,那就跟数据库的交互就太频繁了,我让他把它改成了200,诶,它就不会有问题了,他本来是五条的时候,他会丢数据,他好像是丢数据的现象啊,咱们班有个同学出现这种现象,因为他造数据造的比较多,我呢每次造很少对吧,几十条,他那边一造好像是几百条,上千条吧,一下子咱们毕竟是虚拟机啊,那也都说上千条就扛不住了嘛,毕竟是虚拟机。对吧,嗯,这这个不太不太靠谱的,你看它几G啊,比你电脑的内存要小多了,因为你是从从Windows上虚拟出来的。对吧,肯定他的一个能力很弱啊,那你五条一写五条一些,那你一下子写跟这个数据库交互太频繁了,我让他把它改成了200,好像是100还是200啊,我忘了啊,改成200吧,然后呢,他就没有这个问题了,不会丢数据了,因为我跟这个数据库的交互就减少了呀。
17:02
对吧,交互就减少了,是这个点啊,那就导致他就没有这个问题了,对吧?这就是说你不光要考虑变异度,我们还可以考虑批量提交,对吧?你写到这种数据库里边可以批量提交,也可以减少与数据库的一个交互,这也是一种方案,对吧?不光可以增加这个病因度啊,好,这是我们所说的这个病因度的一个设置,其实它呢,还好,比较简单一点,对吧?一般来说呢,我们跟卡夫卡的分居数保持一致,从前到后保持一致就够了,你也用不到太多的一个病因度,对吧。好,那么接下来呢,是关于这个rock DB大状态的一个调优啊,那为什么rock DB适合写这种大状态呢?因为它类似于这个叫lsm数啊,类似于这个这种方式,它是使用内存结合磁盘的方式来用的。啊,就是说他写呢,先写到内存,找个时合适的时机去落盘,对吧,那这个效率比较高,更重要的还有一个点在于什么呢?它里边啊,除了这个读写效率比较高啊,那你一个数量大,我要求就读写效率嘛,对吧,除了这个点之外,它还有一个很好的东西叫什么呢。
18:13
增量。只有它啊,可以做这个增量状态啊,只有它可以做一个增量的,那何为增量状态呢?你比如说啊,假如说我用的是FS。啊,我用的是FS这种对吧,我给大家举个例子啊,FS这种,那比如说我的第一次状态是一二。三四。对吧,好,那过了五秒钟,假如五秒钟做一次状态,对吧,做一次状态啊,做一次这个checkpoint。我呢,又变成了123456。OK吧,假如说类似于这种情况啊,哎,我刚才摁摁错了。啊,我第一次呢是1234啊这个状态1234,第二次呢是123456。啊,我多了五六对吧,多了五六,如果说你用的是FS,就是FS这种状态后端对吧,那么它呢,在第一个拆开方的一对吧,CK1里边就存的是1234啊把它全部写出去对吧?好,那到了CK2里边呢,大家应该知道它存的是123456。
19:17
因为它会把这个删掉,对吧,所以它呢,这种呢叫全量,这种叫全量,而我们的rock DB。我们的DB它可以配置为增量对吧,增量什么意思呢?第一次1234嘛,对吧,好第二次呢,123456是吧。我多了五六,那么第一次呢,你正常的1234写出去,因为这个肯定是第一次嘛,你就空的对吧,第二次呢,只写什么,只写五六。我只写新增的这个状态。对吧,这叫增量状态,这是它独有的DB的一个特点,所以在生态环境当中,绕DB是用的最多的,这个状态后端用的是最多的一个状态后端啊。这个要注意一下,OK吧。
20:00
好,那么我们来看一下它呢,第一可以设置它,还有除了我们刚才所聊的之外,它还有哪些特点啊,第一可以配置多目录。因为本地呢,它用的磁盘对吧,本地的用的磁盘,所以可以配置多目录啊,这是第一个,第二刚才我们说的增量检查点。看到了,哎,默认是false啊,默认false,因为所有的都可以force嘛,全量对吧,它也可以全量,那你可以改为处做增量啊,然后呢,还可以配置,如果你本地磁盘是SSD,诶你可以设置这个算法啊。SSD。对吧,哎,那你本身磁盘是固态,然后呢,你从。读写方面,算法上面也做了优化,那这个是最好的对吧?好,那这个是我们所说的SSD优化啊呃,然后接下来就是,诶看着block catch。因为刚才我们提到了它呢,是通过这个磁盘加内存的方式,对吧,所以呢,那我们可以给内存一个空间,诶这是读内存啊,注意这是读内存。
21:03
读内存,那这个越大,那未来呢,我走磁盘的概率就越低,对吧?啊认识好接下来这一块啊。这个是合并的一个线程数,对吧,用于后台flash和合并文件的线程数,那这个越高肯定会好一点啊好,那接下来看这这三个。这三个呢,分别对应的是斜缓存。对吧,给写缓存用的啊,那我们可以调高它的一个数量大小,对吧,合并的。线人数啊,一次合并的文件数对吧,这都可以啊调这是关于写缓存的啊,最后还有一个设置从本地恢复。设置从本地恢复,因为我们知道我们的数据呢,本地是存在这个磁盘里边的,远程呢,我们也写到HDFS对吧?远程呢也写到HDFS,那如果说我任务挂掉了,我重启,我设置为本地恢复,那效率会更高一点,因为我不需要从远程HDFS去拉取,对吧?从本地磁盘给它读出来就好了啊是这意思,因为你远程HDFS它还得读磁盘对吧?这还有一个从本地恢复啊,这个当然了,嗯,就然CB有了,因为其他的你本地没有,你比如说我们的FS。
22:14
FS本地内存呢,是存在本地的数据状态,存在job内存里边。对吧,啊,存在job measure内存里边,而memory那本地的这个状态也是存在job measure内存里边的。对吧,他这样的一个点,所以呢,他就没办法从本地恢复,因为你任务挂掉了,你本地的job啊,Task讲说错了,刚才刚才说错了,是task讲本地的状态memory state back以及FS state,它都是存在task manager的内存里边。而远程的对吧,对于我们memory state,它是存在job manager的,而FS的它存在idfs,对吧,你只能从远程拿取,你没办法从这个。本地恢复它是在task manager内存里边的,对吧,那你任务挂掉了,Task manager内存肯定就没了啊,所以只有它可以从这个本地恢复啊,好,这是我们所看到叫rock DB的一个大状态的一个调优,哎,那生产文件当中用的最多的就是rock DB啊。
23:17
好,那么接下来呢,是这个checkpoint。啊,是咱们checkpoint的一个配置对吧?Checkpoint呢,我们在之前无论大家学习flink阶段,还是我们项目里边,对于flink CDC之前做测试,对吧,我们选择是五秒钟对吧?五秒钟或者秒级别的,那这个在生产环件中不可能啊,对吧,你秒级别的这个太频繁了,因为我们拆保呢,做拆只是为了防止这个任务挂掉了,我们可以恢复,对吧?做这个事用的,那你如此频繁干嘛了,那起码得分中级啊,起码得分中级五到十分钟。对吧,啊,你起码三分钟啊,十分钟一次对吧,这个是比较合理的,你不能说五秒钟做一次那封了对吧?啊,那关于它的配置呢,就不多聊了,因为我们在项目里边几乎每一个里边我们都写了有这个东西。
24:04
对吧,每一个咱们都放了这个跳泡的参数,只不过我注掉了这个,也是提醒大家未来工作的时候一定要把这个加上。一定要有这个东西,你没有他很烦了对吧?啊好,那接下来下面一个呢,是这个分里边有一个比较好用的一个工具啊参数工具,这个东西能干什么事呢?呃,一三两个是我们要掌握的。第一个读取运行参数,第二个呢,读取配置信息,读取配置信息,那读取运行参数是什么意思呢?我们来给他看一下来。这两个东西呢,我们是比较关键的一个点啊,那比如说吧,我们假如说。我们要读取哈度1029999端口,对吧,我们都是写死的,那未来我要打包运行呢,我就不希望把这个东西写死,是不是,我要通过慢方法的参数给它传进来,大家想是不是?对吧,我就要通过慢方法的参数给它,给它呢传进来,那传进来我们怎么解析呢。
25:03
啊,我们怎么解析。是不是应该这样,比如说啊在这里面呢,我们在测试里边随便找一个。随便找一个吧。比如说就是他啊。那未来呢,我不希望写死对吧,因为我打包我不打包的话,我测试我写无所谓,我随便随时改对吧,我要打包你要写死我就很麻烦啊,那我就不希望写死,那我要怎么写这样X。是不是X0。对吧,这边呢写。integer.pass对吧,然后呢,X。一。有没有问题?如果说我们希望通过慢方把它参数传进来,咱们是不是应该这样写?对不对。这个没问题吧,啊,咱们肯定需要这样去写啊好呃,但这样的话,你未来传的时候呢,它必须要求是有顺序的,就是你第一个参数必须是house。
26:10
第二个参数必须是这个端口号对吧,你要是你要两个反了,那就不对了。你要把两个写反了,那就不行了,对吧,你把第二个你写到后面那完了对吧?啊好,那刚才我们提到的这个工具。Permit to对吧,这个工具它干什么事呢?它可以做这个事情来看啊,比如说这儿呢,我们这样写对吧,那我们要从这个参数当中解析数据,那就是permit。诶。To from X X。加倍。好,接下来呢。店。Yeah。
27:08
叫port,然后这儿呢,我就不写X0X1了,我写什么呢?叫host对吧?啊写一个叫port。我通过解析参数的方式,那未来呢,你的main方法传参数啊,这个X要怎么传呢?要这样传杠杠,哎是杠host啊一个杠就行了啊杠,然后呢,这个哈幺零。然后呢,刚好。然后呢,是8888这样写。是这样写的,而且呢,这个时候呢,你这个顺序能不能换呢。能不能换大家告诉我。现在对于参数的顺序还有讲究吗?还必须说第一个写主机名,第二个写单口号吗?有没有讲究的?是不是随便换,就像谢总说的随便换对了,因为我是通过什么,我是通过K去获取这个值的。那我必然可以随便换呀,对吧,就没有顺序要求了啊,这是第一个我们所聊的对吧,它呢可以解析我们的运行参数,就是from X对吧,这些方式啊,第二个呢,读取系统属性,这个一般很少用,读取系统属性其实意义不大啊,第三个呢,是用的比较多一些,就是读取这个配置文件。
28:20
好,呃,大家之前是不是写过一个东西叫pro?啊。你你之前写任务的时候,STEM里边是不是写过一个叫的空间类,有没有写过。啊。有写过吗?那么此时你就不用写那个pro YouTube了,对吧,加载一个文件,你直接用它就行了,如果说你开发的时候,对吧,用的是flink,那你直接用它,它就相当于你写的那个。
29:09
工具类对吧,直接写from file。诶然后呢,Pro file.get然后呢,KV,因为pro文件是不是A等于B这种方式啊对吧,它里边呢是A等于B的方式了,那这传A这就获得B。这就获得B对吧,你就不用写这个工具类了,那这两个东西呢,这两种方式啊,是关于这个参数工具用的比较多的形式啊,其他的呢,用的比较少,第四个呢,就是注册全局参数,这个呢,一般也很少用啊,一般很少用,我们一般不这样用啊,这个知道一下,所以呢,我们了解一下一三这两种情况就够了。啊,掌握一下一三对吧,最后一个呢,是压缩方式,压测方式呢,呃,你可讲。可以在卡卡当中积压一部分数据,然后呢一下子打开对吧,消费它一下子消费很多数据,或者说呢,你就自己写Mo呗,对吧,咱们不是有Mo模块吗?你有很多很多Mo同时造数据,对吧?那这个呢,你也去把握一下诶,假如说你Mo里边是一毫秒,假如说你一毫秒造一个数据,对吧,那一秒钟的1000条,那你要用三个来同时造数据,那就3000条呗,对吧,你可以自己去控制它的一个每秒钟的数据量,对吧?这是压缩的方式啊,两种方式,第一个呢直接Mo数据,第二个呢是我们。
30:27
产生这个数据积压,然后一下子泄洪,对吧,一下泄洪的方式啊,先积压的啊,这种方式好,这是我们所聊的这三个点啊,都还好,对吧。
我来说两句