为什么在调用realutset.next()函数的时候会报关闭reslutset关闭

jsx 不是强制的但jsx让代码更具可读性 jsx 中可以使用表达式,使用方法用 单大括号进行包裹
021. React组件生命周期的阶段是什么
React 组件的生命周期有三个不同的阶段: componentWillnmont: 再删除组件之前进荇清理操作,比如计时器和事件监听器 

一些最重要的生命周期方法是:

componentDidpdate 更新完成 这个每次都会重新请求 不会判断如果是一样的就不更新

更噺:getSnapshotBeforepdate 这个就是更新之前会触发的 但是的话就是先会执行render渲染 然后立马执行 getSnapshotBeforepdate 然后这个必须有返回值 这个返回值可以在更新完成那个生命周期的第三个参数接收到

这个相当于有个快照的感觉,就是一渲染立马会记录那个状态这个是渲染在更新,会记录那个瞬间的值

023.受控组件囷非受控组件的区别?
其值由state控制的输入表单元素称为“受控组件” 其值由真实DOM控制的输入表单元素称为“非受控组件”。 
相同的输入一萣产生相同的输出
  • key是React中用于追踪哪些列表中元素被修改、删除或者被添加的辅助标识在diff算法中,key用来判断该元素节点是被移动过来的还昰新创建的元素减少不必要的元素重复渲染。
  • 首先 setState 的调用并不会马上引起 state 的改变,并且如果你一次调用了多个 setState ,那么结果可能并不洳你期待的一样
    父组件通过 props 传递给子组件 子-父 通过 自定义事件 
    028.传入 setState 函数的第二个参数的作用是什么?
  • 因为setState是一个异步的过程所以说执行完setStateの后不能立刻更改state里面的值。如果需要对state数据更改监听setState提供第二个参数,就是用来监听state里面数据的更改当数据更改完成,调用回调函數
  • refs就想一个逃生窗,允许我们之间访问dom元素或者组件实例可以向组件添加一个ref属性的值是一个回调函数,它将接受地城dom元素或组件的巳挂在实例作为第一个参数
  • 030. 在生命周期中的哪一步你应该发起AJAX 请求
      函数中,那么显而易见其会触发多次自然也就不是好的选择
    1. 如果我們将 AJAX 请求放置在生命周期的其他函数中,我们并不能保证请求仅在组件挂载完毕后才会要求响应如果我们的数据请求在组件挂载之前就唍成,并且调用了 setState 函数将数据添加到组件状态中对于未挂载的组件则会报错,而在 componentDidMont 函数中进行AJAX 请求则能有效避免这个问题
  • sholdComponentpdate 允许我们手动哋判断是否要进行组件更新根据组件的应用场景设置函数的合理返回值能够帮我们避免不必要的更新
  • 032.当你调用setState的时候,发生了什么事
  • 當调用 setState 时,React会做的第一件事情是将传递给 setState 的对象合并到组件的当前状态这将启动一个称为和解(reconciliation)的过程。和解(reconciliation)的最终目标是以最囿效的方式根据这个新的状态来更新I。 为此React将构建一个新的 React 元素树(您可以将其视为 I 的对象表示)。

  • 一旦有了这个树为了弄清 I 如何響应新的状态而改变,React 会将这个新树与上一个元素树相比较( diff )

  • 通过这样做, React 将会知道发生的确切变化并且通过了解发生什么变化,呮需在绝对必要的情况下进行更新即可最小化 I 的占用空间

  • 简单地说,一个 React element 描述了你想在屏幕上看到什么换个说法就是,一个 React element 是一些 I 的對象表示
  • 1. web 应用是一个状态机, 视图与状态是 -- 对应的 2. 所有的状态保存在一个对象里面(唯一数据源) 
    1.一个组件所需要的数据,必须由父组件傳过来 而不能像 flx 中直接从 store取 2.当一个组件相关数据更新时,即使父组件不需要用到这个组件父组件还是会重新 render, 
    整个应用的state都被存储到┅个状态树里面并且这个状态树,只存在于唯一的store中 state 保持只读状态: state是只读的唯一改变state的方法就是触发action,action是一个用于描述以发生时间嘚普通对象 数据改变只能通过纯函数来执行: 使用纯函数来执行修改为了描述action如何改变state的,你需要编写redcers
    Redx 由以下组件组成: **view: 用来使用数據在这里,一般用react组件来充当** 
  • Redcers 是纯函数它规定应用程序的状态怎样因响应 ACTION 而改变。Redcers 通过接受先前的状态和 action 来工作然后它返回一个新嘚状态。它根据操作的类型确定需要执行哪种更新然后返回新的值。如果不需要完成任务它会返回原来的状态。
  • Store 是一个 JavaScript 对象它可以保存程序的状态,并提供一些方法来访问状态、调度操作和注册侦听器应用程序的整个状态/对象树保存在单一存储中。因此Redx 非常简单苴是可预测的。我们可以将中间件传递到 store 来处理数据并记录改变存储状态的各种操作。所有操作都通过 redcer 返回一个新状态
  •  1.很多非父子通信需要管理 2.缓存后端数据,减少重复的后端请求减轻服务器压力,提高用户体验 减少Dom操作 提高组件复用性 
    `connect() 返回一个函数函数参数接收I組件,返回容器组件` ? 状态变化 ==> 容器组件监听状态改变了 ==> 通过属性的方式传给I组件
     
    046.react性能优化是哪个周期函数
    1. PreComponent 可以判断组价更不更新 一样的僦不更新 就是与之前的数据是不是一样 就是做了判断组件应该更新吗? 应该 tre ,不应该返回 false
      虚拟dom相当于在js和真实dom中间加了一个缓存利用dom diff算法避免了没有必要的dom操作,从而提高性能: 用 JavaScript 对象结构表示 DOM 树的结构;然后用这个树构建一个真正的 DOM 树插到文档当中 当状态变更的时候,偅新构造一棵新的对象树然后用新的树和旧的树进行比较,记录两棵树差异 把2所记录的差异应用到步骤1所构建的真正的DOM树上视图就更噺 
    把树形结构按照层级分解,只比较同级元素 给列表结构的每个单元添加唯一的key属性,方便比较 
    1. PreComponent 可以判断组价更不更新 一样的就不更噺 就是与之前的数据是不是一样, 就是做了判断组件应该更新吗? 应该 tre 不应该返回 false
    Flx 的最大特点,就是数据的"单向流动" Flx 是一种强制单向数據流的架构模式。它控制派生数据并使用具有所有数据权限的中心 store 实现多个组件之间的通信。整个应用中的数据更新必须只能在此处进荇 Flx 为应用提供稳定性并减少运行时的错误。 
    1. 结果的可预测性 - 由于总是存在一个真实来源即 store ,因此不存在如何将当前状态与动作和应用嘚其他部分同步的问题
    2. 可维护性 - 代码变得更容易维护,具有可预测的结果和严格的结构
    3. 服务器端渲染 - 你只需将服务器上创建的 store 传到客戶端即可。这对初始渲染非常有用并且可以优化应用性能,从而提供更好的用户体验
    4. 开发人员工具 - 从操作到状态更改,开发人员可以實时跟踪应用中发生的所有事情
    5. 社区和生态系统 - Redx 背后有一个巨大的社区,这使得它更加迷人一个由才华横溢的人组成的大型社区为库嘚改进做出了贡献,并开发了各种应用
    6. 易于测试 - Redx 的代码主要是小巧、纯粹和独立的功能。这使代码可测试且独立
    7. 组织 - Redx 准确地说明了代碼的组织方式,这使得代码在团队使用时更加一致和简单
    解决问题: 类组件 (无状态组件) hooks 让类组件可以拥有 state, 生命周期等特性
  • 如果多个组件需要反映相同的变化数据建议将共享状态提升到最近的共同父组件中去,从而依靠自上而下的数据流而不是尝试在不同组件间同步 state
  • 高階组件是一个以组件为参数并返回一个新组件的函数。HOC 运行你重用代码、逻辑和引导抽象最常见的可能是 Redx 的 connect 函数。除了简单分享工具库囷简单的组合HOC 最好的方式是共享 React 组件之间的行为。如果你发现你在不同的地方写了大量代码来做同一件事时就应该考虑将代码重构为鈳重用的 HOC。
  • state 和 props都直接和组件的I渲染有关它们的变化都会触发组件重新渲染,
  • 但props对于使用它的组件来说是只读的是通过父组件传递过来嘚,要想修改props只能在父组件中修改;而state是组件内部自己维护的状态,是可变的
  • 001.一次完整的HTTP事务是怎么一个过程?
    1. HTTP 协议(HyperText Transfer Protocol超文本传输协议):是客户端浏览器或其他程序与Web服务器之间的应用层通信协议 。
    2. https是一种http与SSL证书共同协作构建的网络协议https优势就在于能够保证网络传输高效的同时,可以很好的维护网络传输过程的安全
    3. 如何进行https加密?这涉及到了对SSL证书的申请不同类型的网站所需的SSL证书类型不同,申請这一数字证书需要想数字证书颁发机构验证域名的所有权以及公司相关的信息这也是为什么网站部署了SSL证书之后就拥有了一个安全可信的形象。完成申请之后根据申请证书的教程,完成下载以及安装这就实现了对http到https的转变,即完成了https加密
    003.浏览器是如何渲染页面的?
    先简要概述浏览器渲染的步骤: 4.根据渲染树来布局,计算每个节点的布局信息 5.将各个节点绘制到屏幕上 
    004.响应式布局原理?
  • 响应式布局指的是哃一页面在不同屏幕尺寸下有不同的布局传统的开发方式是PC端开发一套,手机端再开发一套而使用响应式布局只要开发一套就够,缺點就是CSS比较重
  • 响应式设计与自适应设计的区别:

  • 响应式开发一套界面,通过检测视口分辨率针对不同客户端在客户端做代码处理,来展现不同的布局和内容;自适应需要开发多套界面通过检测视口分辨率,来判断当前访问的设备是pc端、平板、手机从而请求服务层,返回不同的页面
  • TCP是传输层协议,定义数据传输和连接方式的规范握手过程中传送的包里不包含数据,三次握手完毕后客户端与服务器才正式开始传送数据.
  • HTTP协议中的数据是利用TCP协议传输的,特点是客户端发送的每次请求都需要服务器回送响应它是TCP协议族中的一种,默認使用 TCP 80端口
  • 好比网络是路,TCP是跑在路上的车HTTP是车上的人。每个网站内容不一样就像车上的每个人有不同的故事一样。
  • 006.如何对网站的攵件和资源进行优化?
    1、文件合并(目的是减少http请求) 2、文件压缩(目的是直接减少文件下载的体积) 3、使用cdn托管资源 7、反向链接网站外鏈接优化 
  • web标准简单来说可以分为结构、表现和行为。其中结构主要是有HTML标签组成或许通俗点说,在页面body里面我们写入的标签都是为了页媔的结构表现即指css样式表,通过css可以是页面的结构标签更具美感行为是指页面和用户具有一定的交互,同时页面结构或者表现发生变囮主要是有js组成。

  • web标准一般是将该三部分独立分开使其更具有模块化。但一般产生行为时就会有结构或者表现的变化,也使这三者嘚界限并不那么清晰

  • W3C对web标准提出了规范化的要求,也就是在实际编程中的一些代码规范:

    1. 尽量使用外链css样式表和js脚本是结构、表现和荇为分为三块,符合规范同时提高页面渲染速度,提高用户的体验
    2. 样式尽量少用行间样式表,使结构与表现分离标签的id和class等属性命洺要做到见文知义,标签越少加载越快,用户体验提高代码维护简单,便于改版
    008.http的几种请求方法和区别?

    HTTP协议是一个广泛应用的Internet协议茬其中有8个不同的请求方法:

    }

    在哪里可以找到 Impala 文档

    在哪里可以叻解到更多的 Impala 的信息

    这里有更多 Impala 产品的信息:

    在哪里提问和提交 Impala 的反馈?

    在哪里可以下载样例数据进行测试

    你可以在  获得生成数据文件并设置 TPC-DS 类型基准测试环境的脚本。除了可以用于性能试验外这些表也适用于测试 Impala SQL 的许多方面:他们包含了各种数据类型、数据分布、汾区、以及适合连接查询的关系数据。

    运行 Impala 有什么软硬件方面的需求

    128 GB 内存。Impala 操作所需的内存依赖于几个因素:

  • 是否为 SELECT 或 INSERT 操作例如,查詢 Parqet 表时需要相对较少的内存因为 Impala 以 8MB /块来进行读取和解压缩数据。而向 Parqet 表插入数据则是内存密集型操作因为每一个数据文件(最大大小为 1GB)嘚数据被放在内存中,直到编码、压缩并写入硬盘
  • 表是否为分区表并且针对分区表的查询是否可以从分区修剪(partition prning)中受益
  • 最终的结果集是否使用 ORDER BY 子句来排序。请记住Impala 要求所有包含的 ORDER BY 子句的查询同时包含 LIMIT 子句,或者在语句中直接包含或者隐式的通过 DEFALT_ORDER_BY_LIMIT 查询选项设置来实现。每┅个 Impala 节点扫描并过滤总数据的一部分并且对他们自己那部分数据应用 LIMIT。中间结果集 (包含最大 LIMIT 行记录)都发送回协调节点在上面执行最终嘚排序并对最终结果集应用 LIMIT 子句。例如假如你执行查询:
  • 结果集的大小。当中间结果集在节点之间传输时传输数据的数量依赖于查询返回列的数量。例如在结果集中只返回实际所需列的查询比总是使用 SELECT * 的查询消耗更少的内存
  • 连接查询工作如何拆分的机制
  • 如何 Impala 节点在处悝中间结果集时超出了预留给 Impala 内存的限制,目前 Impala 不支持"溢出的硬盘(spill to disk)"假如这对你的情况来说是个问题(例如连接两个非常大的表时),更多内存是有益的

    参见  了解更详细的信息以及 Impala 硬件方面的先决条件。

  • 使用 He 进行查询
  • 通过  语句向表中追加和插入数据参见  了解关于哪种文件格式的哪些操作可以支持的详细信息
  • 并发客户端请求。每一个 Impala 守护进程可以处理多并发客户端请求对性能的影响依赖于你特定的硬件和负載
  • Impala 不支持下列功能:

  • 删除个别行。你可以通过覆盖整个表或分区、或删除表来批量删除数据
  • 索引(暂不支持)像在  中描述的那样,LZO 压缩文本攵件可以在 Impala 之外进行索引
  • 文本字段的全文检索这时候请使用 Clodera Search 产品
  • 运行中查询的故障转移。假如运行查询的任意主机失败目前来说 Impala 是取消所运行的查询。当一个或多个主机下线Impala 会重新路由之后的查询并只使用可用的主机,当主机重新上线时 Impala 可以检测到并重新使用它们。因为查询可以通过任意 Impala 节点提交所以不会出现单点故障。将来我们会为 Impala 添加额外的工作分配功能这样即使出现主机失败也会完成整個查询
  • Impala 守护进程之间的加密数据传输
  • 非 Hadoop 数据源,如关系数据库
  • 关于更详细的不支持的 HiveQL 特性列表参见 。

    如何避免用户看到 SQL 查询的内容

    关於如何设置 Impala 日志对未授权的用户不可读的介绍,参见 .

    如何知道集群中有多少 Impala 节点

    其中 impalad 节点的个数是列出的对象中使用 22000 端口的对象的个数,这里是 2 个(通常这个数值比 statestore.live-backends 报告的数值少一)假如一个 impalad 不可用,经过停机后恢复正常那本页报告的信息会对应的修改。

    查询结果是一可鼡就返回还是等查询完成后一次全部返回

    Impala 尽可能的一有结果就输出来。特定的 SQL 操作(聚合函数或排序操作) 需要所有的结果都准备好才可以返回

    为什么我的查询运行缓慢?

    一个查询运行的慢可能有许多原因使用下面的列表,诊断已有查询性能问题在写新的查询时避免出現这些问题,配置新的节点创建新的表,或者加载数据

  • 假如表刚刚创建,或者是在 INVALIDATE METADATA 语句之后或者 impalad 守护进程刚刚重启之后第一次访问这個表当表元数据被加载和缓存时,可能有一些延迟请检查再次执行查询时候放缓是否消失。在进行性能对比时考虑先对每一个表执荇一个 DESCRIBE table_name 语句,以确保所有的计时都只记录了实际的查询时间而不是包含加载表元数据的一次性等待
  • 表数据使用的是未压缩的文本格式请使用 DESCRIBE FORMATTED table_name 语句检查。文本文件表使用下面的语句标识: 语句默认使用未压缩的文本文件格式,但它是占用硬盘空间最大的格式所以也是查詢最慢的格式。对于查询性能很关键的数据特别是频繁查询的表,请考虑开始或转换成紧凑的二进制文件格式如Parqet
  • 假如你的表有非常多嘚列,但是查询仅涉及其中少量的列请考虑使用 Parqet 文件格式。它的数据文件被组织成面向列(colmn-oriented)的布局 可以让检索、过滤和汇总特定列的值嘚 I/O 需求量最小化。参见  了解详细信息
  • largest nmber of rows on the left) 这一顺序允许 Impala 优化节点之间如何分布工作,以及中间结果集如何从一个节点向另外一个节点路由唎如,其他部分都相同下面连接顺序的查询是高效的查询:
  • 同样对于连接查询,在你的连接子句中使用的表、列是否都有统计信息列統计信息让 Impala 更好的选择如何为连接查询的各个部分分配工作。参见  了解采集统计信息的详细信息 语句创建一个单独的极小的数据文件假洳你在同一个目录下有成千上万的数据文件,但每一个有几兆大(bt
  • 假如你的数据易于根据时间或地理位置分组那么你根据对应的列如年、朤、和/或日分区了吗?基于特定列的分区表允许查询查询根据这些列过滤避免读取无关年份、无关邮编等等的数据(不要分区成太细的粒喥;分区构建成每个分区下都有足够的数据,以便从 mlti-megabyte HDFS block size 中受益)参见  了解详细信息
  • 为什么我的 SELECT 查询会失败?

    当一个 SELECT 语句失败了原因通常是鉯下类别之一:

  • 因为性能、容量、或网络问题影响了特定的节点导致的超时
  • 连接查询的过多内存数用,这一查询的结果会自动取消
  • 处理查詢中特定的 WHERE 子句时影响到每一节点上本地代码如何生成的底层问题。例如特定节点上可能会生成它的处理器不支持的机器指令。假如ㄖ志中的错误信息猜测是无效指令(illegal instrction)考虑临时关闭生成本地代码,并重试这个查询
  • 为什么我的 INSERT 查询会失败

    当 INSERT 语句失败时,通常是因为超絀 Hadoop 组件的一些限制特别是 HDFS。

  • 由于可能会在 HDFS 并发打开许多文件和关联的进程插入到分区表的操作是一个费力(strenos)操作。Impala 1.1.1 包含了一些改进以哽有效的分发工作,这样每个分区使用一个节点写入值而不是没一个节点一个单独的数据文件
  • INSERT 语句中 SELECT 部分的特定表达式会产生复杂的执荇计划,并导致低效的 INSERT 操作请尽量使源表和目标表中列的数据类型匹配,例如如果必要,在源表上执行 ALTER TABLE ... REPLACE COLMNS 语句请尽量避免在 SELECT 位置使用 CASE 表达式,因为相比保持列不变或通过内置函数转换列CASE
  • 请做好准备提升你的 HDFS 配置设置中的一些限制,可以临时的在 INSERT 执行时如果你频繁运荇这些 INSERT 语句作为 ETL 管道的一部分,也可以永久修改
  • 依赖于目标表的文件格式INSERT 语句的资源使用可能会变化。插入到 Parqet 表是内存密集型操作因為每一个分区的数据会缓存到内存里,直到它达到 1G这时候数据文件才写入到硬盘。当执行 INSERT 语句时候如果查询中源表的统计信息可用,Impala 鈳以更高效的分布工作参见  了解如何采集统计信息
  • 当部署到集群中更多主机上时, Impala 性能会提升吗就像 Hadoop 性能那样?

    减少 HDFS 块大小会实现更赽的查询结果吗

    Impala 不会缓存数据,但它缓存一些表和文件的元数据尽管因为数据集被缓存到 OS 的缓冲区中,接下来的重复查询可能运行的哽快Impala 不会明确的控制这些。

    Impala 非常适合在大的数据集上为交互式探索分析执行 SQL。Hive 和 MapRedce 则适合长时间运行的、批处理的任务例如 ETL。

    Impala 是否可鉯用于复杂事件处理

    例如,在工业环境中许多客户端可能产生大量的数据。Impala 是否可用与分析这些数据发现环境中显著的变化?

    复杂倳件处理(Complex Event Processing,CEP) 通常使用专门的流处理系统处理Impala 不是流处理系统,它其实更像关系数据库

    即席查询(Ad-hoc)是 Impala 的主要使用情况。我们估计它会在许多需要低延迟的环境中使用Impala 是否适合某个特定的情况依赖于此时的负载、数据大小和查询次数。参见  了解使用 Impala 可以获得的主要益处

    Impala 与 Hive 和 Pig 鈈同,因为它使用自己的守护进程跨集群分布式进行查询。因为 Impala 不依赖于 MapRedce它避免了 MapRedce 作业的启动开销,让 Impala 能实时返回结果

    Impala 1.2 开始支持 DFs。伱可以使用 C++ 写你自己的函数或者重用已有的基于 Java 的 Hive DFs。支持的 DF 包括标量函数和用户定义聚合函数(DAs)目前不支持用户定义表函数(DTFs)。

    Impala 中的所有查询都可以在 Hive 中执行吗

    允许 Impala 查询 Hive 管理的表,不管它是存放在 HDFS 还是 HBase中都不需要额外的步骤。请确保已经正确的配置 Impala 访问 Hive metastore并且你准备好叻。请记住默认的 impalad 使用 impala 用户运行,所以你可能需要调整一些文件的权限这取决于你目前权限多么严格。

    Hive 本身是可选的并且不需要跟 Impala 咹装在同一个节点上。相比目前 Impala 支持的写(插入)操作(的文件格式)Impala 支持更多类型的读取(查询)操作;对于使用的特定的文件格式,你应当使用 Hive 姠表里插入数据参见  了解详细信息。

    Impala 可以用于生产环境吗

    Impala 已经完成了它的测试版本发布周期,1.0 GA 版本已经为生产环境做好准备而 1.1.x 系列包括了授权这一新增的安全特性,这是许多组织使用产品的重要需求一些 Clodera 客户已经为大的负载使用 Impala。

    Impala 1.2.0 版本目前是测试版因为它使用了許多仅在 CDH 5.0 测试版中可用的特性。随后的与 CDH 4 协同的 1.2.1 和 1.2.2适用于生产环境 (相比 1.2.1,更推荐 1.2.2因为 1.2.2 包含了许多针对连接查询的性能优化)。

    你可以设置代理服务器转发 Impala 服务器来回的请求,以实现负载均衡和高可用性参见  了解详细信息。

    Impala 出现错误时都发生了什么

    主机下线,Impala 会继续執行查询但不会获得状态更新。例如如果在 statestore 主机下线期间向集群添加了一台主机,运行在其他主机上的已有的 impalad 实例将不会发现这台新嘚主机一当 statestore 进程重启后,所有它提供的信息会根据所有运行的 Impala 守护进程自动重建

    Impala 表中最多允许多少行?

    没有限制一些用户已经使用 Impala 查询包含上万亿记录的表。

    Impala 和 MapRedce 作业可以在相同集群中运行而不会资源冲突吗

    关于详细的如何配置集群在 Impala 查询和 MapRedce 作业之间共享资源的例子,参见 

    Impala 应当在哪些主机上运行

    Impala 中连接如何执行?

    默认的Impala 使用基于成本的方法,根据表的总大小和行数自动确定最高效的表连接顺序(這是从 Impala 1.2.2 才开始具有的新特性)。使用 COMPTE STATS 语句采集的每一个表的统计信息是高效连接的关键Impala 连接查询在两种连接技术之间进行选择,分别是 "广播连接(broadcast joins)" 和 "分割连接(partitioned

    Impala 如何处理大表的连接查询

    Impala 采用多种策略,允许不同大小的表和结果集进行连接当一个大表与一个小表连接时,小表Φ的所有数据会传输到每一节点上以进行中间处理当连接两个大表时,其中一个表的数据被拆分成多块每一个节点只处理其中选中的塊。参见  了解连接处理的详细信息 了解性能注意事项, 了解如何微调连接策略

    Impala 的聚合策略是什么?

    Impala 元数据如何管理

    当在 Hive 中加载新数據之后,使用  语句更新这个表的元数据 语句刷新所有的元数据,以便 Impala 识别到 Hive 中创建的新表或其他 DDL 、DML 的修改

    Impala 避免使用 MapRedce。尽管 MapRedce 是一种伟大嘚通用并行处理模型具有许多优点,但是它不是专为执行 SQL 设计的Impala 在这些方面避免了 MapRedce 的低效:

  • Impala 避免了 MapRedce 启动时间的耗费。对于交互式查询MapRedce 启动时间变得非常醒目。Impala 以服务方式运行实际上没有启动时间
  • Impala 尽可能采用最新的硬件指令。Impala 使用最新的 SSE (SSE4.2) 指令集某些情况下可以提供巨大的加速效果
  • Impala 采用更好的 I/O 调度。Impala 了解块在硬盘上的位置并可以调度块处理的顺序,以便保证所有硬盘都繁忙
  • 当数据集超出可用内存时會发生什么

    目前来说,假如在某一节点上处理中间结果集所需的内存超出了这一节点上 Impala 可用的内存查询会被取消。你可以调整每一节點上 Impala 的可用内存也可以对你最大的查询微调连接策略来减少内存需求。我们计划在将来支持外部连接和排序

    但请记住,使用内存的大尛并不是跟输入数据集的大小直接相关对于聚合来说,使用的内存跟分组后的行数有关对于连接来说,使用的内存与除了最大的表之外其他所有表的大小相关并且 Impala 可以采用在每个节点之间拆分大的连接表而不是把整个表都传输到每个节点的连接策略。

    哪些是内存密集型操作

  • 使用动态分区的 INSERT 语句,插入到包含许多分区的表中(特别是使用 Parqet 格式的表这些表中每一个分区的数据都保存到内存中,直到它达箌 1 GB 并被写入到硬盘里)考虑把这样的操作分散成几个不同的 INSERT 语句,例如一次只加载一年的数据而不是一次加载所有年份的数据
  • 查询涉及到非常宽、包含上千个列的表特别是包含许多 STRING 列的表。因为 Impala 允许 STRING 值最大不超过 32 KB这些查询的中间结果集可能需要大量的内存分配
  • Impala 使用  分配內存,一款专为高并发优化的内存分频器一当 Impala 分配了内存,它保留这些内存用于将来的查询因此,空闲时显示 Impala 有很高的内存使用是很囸常的假如 Impala 检测到它将超过内存限制(通过 -mem_limit 启动选项或 MEM_LIMIT 查询选项定义),它将释放当前查询不需要的所有内存

    当通过 JDBC 或 ODBC 接口执行查询,请確保在之后调用对应的关闭方法否则,查询关联的一些内存不会释放

    Impala 目前不支持 PDATE 语句,它通常用于修改单行数据、一小组数据、或特萣的列通常 Impala 查询使用的基于 HDFS 的文件针对一次超过许多M的批量操作(blk operations)进行了优化,这使得传统的 PDATE 操作低效或不切实际

    你可以使用下面的技術来达到与熟悉的 PDATE 语句相同的目标,并为之后的查询保持高效的文件布局:

  • 使用你已经更新后并存放在其他位置的数据替换掉表或分区的铨部内容或者使用 INSERT OVERWRITE, LOAD DATA, 或者使用手工 HDFS 文件操作之后对这个表执行 REFRESH 语句。可选的你可以在 INSERT 语句中使用内置函数和表达式来转换复制的数据,僦像你通常在 PDATE 语句中所做的那样例如转换一个混合大小写的字符串为全部大写或全部小写
  • 为了更新单行数据,请使用 HBase 表并使用与原来荇相同的 key 执行 INSERT ... VALES 语句。因为 HBase 通过只返回特定键值的最新的行来处理重复的键新插入的行有效的隐藏了之前的
  • 目录服务只识别到通过 Impala 导致的變更,因此如果你通过 Hive或者通过在 HDFS 中操作文件加载数据,仍然必须使用 REFRESH 语句并且如果你在 Hive 中创建、修改表、添加或删除分区、或执行其他 DDL 操作后,必须执行 INVALIDATE METADATA 语句
  • 因为目录服务向所有节点广播 REFRESH 和 INVALIDATE METADATA 语句的结果当你仍然需要执行这些语句的时候,你可以只在其中一个节点上運行而不是在所有节点上运行,并且这些变化会被整个集群自动识别这使得可以通过任意 Impala 节点执行查询而不是总使用同一个协调器节點,更方便负载均衡
  • 为什么执行 DROP TABLE 之后空间不释放

    语句检查表是内部表还是外部表。关键字 MANAGED_TABLE 表示是内部表Impala 可以删除这些数据文件。关键芓 EXTERNAL_TABLE 表示这是外部表当你删除表时,Impala 将保持这些数据文件不变

    即使当你删除一个内部表并且文件已经从原来的位置移除,你可能也不会竝刻得到空闲的硬盘空间默认的,HDFS 中删除的文件放到特定的回收站(trashcan)目录在那里过一段时间(默认是 6 小时)后被清除。关于回收站机制的背景知识请参见 。更多关于在回收站清除文件的信息参见 。

    当 Impala 删除文件并且那些文件被移动到 HDFS 回收站,他们存放在属于 impala 用户的 HDFS 目录中假如 impala 用户没有 HDFS home 目录,在这里回收站会被创建基于安全的考虑,这些文件不会被删除和移动假如你执行了 DROP TABLE 语句,然后发现表的数据文件仍然在原来的位置请先创建 HDFS

    我怎么把一个大的 CSV 文件加载到分区表里?

    子句指定分区键列。对每一个分区这一 INSERT 操作把数据拆分成单独的數据文件。例如参见  中的例子。关于如何把数据加载到分区 Parqet 表(大批量数据的热门选择)的详细信息参见 。

    }

    // ? 这时候还不能使用this // ? 现在开始可以使用this

    高阶组件由于每次都会返回一个新的组件对于react来说,这是不利于diff和状态复用的所以高阶组件的包装不能在render 方法中进行,而呮能像上面那样在组件声明时包裹这样也就不利于动态传参。

    2、复用性强HOC为纯函数且返回值为组件,可以多层嵌套
    3、支持传入多个参數增强了适用范围
    1、当多个HOC一起使用时,无法直接判断子组件的props是哪个HOC负责传递的
    2、多个组件嵌套容易产生同样名称的props
    3、HOC可能会产生許多无用的组件,加深了组件的层级

    react的数据流是单向的最常见的就是通过props由父组件向子组件传值。

  • 父向子通信: 传入props
  • 子向父通信:父组件向子组件传一个函数然后通过这个函数的回调,拿到子组件传过来的值
  • ? 1、找一个相同的父组件既可以用props传递数据,也可以用context的方式来传递数据
    ? 2、用一些全局机制去实现通信,比如redx等

    React 合成事件(SyntheticEvent)是 React 模拟原生 DOM 事件所有能力的一个事件对象即浏览器原生事件的跨瀏览器包装器。

    为什么要使用合成事件

    1. 进行浏览器兼容,实现更好的跨平台
      React 采用的是顶层事件代理机制能够保证冒泡一致性,可以跨瀏览器执行React 提供的合成事件用来抹平不同浏览器事件对象之间的差异,将不同平台事件模拟合成事件
    2. 事件对象可能会被频繁创建和回收,因此 React 引入事件池在事件池中获取或释放事件对象。即 React 事件对象不会被释放掉而是存放进一个数组中,当事件触发就从这个数组Φ弹出,避免频繁地去创建和销毁(垃圾回收)
    3. 方便事件统一管理和事务机制

    在 React 中,“合成事件”会以事件委托方式绑定在 docment 对象上并在组件卸载(nmont)阶段自动销毁绑定的事件。

    当真实 DOM 元素触发事件会冒泡到 docment 对象后,再处理 React 事件;所以会先执行原生事件然后处理 React 事件;最後真正执行 docment 上挂载的事件。
    合成事件和原生事件最好不要混用 原生事件中如果执行了stopPropagation方法,则会导致其他React事件失效因为所有元素的事件将无法冒泡到docment上,所有的 React 事件都将无法被注册

    合成事件对象池,是 React 事件系统提供的一种性能优化方式合成事件对象在事件池统一管悝不同类型的合成事件具有不同的事件池

    在 React 中,render 执行的结果得到的并不是真正的 DOM 节点而是轻量级的 JavaScript 对象,我们称之为 virtal DOM它通过JS的Object对潒模拟DOM中的节点,然后再通过特定的render方法将其渲染成真实的DOM节点

    主要思想是,无论setState您在React事件处理程序同步生命周期方法中进行多少次調用它都将被批处理成一个更新, 最终只有一次重新渲染。

    如果没有 Virtal DOM就需要直接操作原生 DOM。在一个大型列表所有数据都变了的情况下矗接重置 innerHTML还算合理,但是只有一行数据发生变化时,它也需要重置整个 innerHTML这就造成了大量浪费。

    Virtal DOM render + diff 显然比渲染 html 字符串要慢但是它依然是純 js 层面的计算,比起后面的 DOM 操作来说依然便宜了太多。innerHTML 的总计算量不管是 js 计算还是 DOM 操作都是和整个界面的大小相关但 Virtal DOM 的计算量只有 js 计算和界面大小相关,DOM 操作是和数据的变动量相关

    3. 如果元素更新,则创建新DOM 3. 如果元素更新,则更新 JSX
    4. DOM操作代价很高。
    5. 消耗的内存较多 5. 佷少的内存消耗。

    MVVM 的性能也根据变动检测的实现原理有所不同:Anglar 依赖于脏检查;Knockot/Ve/Avalon 采用了依赖收集

    Anglar 最不效率的地方在于任何小变动都有的囷 watcher 数量相关的性能代价,当所有数据都变了的时候Anglar更有效。依赖收集在初始化和数据变化的时候都需要重新收集依赖这个代价在小量哽新的时候几乎可以忽略,但在数据量庞大的时候也会产生一定的消耗

    在比较性能的时候,要分清楚初始渲染、小量数据更新、大量数據更新这些不同的场合Virtal DOM、脏检查 MVVM、数据收集 MVVM 在不同场合各有不同的表现和不同的优化需求。Virtal DOM 为了提升小量数据更新时的性能也需要针對性的优化,比如 sholdComponentpdate 或是 immtable data

    传统 diff 算法通过循环递归对节点进行依次对比,算法复杂度达到 O(n^3)其中 n 是树中节点的总数。O(n^3) 意味着如果要展示1000个节點就要依次执行上十亿次的比较, 这是无法满足现代前端性能要求的

    diff 算法主要包括几个步骤:

  • 用 JS 对象的方式来表示 DOM 树的结构,然后根據这个对象构建出真实的 DOM 树插到文档中。
  • 当状态变更的时候重新构造一棵新的对象树。然后用新的树和旧的树进行比较记录两棵树嘚差异, 最后把所记录的差异应用到所构建的真正的DOM树上,视图更新
  • React 通过分层求异的策略,对 tree diff 进行算法优化;
  • React 通过相同类生成相似树形结構不同类生成不同树形结构的策略,对 component diff 进行算法优化;
  • React 对树进行分层比较两棵树只会对同一层次的节点进行比较。
    当发现节点已经不存在则该节点及其子节点会被完全删除掉,不会进行进一步的比较这样只需要对树进行一次遍历,便能完成整个 DOM 树的比较
    当出现节點跨层级移动时,并不会出现移动操作而是以该节点为根节点的树被重新创建,这是一种影响 React 性能的操作因此 React 官方建议不要进行 DOM 节点跨层级的操作

  • 先进行树结构的层级比较对同一个父节点下的所有子节点进行比较;
  • 接着看节点是什么类型的,是组件就做 Component Diff;
  • 注意:在开發组件时保持稳定的 DOM 结构会有助于性能的提升。例如可以通过 CSS 隐藏或显示节点,而不是真的移除或添加 DOM 节点
  • 如果是同一类型的组件,按照原策略继续比较 virtal DOM tree
  • 如果不是,则将该组件判断为 dirty component替换整个组件下的所有子节点。举个例子当一个元素从 <Article> 变成 <Comment>会触发一个完整的偅建流程。
  • 对于同一类型的组件有可能其 Virtal DOM 没有任何变化,如果能够确切的知道这点那可以节省大量的 diff 运算时间因此 React 允许用户通过 sholdComponentpdate() 来判斷该组件是否需要进行 diff。

    对于两个不同类型但结构相似的组件不会比较二者的结构,而且替换整个组件的所有内容不同类型的 component 是很少存在相似 DOM tree 的机会,因此这种极端因素很难在实现开发过程中造成重大影响的

  • INSERT_MARKP,新的 component 类型不在老集合里 即是全新的节点,需要对新节点執行插入操作
  • MOVE_EXISTING,在老集合有新 component 类型且 element 是可更新的类型,这种情况下需要做移动操作可以复用以前的 DOM 节点。
  • REMOVE_NODE老 component 类型,在新集合里也囿但对应的 element 不同则不能直接复用和更新,需要执行删除操作或者老 component 不在新集合里的,也需要执行删除操作
  • 为了解决上述问题,React 引入叻 key 属性, 对同一层级的同组子节点添加唯一 key 进行区分。

    当子元素拥有 key 时React 使用 key 来匹配原有树上的子元素以及最新树上的子元素。如果有相哃的节点无需进行节点删除和创建,只需要将老集合中节点的位置进行移动更新为新集合中节点的位置。

  • 在开发过程中尽量减少类姒将最后一个节点移动到列表首部的操作,当节点数量过大或更新操作过于频繁时在一定程度上会影响 React 的渲染性能。
  • key 不需要全局唯一泹在列表中需要保持唯一。
  • Key 应该具有稳定可预测,以及列表内唯一的特质不稳定的 key(比如通过 Math.random() 生成的)会导致许多组件实例和 DOM 节点被鈈必要地重新创建,这可能导致性能下降和子组件中的状态丢失
  • 1. 监听数据变化的实现原理不同

    Ve通过 getter/setter以及一些函数的劫持,能精确知道数據变化
    React默认是通过比较引用的方式(diff)进行的,如果不优化可能导致大量不必要的VDOM的重新渲染

    Ve1.0中可以实现两种双向绑定:父子组件之間props可以双向绑定;组件与DOM之间可以通过v-model双向绑定。
    Ve2.x中父子组件之间不能双向绑定了(但是提供了一个语法糖自动帮你通过事件的方式修改)
    React一直不支持双向绑定,提倡的是单向数据流称之为onChange/setState()模式。

    Ve组合不同功能的方式是通过mixinVe中组件是一个被包装的函数,并不简单的就是峩们定义组件的时候传入的对象或者函数
    React组合不同功能的方式是通过HoC(高阶组件)。

    4. 模板渲染方式的不同

    模板的语法不同React是通过JSX渲染模板, Ve是通过一种拓展的HTML语法进行渲染
    模板的原理不同,React通过原生JS实现模板中的常见语法比如插值,条件循环等。而Ve是在和组件JS代码汾离的单独的模板中通过指令来实现的,比如 v-if

    举个例子,说明React的好处:react中render函数是支持闭包特性的所以我们import的组件在render中可以直接调用。但是在Ve中由于模板中使用的数据都必须挂在 this 上进行一次中转,所以我们import 一个组件完了之后还需要在 components 中再声明下。

    Ve可以更快地计算出Virtal DOM嘚差异这是由于它会跟踪每一个组件的依赖关系,不需要重新渲染整个组件树
    React当状态被改变时,全部子组件都会重新渲染通过sholdComponentpdate这个苼命周期方法可以进行控制,但Ve将此视为默认的优化

    Ve本质是MVVM框架,由MVC发展而来;
    React是前端组件化框架由后端组件化发展而来。

    CDN是一组分咘在多个不同地理位置的 Web 服务器当服务器离用户越远时,延迟越高

    头部内联的样式和脚本会阻塞页面的渲染,样式放在头部并使用link方式引入脚本放在尾部并使用异步方式加载

    压缩文件可以减少文件下载时间。

    1. 响应式图片:浏览器根据屏幕大小自动加载合适的图片
    2. 降低图片质量:方法有两种,一是通过 webpack 插件 image-webpack-loader二是通过在线网站进行压缩。
  • 降低 CSS 选择器的复杂性
  • 用 JavaScript 修改样式时最好不要直接写样式,而是替换 class 来改变样式
  • 如果要对 DOM 元素执行一系列操作,可以将 DOM 元素脱离文档流修改完成后,再将它带回文档推荐使用隐藏元素(display:none)或文档誶片(DocmentFragement),都能很好的实现这个方案
  • window.reqestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动畫该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行

    index.html 设置成 no-cache这样每次请求的时候都会比对一下 index.html 文件囿没变化,如果没变化就使用缓存有变化就使用新的 index.html 文件。
    前端代码使用 webpack 打包根据文件内容生成对应的文件名,每次重新打包时只有內容发生了变化文件名才会发生变化。

  • max-age: 设置缓存存储的最大周期超过这个时间缓存被认为过期(单位秒)。在这个时间前浏览器读取文件不会发出新请求,而是直接使用缓存
  • 指定 no-cache 表示客户端可以缓存资源,每次使用缓存资源前都必须重新验证其有效性
  • 输入rl后发生了什么

    1. 建立TCP连接(三次握手);
    2. 关闭TCP连接(四次握手);

    1. DNS域名解析: 拿到服务器ip

    客户端收到你输入的域名地址后它首先去找本地的hosts文件,检查茬该文件中是否有相应的域名、IP对应关系如果有,则向其IP地址发送请求如果没有,再去找DNS服务器

    2. 建立TCP链接: 客户端链接服务器

    TCP提供叻一种可靠、面向连接、字节流、传输层的服务。对于客户端与服务器的TCP链接必然要说的就是『三次握手』。“3次握手”的作用就是双方都能明确自己和对方的收、发能力是正常的

    客户端发送一个带有SYN标志的数据包给服务端,服务端收到后回传一个带有SYN/ACK标志的数据包鉯示传达确认信息,最后客户端再回传一个带ACK标志的数据包代表握手结束,连接成功

    SYN —— 用于初如化一个连接的序列号。
    ACK —— 确认使得确认号有效。
    RST —— 重置连接
    FIN —— 该报文段的发送方已经结束向对方发送数据。

    客户端:“你好在家不。” -- SYN
    客户端:“好嘞” -- ACK

    6. 关閉TCP连接(需要4次握手)

    为了避免服务器与客户端双方的资源占用和损耗,当双方没有请求或响应传递时任意一方都可以发起关闭请求。

    關闭连接时服务器收到对方的FIN报文时,仅仅表示客户端不再发送数据了但是还能接收数据而服务器也未必全部数据都发送给客户端,所以服务器可以立即关闭也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接因此,己方ACK和FIN一般都会分开发送从而导致多了一次。

    客户端:“兄弟我这边没数据要传了,咱关闭连接吧” -- FIN + seq
    服务端:“收到,我看看我这边有木有数据了” -- ACK + seq + ack
    服务端:“兄弟,我这边也没数据要传你了咱可以关闭连接了。” - FIN + ACK + seq + ack

    浏览器需要加载解析的不仅仅是HTML还包括CSS、JS,以及还要加载图片、视频等其他媒体资源

    浏览器通过解析HTML,生成DOM树解析CSS,生成CSSOM树然后通过DOM树和CSSPOM树生成渲染树。渲染树与DOM树不同渲染树中并没有head、display为none等不必显礻的节点。

    浏览器的解析过程并非是串连进行的比如在解析CSS的同时,可以继续加载解析HTML但在解析执行JS脚本时,会停止解析后续HTML会出現阻塞问题。

    根据渲染树布局计算CSS样式,即每个节点在页面中的大小和位置等几何信息HTML默认是流式布局的,CSS和js会打破这种布局改变DOM嘚外观样式以及大小和位置。最后浏览器绘制各个节点将页面展示给用户。

    replaint:屏幕的一部分重画不影响整体布局,比如某个CSS的背景色變了但元素的几何尺寸和位置不变。

    reflow: 意味着元素的几何尺寸变了需要重新计算渲染树。

    路由是用来跟后端服务器进行交互的一种方式通过不同的路径请求不同的资源。
    路由这概念最开始是在后端出现, 在前后端不分离的时期, 由后端来控制路由, 服务器接收客户端的请求,解析对应的rl路径, 并返回对应的页面/资源

    在Ajax没有出现时期,大多数的网页都是通过直接返回 HTML用户的每次更新操作都需要重新刷新页面,忣其影响交互体验为了解决这个问题,提出了Ajax(异步加载方案), 有了 Ajax 后用户交互就不用每次都刷新页面。后来出现SPA单页应用

    SPA 中用户的交互是通过 JS 改变 HTML 内容来实现的,页面本身的 rl 并没有变化这导致了两个问题:

  • SPA 无法记住用户的操作记录,无论是刷新、前进还是后退都无法展示用户真实的期望内容。
  • SPA 中虽然由于业务的不同会有多种页面展示形式但只有一个 rl,对 SEO 不友好不方便搜索引擎进行收录。
  • 前端路甴就是为了解决上述问题而出现的

    前端路由的实现实际上是检测 rl 的变化,截获 rl 地址解析来匹配路由规则。有下面两种实现方式:

    hash 就是指 rl 后的 # 号以及后面的字符 #后面 hash 值的变化,并不会导致浏览器向服务器发出请求浏览器不发请求,也就不会刷新页面

    // 监听hash变化,点击瀏览器的前进后退会触发
     
     
    在 HTML5 之前浏览器就已经有了 history 对象。但在早期的 history 中只能用于多页面的跳转:

     
     
    直接使用无需服务端配合处理。

    Babel是代碼转换器比如将ES6转成ES5,或者将JSX转成JS等借助Babel,开发者可以提前用上新的JS特性

    实现Babel代码转换功能的核心,就是Babel插件(plgin)Babel插件一般尽可能拆成小的力度,开发者可以按需引进, 既提高了性能也提高了扩展性。比如对ES6转ES5的功能Babel官方拆成了20+个插件。开发者想要体验ES6的箭头函數特性那只需要引入transform-es2015-arrow-fnctions插件就可以,而不是加载ES6全家桶

    可以同时使用多个Plgin和Preset,此时它们的执行顺序非常重要。

    1. 多个Plgin按照声明次序顺序执行。
    2. 多个Preset按照声明次序逆序执行。

    比如.babelrc配置如下那么执行的顺序为:

    怎样开发和部署前端代码

    为了进一步提升网站性能,会把静態资源和动态网页分集群部署静态资源会被部署到CDN节点上,网页中引用的资源也会变成对应的部署路径当需要更新静态资源的时候,哃时也会更新html中的引用

    如果同时改了页面结构和样式,也更新了静态资源对应的rl地址现在要发布代码上线,是先上线页面还是先上線静态资源?

    1. 先部署页面再部署资源:在二者部署的时间间隔内,如果有用户访问页面就会在新的页面结构中加载旧的资源,并且把這个旧版本的资源当做新版本缓存起来其结果就是:用户访问到了一个样式错乱的页面,除非手动刷新否则在资源缓存过期之前,页媔会一直执行错误
    2. 先部署资源,再部署页面:在部署时间间隔之内有旧版本资源本地缓存的用户访问网站,由于请求的页面是旧版本嘚资源引用没有改变,浏览器将直接使用本地缓存这种情况下页面展现正常;但没有本地缓存或者缓存过期的用户访问网站,就会出現旧版本页面加载新版本资源的情况导致页面执行错误,但当页面完成部署这部分用户再次访问页面又会恢复正常了。

    这个奇葩问题起源于资源的 覆盖式发布,用 待发布资源 覆盖 已发布资源就有这种问题。解决它也好办就是实现 非覆盖式发布。用文件的摘要信息來对资源文件进行重命名把摘要信息放到资源文件发布路径中,这样内容有修改的资源就变成了一个新的文件发布到线上,不会覆盖巳有的资源文件上线过程中,先全量部署静态资源再灰度部署页面,整个问题就比较完美的解决了

    大公司的静态资源优化方案,基夲上要实现这么几个东西:

    1. 配置超长时间的本地缓存 —— 节省带宽提高性能
    2. 采用内容摘要作为缓存更新依据 —— 精确的缓存控制
    3. 静态资源CDN部署 —— 优化网络请求
    4. 更改资源发布路径实现非覆盖式发布 —— 平滑升级
    }

    我要回帖

    更多关于 pnext 的文章

    更多推荐

    版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

    点击添加站长微信