粉丝35获赞262


同学们好,我是委婉站长冰大艾西派在上一个视频呢,我们已经讲解了我们这个圆轨迹可变哨和方法,创建我们这个湖顶面的一个基本过程。 可是呢,对于我们这个用户来说,在实际使用过程中呢,经常会遇到各种问题,比如说我们下面的这个问题,这个这个鸡蛋型的一个轮廓线,我想创建这么一个类似我们这个鸡蛋的一个曲面,那我们要创建呢,其实很简单, 那同样这是我们前面所说的,我们要创建这么一条辅助的一个圆轨迹啊,这个在这个平面上没有什么好说的啊,画这么一个圆,这个圆大小,比如说我们就画成这么一个大小的一个圆,有了我们这个圆, 然后啊,比如说我们给他随便给他一个尺寸,比如说二十啊,或者十五,这个都没有关系。然后呢,呃,分割点呢?我们先把它放到我们这个上上下两个点,这个为什么等下我们再来讲解确定, 然后给他创建我们这么扫描特征啊,这个步骤呢,和我们前面是一样的啊,他让这个方向呢,你可以切换这个就是一呃无所谓的,进入我们这样的一个允许洁面的变化,然后按住 ctrl 键选择第二轨迹,然后让他垂直于我们这个投影进入我们这个草会啊,这一切都是我们这个 按部就班啊,看起来好像没有什么特殊的,然后再参考,然后再选择我们这个坐标系作为我们这个参考,作为我们这个中心或者是最高点啊,然后放下这么一个中心线啊,注意放下这个竖直的一个中心线,这个洁面呢我们就用这么一个 圆锥曲线来创建,这个通用性会比较强,因为圆弧的话取决你这个呃两个点的距离, 然后这里面给他标注终点呢,中心的这个位置肯定是九十度两侧呢,我给他比如说还是两度的一个触摸角,这一条线呢,没什么用的了,我们可以删掉 在标注这个端点的一个高度,这个约束是一定要注意的,如果说你刚才保留这个角度的话,那扫描出来就类似我们前面的标注半径这样的一个形状了 啊,这个高度呢,比如说我们给它实施啊,这个就是我们基本的一个形状啊,洁面的形状完成之后,那我们可以扫描出我们这个类似压扁的这个鸡蛋型的一个曲面啊,这种曲面呢在我们这个实际产品里面呢,也是会比较常见的,没有什么特殊啊,看起来好像一切都正常。但是呢 假如说我们把这个第一个轮廓,这个洁面这个形状呢,稍微改一下,比如说我这里我们改成一百五十,那相当于一个长椭圆的形状,你就会发现,哎,这个就失败了 啊,你会发现我们这个可变扫描的一个曲面呢,没办法生成,同时呢这里面模型数呢也一呃告诉你他失败了啊,这个原因是为什么呢?照理说我们这么一个轮廓不应该会失败而已,我们这个洁面呢,本身也是这么一个圆锥曲线啊,其实呢这个原因大家要注意, 我们刚才说的这个中心的这个圆呢,其实没有什么太大的关系,但是呢相对我们这种长条形的一个轮廓状况下,这个圆不能太小,太小的一个原因是为什么?大家可以看一下在我们扫描的过程里面,我们这个轨迹这个圆点轨迹这个点呢是在 这个小圆上变化的,而我们这个另外一个点呢,就是另外一个外轮廓的这个焦点呢,自然就是我们这条轮廓线和我们这个草汇平面的一个焦点。比如说我们扫描在这个时候这个焦点呢, 这个平面和我们这个外轮廓的焦点呢,其实有两个,一个就是这个,一个是外面的这个,而我们系统默认呢是取最近的一个,就是两个焦点最近的那个。但是你可以看到,因为本身这个轮廓它是长条形的, 那我们现在呢,在这个地方的时候,可能距离这个端点的这个距离呢,比这个还要近,所以默认的时候就会捕捉到我们这个点 啊,那这个就会造成我们的失败。为什么?因为我们这一个点呢,本身也是对应的这个啊,就轮廓在这个圆点轨迹在这个时候对应的外轮廓的这个焦点呢,也是这个点,从这里开始扫描描,你们可以看到扫描一直 对应的对应的这个关系啊,比如说我们在扫描的过程中,大家可以看到这个变化,可能是这样的,假如说从这里开始扫描呢,对应的是这一点,然后这个这个好像一切正常啊,都没有关系,一直又都没有问题,一直到这里 啊,比假如说到这里这一个洁面的一个距离呢,刚好等于我们这个啊,这边的时候啊,或者说这两个这边夸张一点,可能在这个地方啊,刚好等到这个时候呢,他还没有问题,那就说这段呢, 等于这一段的时候呢,才能找到正确的对应点。但是越过这一段的时候,比如说这个时候这一边呢就已经比这一边要长,那这个时候这个洁面呢就突然又跑回到这一边来了,那这个自然就造成了我们这个扫描失败。这个其实呢我们也可以通过我们这个刚才的方式来进行我们这个模 理一下,我这个重新定义一下我们这个可偏扫描,然后这个草会这个圆点,我重新选择一下,假如说我选择其中的一段, 我们先把它移着重新来创建一个,因为这个你确定了之后呢,这个轨迹呢就没办法变了。然后我们再扫描,然后呢我选择了其中的一段 圆弧作为我们这个扫描,假如说我选择这个,那肯定是没有问题的啊,这个外面呢肯定对应的都是正确的。但是如果说我选择这个啊,我们把它移出现, 刚才呢不小心给他选择了一段,我只选择这一段这一半,然后呢我外轮廓呢还是选择这个,然后呢我们再来看一下我们这个参考 啊,这个垂直于我们这个投影,垂直于我们这个刚才的这个平面的这个投影啊,进入我们这样的一个曲面场会啊,同样放下我们这个中心线,那这个参考呢?还是我们这个坐标的一个原点, 还是我们这样的一个圆锥曲线的一个洁面啊?这个都是没什么好说的,这个是九十度,然后这个距离啊,这个端点的高度啊,注意要低于标注我们这个高度十四啊,这里边给他八十八啊,这个斜线的一个参考线呢,就没有用的了。确定, 那我们就来看一下他为什么会失败,然后这个参考啊,换到我们这个链这个圆点,把这个端点呢往后拉,那你可以看到这样呢,他是可以成功的,在我们这个扫描过程里 能找到我们这个对应的正确的一个对应的点,所以呢他可以扫描出来,然后呢到我们这一边呢, 那你看啊,到这个点呢,实际上呢这两这两半呢,他是一样的距离,因为我们这个开放的边界,他对应的是往这方向来找, 然后你再来看,到这个时候呢,他就不行了,就超不过去了,那这个时候因为是这一段呢,刚好就等于我们这一段再过来呢,他这个洁面对应点呢,那可能他直接就捕捉到这边来了,所以就导致了我们这个扫描的过程的一个失败, 那明摆了我们这个扫描的一个失败的一个原因。其实我们要改正了就很容易了,因为我们刚才呢所说的这个小的轮廓点是容易到我们这个距离这个点等于我们这个比我们到外面的这个还要近。所以假如说我们把这个中心的这个辅助的一个圆的半径 把它改大一点,那就可以了。比如说我们改成六十,和我们本身的这个轮廓线差不多大,那你可以看到这个可变扫描的这个曲面,自然就可以成功了。其实呢当刚刚才呢,我们把这个断点放在那个位置呢,实际上就是为了方便我们这样的一个讲解的, 假如说我们刚才在草会的时候,我直接放到这个上面的时候,大家可能就看的会比较清楚了啊,比如说我们现在完成我们这个扫描之后,我回到我们这个前面,或者说直接把它删掉, 再来创建我们这个园,我再来创建这么一个小园啊,大家可能会比较容易理解我刚才所说的话,我创建这么一个小园,但是这次呢,我不管他的一个分割点啊,这个再进行我们扫描,这个起点就在这里,然后按住 ctrl 键,然后曲面,然后草会,那你就会发现 他捕捉的是这个点,而在我们这个小园里面,我希望他捕捉的是这个焦点啊,这个就是我们刚才为什么这种状况下会失败的一个原因了,所以呢我们就要注意着第一个可能失败的一个原因,也就是假如说对这种轮廓比较长条形状的,那我们中间创建的这个辅助员呢, 啊,不能太小啊,其实呢正义基于这一点呢,我们一般建议我们创建的中间的这个辅助员呢,基本上和我们这个轮廓差不多大就好了啊,你太大一点呢是没有关系的,小呢,你太小了就不行啊,所以要注意这点 啊,这个是导致我们这样的一个长条形轮廓啊,可变圆,轨迹可变上面方法失败的一个原因,这个就是我们今天啊这个视频要讲解的内容。那我们在下面的这个视频呢,我们要讲解的就是我们这种 曲面上投影的这个轮廓曲线,他这种圆轨即可变扫描方法的一个创建,今天呢我们就讲到这里。

从原码角度看 threat pull executor the ad worker failed 方法。哈喽,大家好,我是架构师奶爸。在 threat pull executor the ad worker 方法中,如果添加工作线程失败或者工作线程启动失败时, 则会调用 ad worker failed 方法。下面我们就来看看 ad work failed 方法的实现原代码。如上图所示, ad worker failed 方法的逻辑就比较简单了获取独占所,将任务从 workers 中移除,并且通过 c、 a、 s 将任务的数量减一, 最后释放所。下期我们将分析另外一个重要的方法 reject 方法拒绝策略。如果你想了解更多关于 java 架构师的知识,请关注我架构师奶爸点赞收藏,我们下期再见!




对一个 spark 任务而言,分配多 execute 单 cpu 跟分配单 execute 多 cpu 有什么区别?当我们用 spark 开发完一个功能提交到集群运行时, 资源分配的时候,往往会面临这样的选择,那就是我是分配多个 execute, 让每个 execute 只跑一个县城,还是分配少量的 execute, 然后让每个 execute 去跑多个县城?假如对一个有着十台工作节点的集群来说, 设置十个 execute, 每个 execute 分配一个 cpu 核心,或者设置五个 execute, 每个 execute 分配两个 cpu 核心。这两种运行方式都可以完成一个分布式任务, 他们之间的联系与区别是什么样的呢?我们先来看相同点,那就是任务的并行度都为十,都能够同 同时处理十个怕提醒的数据,数据处理效率理论上是差不多的。至于不同点,两者启动的进程数量是不一样的, 前者为十个 xq 的进程,而后者为五个 xq 的进程,但是前者都是单线层处理模式,而后者是用多线层处理模式。 至于这两种运行方式的优劣如何,该怎么选,我们来看一看他们之间的运行方式都有哪些特点。第一个是多 extra 单线程模式, 这种模式呢,会尽可能把进程平均分配到不同的服务器上,让服务器之间的负载能够更容易保持在一个相同的水平。但是因为一个进程只处理一个 party 型的数据,那么在内存的利用率上可能会有一点点浪费。第二个是少 xq 的多现成模式, 这种模式在任务分配上会存在服务器之间负载不均匀的情况,但是因为一个 xq 的进程会同时处理多个 party 型的数据,因此理论上他的内存利用效率会更高一些。第三个呢,就是如果一个 xq 的运行多个线程的情况下, 如果当前你的数据处理逻辑相对比较复杂,比如涉及到数据库的连接问题,那么这个时候就需要注意,对于同一个 j v m 进程来说,单线程和多线程的连接管理手段是不一样的, 单线程的连接方式用一个简单的连接单立就可以搞定,但是如果是多线程的话, 可能就需要用到现成词方案代码逻辑就会复杂得多。了解到以上几种不同的运行特性之后,那么在以后提交 spark 任务时,你就大概知道该选择哪种参数去运行了。


好,那我们再来看第二道,为什么不建议使用 executance 来创建现成词?这道题目通常可能是中级开发工程师在面试的时候会被问到对应的薪资是十 k 到二十 k 这个范围内,可能都会都会被问到的一道题目, 嗯,我们在用 executest 这个方法啊,我们无非就是去调用像这种 newfix 的 siri pro 这种方法去创建一个线程词,那么我们可以看一下这个方法是怎么实现的, 它其实底层是用的 served pro executor 啊,是我们很底层的一个线层值的时间内啊这个构字方法去创建出来的。那么其中最关键的一个点就这个 linking 的 blocking q 啊,它表示无界的主色对列啊,有人说可能一下子反应不过来,你凡是看到这个 linking, 他相当于就是列表的意思,而列表呃和数组吗?对,他就是列表,就是无界的,所以这就是会导致一个可能会很严重的问题。如果说我们现在 我们创建出来这个线程词,我们去提交任务啊,如果说我们这边设置的线程呃可能还比较少啊,当然比如说那设置多一点呢? 我们县城数一般不会设置特别多,不是说县城数越多就越好,对不对?所以在县城数呃,一定的情况下面,如果说我们的任务很多,那么这些任务可能都会进入到我们这个队列里面 啊,那么对内是无界的,那表示说我这个对内其实可以存很多的任务,但是你就会造成占用很多的内存,从而就会导致我们的 j v m 可能出现 o o m 就是你这个性能池,你可能里面 这个对列你占用了很多很多很多内存,导致我整个 g a m 我没有内存可以用了,这就会出现 o o m 了。就说,呃,这是我们最主要的原因,我们不建议大家用 excutas 的方式去创建县城池。同样的道理,当我们在调用这种 single 呃 seri 的呃 execute 的时候也是这样的啊,它只有一个县城,那么它里面也是用的这种无界的主色对列啊,所以同样的原因啊,所以这边总结一下, 就是我们呃在用 excurs 的方法去穿加现成尺的时候,很有可能会造成 o a, 但同然同呃同呃就除开这个原因之外。 呃,由于我们没有自己去定义这些购置方法的参数,所以说我们有的时候想对于这些现成词再去进行一些呃监控啊,包括管理啊,其实都不太方便。 就说我们在工作中间,呃,通常是建议大家自己要用个子方法来定义现成词,这样子呢,你可以更加灵活的控制,或者说呃,比如说去自定义现成的名字啊,这样子呢,也能够有利于大家去排查问题,对吧?所以就是对于这道题目的讲解, 大家看完视频之后不仅仅能应对面试官的连环问,更重要的是能真正提升自己的技术水平。 最后衷心祝愿看过我视频的同学,面试必过,薪资必涨!另外,本视频中所有的面试题答案和相关资料,请在评论区或联系 up 主领取。