<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>大数据 on 庞玉栋个人博客</title><link>https://pangyd.com/categories/%E5%A4%A7%E6%95%B0%E6%8D%AE/</link><description>Recent content in 大数据 on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sat, 19 Sep 2026 18:55:19 +0800</lastBuildDate><atom:link href="https://pangyd.com/categories/%E5%A4%A7%E6%95%B0%E6%8D%AE/index.xml" rel="self" type="application/rss+xml"/><item><title>单个机柜到底能跑多少个 Agent？答案不在 GPU 身上</title><link>https://pangyd.com/post/radar-531/</link><pubDate>Sat, 19 Sep 2026 18:55:19 +0800</pubDate><guid>https://pangyd.com/post/radar-531/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>原文&lt;/strong>：&lt;a href="https://www.infoq.cn/article/brH7TRcHB9evl32KQJkY?utm_source=rss&amp;amp;utm_medium=article">单个机柜到底能跑多少个 Agent？答案不在 GPU 身上&lt;/a>&lt;/p>
&lt;p>&lt;strong>作者&lt;/strong>：李文朋&lt;/p>
&lt;p>&lt;strong>来源&lt;/strong>：InfoQ 中国（架构）&lt;/p>
&lt;/blockquote>
&lt;h2 id="正文">正文&lt;/h2>
&lt;p>过去几个月，大厂接连发布了新一代基础模型。Claude Fable 5.1、Gemini 3.8 Flash 与 GPT-6 Astra 等层出不穷。&lt;/p>
&lt;p>不难看出，这些模型几乎都在追求 Agent 的适配能力，让整个推理时间更长，工具调用更顺，决策链条也更稳。&lt;/p>
&lt;p>这也让 Agent 加速进入企业端。数据显示，2026—2027 年，中国企业场景中的活跃智能体（Agent）数量单年同比增长超 200%，到 2031 年预计可达到 3.5 亿个。&lt;/p>
&lt;p>值得注意的是，这种全民狂欢的背后，数据中心正面临巨大的挑战。&lt;/p>
&lt;p>现有数据中心基础设施，基本都是为大模型单次推理调用的吞吐量而设计的，并未真正考虑过 Agent 那种高频、突发、有状态，并且工具调用穿插其中的工作负载。&lt;/p>
&lt;p>谷歌最近的调研提出，近 83% 的企业高管认为基础设施需要为 Agent 时代重新调整。前不久，AMD 也表示 CPU 和 GPU 的配比要重新调整；8 月，AWS 和 NVIDIA 更是宣布，要联手搞下一代 AI 基础设施。&lt;/p>
&lt;p>然而，这些说法更多是围绕输入端的能力参数——比如有多少核心、多少带宽、在功率上限下能运行多少节点。&lt;/p>
&lt;p>英特尔在 8 月发布的一份白皮书中，却表明了不同的立场。英特尔提出，对数据中心进行优化的关键，并不在于提升理论参数值，而是考虑它在实际应用场景下，满足延迟承诺时，能够维持多少 Agent 的任务量。&lt;/p>
&lt;p>一句话说就是：“去计算数据中心的实际工作量，而不是理论的性能上限。”&lt;/p>
&lt;p>这是一个系统级的论点。对于还在摸索 Agent 生产到底需要什么基础设施的行业来说，不失为值得认真对待的思路。&lt;/p>
&lt;p>预告：在 9 月 22 日～23 日，英特尔将会在苏州举办 2026 年 Intel Connection 大会，会上会展示最新的 DCG 产品，以及面向企业 AI 应用落地场景的对应产品。那里或许也有行业所寻求的解决方案。&lt;/p></description></item><item><title>Grab 智能体框架 LLM-Kit 加速 AI 智能体生产部署</title><link>https://pangyd.com/post/radar-534/</link><pubDate>Sat, 19 Sep 2026 02:00:00 +0800</pubDate><guid>https://pangyd.com/post/radar-534/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>原文&lt;/strong>：&lt;a href="https://www.infoq.cn/article/AFC40lL0yaxVCDvBRFOK?utm_source=rss&amp;amp;utm_medium=article">Grab 智能体框架 LLM-Kit 加速 AI 智能体生产部署&lt;/a>&lt;/p>
&lt;p>&lt;strong>作者&lt;/strong>：作者：Hien Luu&lt;/p>
&lt;p>&lt;strong>来源&lt;/strong>：InfoQ 中国（架构）&lt;/p>
&lt;/blockquote>
&lt;h2 id="正文">正文&lt;/h2>
&lt;p>Grab 用 LLM-Kit 对 500 多个内部智能体服务进行了标准化。LLM-Kit 是一个脚手架与集成工具集，可为新建服务直接提供基础智能体执行循环，同时内置评估、链路追踪、密钥管理以及工具服务器连接能力。智能体会在运行时从 50 多个 MCP 服务器中发现可用工具，并通过统一的网关访问模型。因此，新增能力和新增模型服务商只需要进行注册或配置，不需要重新部署。&lt;/p>
&lt;p>现在，在 Grab 把一个全新的 AI 智能体服务接入生产环境大约需要 1 小时，而过去需要两周甚至更久。效率提升的关键点不在于智能体本身的推理循环，而是周围的配套系统：密钥、追踪、服务发现和评估。Grab 在一篇关于 LLM-Kit 的工程博客文章中介绍了这一变化。该框架目前为这家东南亚网约车和外卖公司的 500 多个服务提供支撑，其中包括每天被数百万商家、司机和消费者使用的智能体。文章写道：“推理循环的开发只花了一个下午，而生产环境适配封装却要两周。”&lt;/p>
&lt;p>LLM-Kit 消除的是每项服务都要单独做技术方案决策的负担。它没有被设计成一种新的智能体抽象或领域特定语言，而是围绕 Grab 已有的基础设施而搭建的脚手架。Grab 的思路发生了转变：不再逐个服务重复解决同类问题，改为集中统一一次性解决所有问题，LLM-Kit 正是在这个思路下搭建而成。工程师填写一个表单，就会得到一个 GitLab 代码库，里面是一个可运行的 FastAPI 服务，已经内置了 LangGraph Agent 模块、OpenTelemetry 追踪、Vault 密钥管理和服务发现，并且从第一次代码提交开始就带有一个评估端点，可用 ROUGE、BLEU 以及另一个模型作为评分器进行打分。&lt;/p>
&lt;p>图 1：FastAPI 服务项目目录结构（来源：Grab 博客）&lt;/p>
&lt;p>工具并不是预先绑定好的：智能体会在运行时从 50 多个已注册、支持 Model Context Protocol 的服务器中获取工具。因此，一项能力只需注册一次就能被所有智能体使用。模型服务商同样不是预先接好的。每一次模型调用都会经过兼容 OpenAI 接口的 GrabGPT Gateway。该网关前置接入了五家服务商，并注入凭证，因此应用代码永远不会硬编码某个服务商的信息。&lt;/p>
&lt;p>选择框架而不是平台，是有意为之。文章解释了原因：&lt;/p>
&lt;p>平台会将团队束缚在固化的预设方案中，而这些方案很快就会过时。采用框架的形式则可以适配开发者现有的工作方式。&lt;/p>
&lt;p>分析师 Kai Waehner 曾在今年 4 月份提出，”Agentic AI 的技术锁定比 API 锁定更持久，因为它会同时在多个层面累积。“他提到的层面包括模型、框架、运行时，以及团队基于这些组件搭建出来的开发范式。他的文章并非针对 Grab，但这个分析框架同样适用：网关覆盖的是模型层，而框架、运行时与开发范式则很难封装到单一接口背后，并且是 LLM-Kit 上所有服务共用的部分。&lt;/p></description></item><item><title>让 Agent 越用越强：AReaL 2.0 构建 Agent 在线强化学习闭环｜QCon上海</title><link>https://pangyd.com/post/radar-543/</link><pubDate>Fri, 18 Sep 2026 18:00:00 +0800</pubDate><guid>https://pangyd.com/post/radar-543/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>原文&lt;/strong>：&lt;a href="https://www.infoq.cn/article/x2FmIeCkeDYUV66BNj3g?utm_source=rss&amp;amp;utm_medium=article">让 Agent 越用越强：AReaL 2.0 构建 Agent 在线强化学习闭环｜QCon上海&lt;/a>&lt;/p>
&lt;p>&lt;strong>作者&lt;/strong>：QCon全球软件开发大会&lt;/p>
&lt;p>&lt;strong>来源&lt;/strong>：InfoQ 中国（架构）&lt;/p>
&lt;/blockquote>
&lt;h2 id="正文">正文&lt;/h2>
&lt;p>从「构建 AI」到「驾驭 AI」，100+ 实战案例拆解 AI Native 时代的工程新实践！&lt;/p>
&lt;p>推理模型持续突破能力边界，Coding Agent 深度参与研发流程，Agent Runtime、Agent Framework 快速演进……AI 正在从回答问题的模型，演变为能够自主规划、调用工具、执行任务的软件系统。AI 不再只是软件中的一个能力，而开始成为软件系统的一部分。这意味着软件工程面对的挑战也发生了变化：团队需要思考的不再只是如何训练模型、模型、部署模型 或优化 Prompt，而不是如何让具备自主能力的 AI 稳定、可信、可控地运行。模型决定 AI 能做什么，系统决定 AI 能否真正创造价值。&lt;/p>
&lt;p>在这一背景下，2026 年 QCon 全球软件开发大会大会 · 上海站正式启动。本次大会将于 10 月 22 日—24 日举办，聚焦 Harness AI 时代的工程实践，围绕 AI Native 架构、Agent Runtime、AI Infra、Data Systems、Agent 安全与可观测、Loop Engineering、Vibe Coding、具身智能与世界模型、端云协同等前沿技术方向，邀请全球技术社区与产业一线的实践者，系统性分享前沿洞察与实战经验，共同探索 AI 从能力到系统、从实验到生产的真实路径。&lt;/p>
&lt;p>香港科技大学助理教授袁彬航博士已确认出席 “AI Infra：算力效率决定规模化落地” 专题，并发表题为《让 Agent 越用越强：AReaL 2.0 构建 Agent 在线强化学习闭环》的主题分享。随着 Coding Agent、企业智能助手等 Agent 应用进入真实生产环境，如何让 Agent 在持续使用过程中不断提升能力，成为下一阶段的重要挑战。传统 Agent 系统产生的大量交互轨迹、工具调用记录和用户反馈通常仅用于日志分析，难以转化为模型能力提升的数据闭环。本次分享介绍 AReaL 2.0 如何构建面向 Agent 自演进的在线强化学习基础设施。方案通过 Agent 轨迹协议、数据代理层和演进控制平面，将真实业务交互转化为可训练、可回放、可治理的数据，并通过微服务化 Agent-Compute 架构，实现无需重构原有 Agent 即可接入 Online RL。在 Hermes Agent 和软件工程 Agent 场景中，该方案支持大规模并发环境、异步训练和持续优化，使 Agent 从“一次性执行系统”逐步演进为“持续学习系统”。&lt;/p></description></item><item><title>DualSQL: Text-to-SQL with Multi-Agent Reinforcement Learning</title><link>https://pangyd.com/post/radar-199/</link><pubDate>Wed, 16 Sep 2026 13:16:37 +0800</pubDate><guid>https://pangyd.com/post/radar-199/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>原文&lt;/strong>：&lt;a href="https://arxiv.org/abs/2609.18135v1">DualSQL: Text-to-SQL with Multi-Agent Reinforcement Learning&lt;/a>&lt;/p>
&lt;p>&lt;strong>作者&lt;/strong>：Shijie Chen, Yu Gan, Yeounoh Chung, Jiani Zhang, Quannan Li, Sravan Babu Bodapati, Cody J. Greer, Yu Su, Fatma Ozcan&lt;/p>
&lt;p>&lt;strong>来源&lt;/strong>：arXiv cs.DB（数据库）&lt;/p>
&lt;/blockquote>
&lt;h2 id="正文">正文&lt;/h2>
&lt;p>Computer Science &amp;gt; Computation and Language&lt;/p>
&lt;p>arXiv:2609.18135v1 (cs)&lt;/p>
&lt;p>[Submitted on 16 Sep 2026]&lt;/p>
&lt;p>Title:DualSQL: Text-to-SQL with Multi-Agent Reinforcement Learning&lt;/p>
&lt;p>Authors:Shijie Chen, Yu Gan, Yeounoh Chung, Jiani Zhang, Quannan Li, Sravan Babu Bodapati, Cody J. Greer, Yu Su, Fatma Ozcan&lt;/p>
&lt;p>View a PDF of the paper titled DualSQL: Text-to-SQL with Multi-Agent Reinforcement Learning, by Shijie Chen and 8 other authors&lt;/p></description></item><item><title>The Stochastic Deputy: Structural Tenant Isolation for Tool-Using LLM Agents</title><link>https://pangyd.com/post/radar-210/</link><pubDate>Mon, 14 Sep 2026 04:40:11 +0800</pubDate><guid>https://pangyd.com/post/radar-210/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>原文&lt;/strong>：&lt;a href="https://arxiv.org/abs/2609.14780v1">The Stochastic Deputy: Structural Tenant Isolation for Tool-Using LLM Agents&lt;/a>&lt;/p>
&lt;p>&lt;strong>作者&lt;/strong>：Mirza Samad Ahmed Baig, Syeda Anshrah Gillani, Asher Ali, Muhammad Hamzah Siddiqui&lt;/p>
&lt;p>&lt;strong>来源&lt;/strong>：arXiv cs.DB（数据库）&lt;/p>
&lt;/blockquote>
&lt;h2 id="正文">正文&lt;/h2>
&lt;p>Computer Science &amp;gt; Cryptography and Security&lt;/p>
&lt;p>arXiv:2609.14780v1 (cs)&lt;/p>
&lt;p>[Submitted on 13 Sep 2026]&lt;/p>
&lt;p>Title:The Stochastic Deputy: Structural Tenant Isolation for Tool-Using LLM Agents&lt;/p>
&lt;p>Authors:Mirza Samad Ahmed Baig, Syeda Anshrah Gillani, Asher Ali, Muhammad Hamzah Siddiqui&lt;/p>
&lt;p>View a PDF of the paper titled The Stochastic Deputy: Structural Tenant Isolation for Tool-Using LLM Agents, by Mirza Samad Ahmed Baig and 3 other authors&lt;/p></description></item><item><title>Natural Language Knowledge Graph Query Execution: Leveraging Controlled Semantics in the LLM Context Window</title><link>https://pangyd.com/post/radar-211/</link><pubDate>Mon, 14 Sep 2026 00:36:40 +0800</pubDate><guid>https://pangyd.com/post/radar-211/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>原文&lt;/strong>：&lt;a href="https://arxiv.org/abs/2609.14652v1">Natural Language Knowledge Graph Query Execution: Leveraging Controlled Semantics in the LLM Context Window&lt;/a>&lt;/p>
&lt;p>&lt;strong>作者&lt;/strong>：Blake G. Fitch&lt;/p>
&lt;p>&lt;strong>来源&lt;/strong>：arXiv cs.DB（数据库）&lt;/p>
&lt;/blockquote>
&lt;h2 id="正文">正文&lt;/h2>
&lt;p>Computer Science &amp;gt; Databases&lt;/p>
&lt;p>arXiv:2609.14652v1 (cs)&lt;/p>
&lt;p>[Submitted on 13 Sep 2026]&lt;/p>
&lt;p>Title:Natural Language Knowledge Graph Query Execution: Leveraging Controlled Semantics in the LLM Context Window&lt;/p>
&lt;p>Authors:Blake G. Fitch&lt;/p>
&lt;p>View a PDF of the paper titled Natural Language Knowledge Graph Query Execution: Leveraging Controlled Semantics in the LLM Context Window, by Blake G. Fitch&lt;/p></description></item><item><title>ES 增删改查操作</title><link>https://pangyd.com/post/233-es/</link><pubDate>Thu, 05 Mar 2020 22:41:24 +0800</pubDate><guid>https://pangyd.com/post/233-es/</guid><description>&lt;p>&lt;br>&lt;/p>&lt;h2 md-src-pos="12..17">创建&lt;/h2>&lt;h3 md-src-pos="18..29">自定义ID增加&lt;/h3>&lt;pre>&lt;code md-src-pos="30..92">PUT /{index}/{type}/{id}
{
 "field": "value",
 ...
}
&lt;/code>&lt;/pre>&lt;h3 md-src-pos="93..103">自动增加ID&lt;/h3>&lt;blockquote md-src-pos="104..114">&lt;p md-src-pos="106..114">使用post方式&lt;/p>&lt;/blockquote>&lt;pre>&lt;code md-src-pos="115..244">POST /website/blog/
{
 "title": "My second blog entry",
 "text": "Still trying this out...",
 "date": "2014/01/01"
}
&lt;/code>&lt;/pre>&lt;h2 md-src-pos="245..250">更新&lt;/h2>&lt;pre>&lt;code md-src-pos="251..380">PUT /website/blog/123
{
 "title": "My first blog entry",
 "text": "Just trying this out...",
 "date": "2014/01/01"
}
&lt;/code>&lt;/pre>&lt;blockquote md-src-pos="381..467">&lt;p md-src-pos="383..467">我们能看到 Elasticsearch 已经增加了 _version 字段值，created 标志设置成 false ，是因为相同的索引、类型和 ID 的文档已经存在。&lt;/p>&lt;/blockquote>&lt;h2 md-src-pos="468..473">删除&lt;/h2>&lt;pre>&lt;code md-src-pos="474..506">DELETE /website/blog/123
&lt;/code>&lt;/pre>&lt;blockquote md-src-pos="507..554">&lt;p md-src-pos="508..554">如果找到该文档，Elasticsearch 将要返回一个 200 ok 的 HTTP 响应码&lt;/p></description></item><item><title>Collections 内建集合模块</title><link>https://pangyd.com/post/231-collections/</link><pubDate>Fri, 28 Feb 2020 17:01:13 +0800</pubDate><guid>https://pangyd.com/post/231-collections/</guid><description>&lt;p>&lt;/p>&lt;p>&lt;span lang="EN-US">Collections&amp;nbsp;&lt;/span>集合类&lt;span lang="EN-US">&lt;/span>&lt;/p>&lt;h3>&lt;span lang="EN-US">namedtuple&lt;/span>&lt;/h3>&lt;p>我们知道&lt;code>&lt;span lang="EN-US">tuple&lt;/span>&lt;/code>可以表示不变集合，例如，一个点的二维坐标就可以表示成：&lt;span lang="EN-US">&lt;/span>&lt;/p>&lt;pre>&lt;span class="prompt">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; &lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">p = (&lt;/span>&lt;/code>&lt;span class="number">&lt;span lang="EN-US">1&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">, &lt;/span>&lt;/code>&lt;span class="number">&lt;span lang="EN-US">2&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">)&lt;/span>&lt;/code>&lt;/pre>&lt;p>但是，看到&lt;code>&lt;span lang="EN-US">(1, 2)&lt;/span>&lt;/code>，很难看出这个&lt;code>&lt;span lang="EN-US">tuple&lt;/span>&lt;/code>是用来表示一个坐标的。&lt;span lang="EN-US">&lt;/span>&lt;/p>&lt;p>定义一个&lt;span lang="EN-US">class&lt;/span>又小题大做了，这时，&lt;code>&lt;span lang="EN-US">namedtuple&lt;/span>&lt;/code>就派上了用场：&lt;span lang="EN-US">&lt;/span>&lt;/p>&lt;pre>&lt;span class="prompt">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; &lt;/span>&lt;/span>&lt;span class="keyword">&lt;span lang="EN-US">from&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US"> collections &lt;/span>&lt;/code>&lt;span class="keyword">&lt;span lang="EN-US">import&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US"> namedtuple&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="prompt">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; &lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">Point = namedtuple(&lt;/span>&lt;/code>&lt;span class="string">&lt;span lang="EN-US">'Point'&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">, [&lt;/span>&lt;/code>&lt;span class="string">&lt;span lang="EN-US">'x'&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">, &lt;/span>&lt;/code>&lt;span class="string">&lt;span lang="EN-US">'y'&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">])&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="prompt">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; &lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">p = Point(&lt;/span>&lt;/code>&lt;span class="number">&lt;span lang="EN-US">1&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">, &lt;/span>&lt;/code>&lt;span class="number">&lt;span lang="EN-US">2&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">)&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="prompt">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; &lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">p.x&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="number">&lt;span lang="EN-US">1&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="prompt">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; &lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">p.y&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="number">&lt;span lang="EN-US">2&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">&lt;/span>&lt;/code>&lt;/pre>&lt;p>&lt;code>&lt;span lang="EN-US">namedtuple&lt;/span>&lt;/code>是一个函数，它用来创建一个自定义的&lt;code>&lt;span lang="EN-US">tuple&lt;/span>&lt;/code>对象，并且规定了&lt;code>&lt;span lang="EN-US">tuple&lt;/span>&lt;/code>元素的个数，并可以用属性而不是索引来引用&lt;code>&lt;span lang="EN-US">tuple&lt;/span>&lt;/code>的某个元素。&lt;span lang="EN-US">&lt;/span>&lt;/p>&lt;p>这样一来，我们用&lt;code>&lt;span lang="EN-US">namedtuple&lt;/span>&lt;/code>可以很方便地定义一种数据类型，它具备&lt;span lang="EN-US">tuple&lt;/span>的不变性，又可以根据属性来引用，使用十分方便。&lt;span lang="EN-US">&lt;/span>&lt;/p>&lt;p>可以验证创建的&lt;code>&lt;span lang="EN-US">Point&lt;/span>&lt;/code>对象是&lt;code>&lt;span lang="EN-US">tuple&lt;/span>&lt;/code>的一种子类：&lt;span lang="EN-US">&lt;/span>&lt;/p>&lt;pre>&lt;span class="prompt">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; &lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">isinstance(p, Point)&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="builtin">&lt;span lang="EN-US">True&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="prompt">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; &lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">isinstance(p, tuple)&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="builtin">&lt;span lang="EN-US">True&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">&lt;/span>&lt;/code>&lt;/pre>&lt;p>类似的，如果要用坐标和半径表示一个圆，也可以用&lt;code>&lt;span lang="EN-US">namedtuple&lt;/span>&lt;/code>定义：&lt;span lang="EN-US">&lt;/span>&lt;/p>&lt;pre>&lt;span class="comment">&lt;span lang="EN-US"># namedtuple('&lt;/span>名称&lt;span lang="EN-US">', [&lt;/span>属性&lt;span lang="EN-US">list]):&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="constant">&lt;span lang="EN-US">Circle&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US"> = namedtuple(&lt;/span>&lt;/code>&lt;span class="string">&lt;span lang="EN-US">'Circle'&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">, [&lt;/span>&lt;/code>&lt;span class="string">&lt;span lang="EN-US">'x'&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">, &lt;/span>&lt;/code>&lt;span class="string">&lt;span lang="EN-US">'y'&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">, &lt;/span>&lt;/code>&lt;span class="string">&lt;span lang="EN-US">'r'&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">])&lt;/span>&lt;/code>&lt;/pre>&lt;p>&lt;span lang="EN-US">&amp;nbsp;&lt;/span>&lt;/p>&lt;p>&lt;b>&lt;span lang="EN-US">Deque&lt;/span>&lt;/b>&lt;span lang="EN-US">&amp;nbsp;&amp;nbsp;&lt;/span>双向队列&lt;span lang="EN-US">&lt;/span>&lt;/p>&lt;p>使用&lt;code>&lt;span lang="EN-US">list&lt;/span>&lt;/code>存储数据时，按索引访问元素很快，但是插入和删除元素就很慢了，因为&lt;code>&lt;span lang="EN-US">list&lt;/span>&lt;/code>是线性存储，数据量大的时候，插入和删除效率很低。&lt;span lang="EN-US">&lt;/span>&lt;/p>&lt;p>&lt;span lang="EN-US">deque&lt;/span>是为了高效实现插入和删除操作的双向列表，适合用于队列和栈：&lt;span lang="EN-US">&lt;/span>&lt;/p>&lt;p>&lt;span lang="EN-US">list&lt;/span>是线性存储，数据量大的时候，效率慢&lt;span lang="EN-US">&lt;/span>&lt;/p>&lt;p>&lt;code>&lt;span lang="EN-US">deque&lt;/span>&lt;/code>除了实现&lt;span lang="EN-US">list&lt;/span>的&lt;code>&lt;span lang="EN-US">append()&lt;/span>&lt;/code>和&lt;code>&lt;span lang="EN-US">pop()&lt;/span>&lt;/code>外，还支持&lt;code>&lt;span lang="EN-US">appendleft()&lt;/span>&lt;/code>和&lt;code>&lt;span lang="EN-US">popleft()&lt;/span>&lt;/code>，这样就可以非常高效地往头部添加或删除元素。&lt;span lang="EN-US">&lt;/span>&lt;/p>&lt;p align="left">&lt;b>&lt;span lang="EN-US">defaultdict&lt;/span>&lt;/b>&lt;/p>&lt;p align="left">使用&lt;span lang="EN-US">dict&lt;/span>时，如果引用的&lt;span lang="EN-US">Key&lt;/span>不存在，就会抛出&lt;span lang="EN-US">KeyError&lt;/span>。如果希望&lt;span lang="EN-US">key&lt;/span>不存在时，返回一个默认值，就可以用&lt;span lang="EN-US">defaultdict&lt;/span>：&lt;span lang="EN-US">&lt;/span>&lt;/p>&lt;p align="left">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; from collections import defaultdict&lt;/span>&lt;/p>&lt;p align="left">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; dd = defaultdict(lambda: 'N/A')&lt;/span>&lt;/p>&lt;p align="left">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; dd['key1'] = 'abc'&lt;/span>&lt;/p>&lt;p align="left">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; dd['key1'] # key1&lt;/span>存在&lt;span lang="EN-US">&lt;/span>&lt;/p>&lt;p align="left">&lt;span lang="EN-US">'abc'&lt;/span>&lt;/p>&lt;p align="left">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; dd['key2'] # key2&lt;/span>不存在，返回默认值&lt;span lang="EN-US">&lt;/span>&lt;/p></description></item><item><title>MongoDB笔记</title><link>https://pangyd.com/post/227-mongodb/</link><pubDate>Sat, 09 Nov 2019 11:19:19 +0800</pubDate><guid>https://pangyd.com/post/227-mongodb/</guid><description>&lt;p>&lt;b>&lt;i>MongoDB简介&lt;/i>&lt;/b>&lt;/p>&lt;p>&lt;b>MongoDB介绍&lt;/b>&lt;/p>&lt;pre data-anchor-id="8t84">&lt;code class="hljs less">&lt;span class="hljs-selector-tag">MongoDB&lt;/span>是面向文档的非关系型数据库，不是现在使用最普遍的关系型数据库，其放弃关系模型的原因就是为了获得更加方便的扩展、稳定容错等特性。面向文档的基本思路就是：将关系模型中的“行”的概念换成“文档（&lt;span class="hljs-selector-tag">document&lt;/span>）”模型。面向文档的模型可以将文档和数组内嵌到文档中。因此，实际中可以用一条数据表示非常复杂的结构。
&lt;span class="hljs-selector-tag">MongoDB&lt;/span>没有预定义模式：文档的键(key)和值(value)不再是固定的类型和大小，而且根据需求要添加或者删除字段变得更容易了。由于没有模式需要更改，通常不需要迁移大量数据。不必将所有数据都放到一个模子里面，应用层可以处理新增或丢失的键。这样开发者可以非常容易地变更数据模型。
实际应用中，随着数据量的增大，数据库都要进行扩展。扩展有纵向扩展和横向扩展。纵向扩展是使用计算能力更强的机器，也是最省力的方法，但是很容易达到物理极限，无论花多少钱也买不到最新的机器了。横向扩展就是通过分区将数据分散到更多的机器上。&lt;span class="hljs-selector-tag">MongoDB&lt;/span>的设计采用横向扩展。面向文档的数据模型使它很容易地在多台服务器之间进行数据分割。还可以自动处理跨集群的数据和负载，自动重新分配文档，以及将用户请求路由到正确的机器上。开发者根本不用考虑数据库层次的扩展问题，需要扩展数据库时，在集群中添加机器即可，&lt;span class="hljs-selector-tag">MongoDB&lt;/span>会自动处理后续的事情。
&lt;span class="hljs-selector-tag">MongoDB&lt;/span>有如上各种特性，但为了达到这些，他也放弃了关系型数据库的某些功能如表连接&lt;span class="hljs-selector-tag">join&lt;/span>和复杂的多行事务。&lt;/code>&lt;/pre>&lt;p>&lt;b>MongoDB的优势与劣势&lt;/b>&lt;/p>&lt;p>优势&lt;/p>&lt;p>快速！基于内存，将热数据存放在物理内存中（不仅仅只是索引和少部分数据），从而提高了整体速度和效率。&lt;/p>&lt;p>高扩展性！MongoDB的高可用和集群架构拥有十分高的扩展性。&lt;/p>&lt;p>自身的FailOver机制！在副本集中，当主库遇到问题，无法继续提供服务的时候，副本集将选举一个新的主库继续提供服务。&lt;/p>&lt;p>JSon格式的数据！MongoDB的Bson和JSon格式的数据十分适合文档格式的存储与查询。&lt;/p>&lt;div class="md-section-divider">&amp;nbsp;&lt;/div>&lt;p>劣势&lt;/p>&lt;p>应用经验少！由于NoSQL兴起时间短，应用经验相比关系型数据库较少。&lt;/p>&lt;p>由于以往用到的都是关系型数据库，可能会造成使用者一开始的不适应。&lt;/p>&lt;p>无事务机制！MongoDB本身没有自带事务机制，若需要在MongoDB中实现事务机制，需通过一个额外的表，从逻辑上自行实现事务。&lt;/p>&lt;p>&lt;b>MongoDB基础知识与CRUD&lt;/b>&lt;/p>&lt;p data-anchor-id="ejso">1.文档(document):相当于传统关系型数据库的“行”，但比传统行表示的信息更加复杂。例如：&lt;br>&lt;/p>&lt;p data-anchor-id="ejso">&lt;/p>&lt;pre lay-lang="Python" class="layui-code" skin="notepad">{"name":"jack","age":18,"sex":"male"}
&lt;/pre>&lt;br>&lt;p>&lt;/p>&lt;div class="md-section-divider">&lt;div class="cnblogs_Highlighter sh-gutter">&lt;/div>&lt;/div>&lt;p data-anchor-id="pz0y">2.集合(collection):这个在MongoDB中代表一组文档，类似于关系型数据库中的表。但在MongoDB中的表（就是集合）是没有模式的，你可以将完全不同的文档放入同一个集合中.但在实际使用中，为特定集合隐性规定一种模式。注：当集合里没有任何文档时集合其实也是不存在的。当第一个文档插入时，集合就会被创建。&amp;nbsp;&lt;br>3.数据库(database):在MongoDB中，一组集合可以组成一个数据库。一个MongoDB实例可以承载多个数据库。每个数据库都有独立的权限控制。在实际应用中，通常，一个应用的所有数据放置在一个数据库中。&amp;nbsp;&lt;br>4.数据类型：MongoDB中的文档类似于JSON。JSON是一种简单的数据交换格式，在数据类型方面，只支持：null，布尔，数字，字符串，数组和对象。这几种类型在某些实际应用中表现力还是不够，比如JSON本身不直接支持日期类型，对于数字，JSON本身也没法区分整数和浮点数，更不能区分32位数字和64位数字。为此，MongoDB再保留了JSON的各类特性外，又为其添加了一些数据类型。&amp;nbsp;&lt;br>1.null：用于表示空值或不存在的字段。Shell中这样表示：&lt;code>{"x"：null}&lt;/code>&amp;nbsp;&lt;br>2.布尔：有两个值，true和false。Shell中这样使用：&lt;code>{"x"：true}&lt;/code>&amp;nbsp;&lt;br>3.数字：Shell中数字均为64位浮点数，如在Shell中&lt;code>{"x"：3.14}&lt;/code>和&lt;code>{"x"：3}&lt;/code>这两个文档中的值均是64位的浮点数。&amp;nbsp;&lt;br>4.字符串：这个用的最广，Shell中这样表示：&lt;code>{"x"："hello world！"}&lt;/code>&amp;nbsp;&lt;br>5.日期：这个在数据存储时，存储的是从标准纪元开始的毫秒数，没有存储时区信息。&amp;nbsp;&lt;br>6.正则表达式：文档中可以包含正则表达式，采用JavaScript的正则表达式语法即可，Shell中这样表示：&lt;code>{"x"：/foobar/i}&lt;/code>。&lt;br>7.数组：数组是一组值，既可以表示为有序对象（列表，栈，队列等）也可以表示无序对象（集合），Shell中这样表示一个数组：&lt;code>{"things"：["pie"，3.14]}&lt;/code>。&amp;nbsp;&lt;br>8.内嵌文档：把一个文档整个作为另一个文档某一个键对应的值。&amp;nbsp;&lt;br>其他包括二进制数据，代码等。&lt;/p>&lt;h3 id="mongodb入门shell基本操作" data-anchor-id="60is">MongoDB入门(Shell基本操作)&lt;/h3>&lt;p>&lt;span>shell是一个功能完备的JavaScript解释器，可运行任意的JavaScript程序。这里不做示例。&amp;nbsp;&lt;/span>&lt;br>&lt;span>MongoDB的默认数据库为"db"，该数据库存储在data目录中。&amp;nbsp;&lt;/span>&lt;br>&lt;span>1.选择数据库&lt;/span>&lt;/p>&lt;p>&lt;/p>&lt;pre lay-lang="Python" class="layui-code" skin="notepad">#选择名test数据库
use tset&lt;/pre>&lt;p>&lt;span>如果忘记了数据库名称可以输入如下代码查询所有数据库名称："show dbs" 命令可以显示所有数据的列表&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">show dbs&lt;/pre>&lt;p data-anchor-id="5h1c">查看数据库中的集合名：&lt;/p>&lt;div>&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">show collections&lt;/pre>&lt;p>&lt;span>下表列出了 RDBMS 与 MongoDB 对应的术语：&amp;nbsp;&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;img src="https://pangyd.com/uploads/2019/05/ebe16666a468bd09.png" alt="2017-05-17_170031.png">&lt;br>&lt;/span>&lt;/p>&lt;h3 id="插入文档" data-anchor-id="3jei">插入文档&lt;/h3>&lt;/div>&lt;p>&lt;/p>&lt;p data-anchor-id="hbt8">insert函数可将一个文档插入到集合中去。以一个博客举例。先创建一个叫post的变量(JavaScript对象)有三个键和对应的属性。插入代码：&lt;/p>&lt;p data-anchor-id="hbt8">&lt;/p>&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">db.blog.insert(post)&lt;/pre>&lt;p>&lt;span>批量插入&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">db.blog.insertMany([{"_id":0},{"_id":1},{"_id":2}])&lt;/pre>&lt;h3 id="查询文档" data-anchor-id="6u2w">查询文档&lt;/h3>&lt;p>&lt;/p>&lt;p data-anchor-id="p2pt">查询代码如下：&lt;/p>&lt;p data-anchor-id="p2pt">&lt;/p>&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">db.blog.find()&lt;/pre>&lt;p>&lt;span>多出来的"_id"就是MongoDB自动创建的默认为ObjectID类型的对象。在一个集合里，每个文档都由唯一的"_id",确保集合中的每个文档都能被唯一标识，它采用12字节的存储空间，由24个16进制数字组成。&lt;/span>&lt;/p>&lt;p>&lt;span>如果插入文档时没有"_id"键，系统会为我们自动创建一个。&amp;nbsp;&lt;/span>&lt;br>&lt;/p>&lt;p>&lt;span>若只想查看一个文档，可以用findOne：&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p></description></item><item><title>爬取斗图网表情包</title><link>https://pangyd.com/post/223/</link><pubDate>Sat, 12 Oct 2019 20:59:15 +0800</pubDate><guid>https://pangyd.com/post/223/</guid><description>&lt;pre lay-lang="Python" class="layui-code" skin="notepad">#需要安装的库：requests lxml
import requests
import re
from lxml.html import etree
import os
import time
#伪装头
headers = {
 'referer': 'https://www.doutula.com/article/list/?page=3',
 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3783.0 Safari/537.36'
}
#先爬取100个页面
for s in range(1,100):
 url = 'https://www.doutula.com/article/list/?page={}'.format(s)
 try:
 res = requests.get(url,headers=headers)
 except Exception as e:
 continue
 csc = etree.HTML(res.text)
 ds = {}
 #解析出来每个页面的表情包标题和网址添加到ds字典
 for i in csc.xpath('//*[@id="home"]/div/div[2]//a'):
 if i.xpath('@href')[0][0:4]=='http':
 ds[i.xpath('div[1]/text()')[0]] = i.xpath('@href')[0]
 #循环字典，并在指定目录创建文件夹，存放表情包
 for a,b in ds.items():
 file_path = '/Users/pyd/Documents/BigData/gs2/doutu/{}'.format(a)
 if not os.path.exists(file_path):
 os.mkdir(file_path)
 else:
 continue
 try:
 cbv = requests.get(b,headers=headers,timeout=5)
 except Exception as e:
 continue
&lt;p>&lt;/p></description></item><item><title>SQLAlchemy_定义(一对一/一对多/多对多)关系</title><link>https://pangyd.com/post/222-sqlalchemy/</link><pubDate>Tue, 08 Oct 2019 10:32:05 +0800</pubDate><guid>https://pangyd.com/post/222-sqlalchemy/</guid><description>&lt;p>Basic Relationship Patterns&lt;/p>&lt;p>基本关系模式&lt;/p>&lt;p>The imports used for each of the following sections is as follows:&lt;/p>&lt;p>下列的 import 语句，应用到接下来所有的代章节中：&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>from sqlalchemy import Table, Column, Integer, ForeignKey&lt;/p>&lt;p>from sqlalchemy.orm import relationship&lt;/p>&lt;p>from sqlalchemy.ext.declarative import declarative_base&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>Base = declarative_base()&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>One To Many&lt;/p>&lt;p>A one to many relationship places a foreign key on the child table referencing the parent.&lt;/p>&lt;p>表示一对多的关系时，在子表类中通过 foreign key (外键)引用父表类。&lt;/p>&lt;p>relationship() is then specified on the parent, as referencing a collection of items represented by the child:&lt;/p></description></item><item><title>flask-sqlalchemy 使用详解</title><link>https://pangyd.com/post/221-flask-sqlalchemy/</link><pubDate>Thu, 03 Oct 2019 19:47:58 +0800</pubDate><guid>https://pangyd.com/post/221-flask-sqlalchemy/</guid><description>&lt;h2 id="一-安装">一. 安装&lt;/h2>&lt;pre class="has" name="code">&lt;code class="hljs sql">$ pip &lt;span class="hljs-keyword">install&lt;/span> flask-sqlalchemy
&lt;/code>&lt;/pre>&lt;h2 id="二-配置">&lt;a name="t1">&lt;/a>二. 配置&lt;/h2>&lt;p>配置选项列表 :&lt;/p>&lt;div class="table-box">&lt;table class="layui-table">&lt;thead>&lt;tr>&lt;th style="text-align: left">选项&lt;/th>&lt;th style="text-align: left">说明&lt;/th>&lt;/tr>&lt;/thead>&lt;tbody>&lt;tr>&lt;td>SQLALCHEMY_DATABASE_URI&lt;/td>&lt;td>用于连接的数据库 URI 。例如:sqlite:////tmp/test.db 或 mysql://username:password@server/db&lt;/td>&lt;/tr>&lt;tr>&lt;td>SQLALCHEMY_BINDS&lt;/td>&lt;td>一个映射 binds 到连接 URI 的字典。更多 binds 的信息见 用 Binds 操作多个数据库 。&lt;/td>&lt;/tr>&lt;tr>&lt;td>SQLALCHEMY_ECHO&lt;/td>&lt;td>如果设置为 Ture ， SQLAlchemy 会记录所有 发给 stderr 的语句，这对调试有用。&lt;/td>&lt;/tr>&lt;tr>&lt;td>SQLALCHEMY_RECORD_QUERIES&lt;/td>&lt;td>可以用于显式地禁用或启用查询记录。查询记录 在调试或测试模式自动启用。更多信息见 get_debug_queries() 。&lt;/td>&lt;/tr>&lt;/tbody>&lt;/table>&lt;/div>&lt;p>SQLALCHEMY_NATIVE_UNICODE | 可以用于显式禁用原生 unicode 支持。当使用 不合适的指定无编码的数据库默认值时，这对于 一些数据库适配器是必须的（比如 Ubuntu 上某些版本的 PostgreSQL ）。|&lt;br>| SQLALCHEMY_POOL_SIZE | 数据库连接池的大小。默认是引擎默认值（通常 是 5 ） |&lt;br>| SQLALCHEMY_POOL_TIMEOUT | 设定连接池的连接超时时间。默认是 10 。 |&lt;br>| SQLALCHEMY_POOL_RECYCLE | 多少秒后自动回收连接。这对 MySQL 是必要的， 它默认移除闲置多于 8 小时的连接。注意如果 使用了 MySQL ， Flask-SQLALchemy 自动设定这个值为 2 小时。|&lt;/p></description></item><item><title>Flume配置文件详解</title><link>https://pangyd.com/post/220-flume/</link><pubDate>Wed, 24 Jul 2019 09:26:42 +0800</pubDate><guid>https://pangyd.com/post/220-flume/</guid><description>&lt;p>一、source配置&lt;/p>&lt;p>1、netcat的source：bind指定IP，port指定port&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p># Describe/configure the source&lt;/p>&lt;p>a1.sources.r1.type = netcat&lt;/p>&lt;p>a1.sources.r1.bind = localhost&lt;/p>&lt;p>a1.sources.r1.port = 44444&lt;/p>&lt;p>2、读文件exec：commd中写命令，如果用tail的话记得用大写的F&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p># Describe/configure the source&lt;/p>&lt;p>a1.sources.r1.type = exec&lt;/p>&lt;p>a1.sources.r1.command = tail -F /opt/module/hive/logs/hive.log&lt;/p>&lt;p>a1.sources.r1.shell = /bin/bash -c&lt;/p>&lt;p>3、读取文件夹source：spooldir source ，tmp记得一定要忽略&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p># Describe/configure the source&lt;/p>&lt;p>a1.sources.r1.type = spooldir&lt;/p>&lt;p># 指定文件夹&lt;/p>&lt;p>a1.sources.r1.spoolDir = /opt/module/flume/upload&lt;/p>&lt;p>#指定文件上传后的后缀&lt;/p>&lt;p>a1.sources.r1.fileSuffix = .COMPLETED&lt;/p>&lt;p>a1.sources.r1.fileHeader = true&lt;/p>&lt;p>#忽略所有以.tmp结尾的文件，不上传&lt;/p>&lt;p>a1.sources.r1.ignorePattern = ([^ ]*\.tmp)&lt;/p>&lt;p>4、最常用的source: arvo模式，bind指的是接收的主机，port不是随意的，是看sink给的端口&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p># Describe/configure the source&lt;/p>&lt;p>a1.sources.r1.type = avro&lt;/p></description></item><item><title>Flume采集数据时在HDFS上产生大量小文件的问题</title><link>https://pangyd.com/post/219-flumehdfs/</link><pubDate>Tue, 23 Jul 2019 09:15:03 +0800</pubDate><guid>https://pangyd.com/post/219-flumehdfs/</guid><description>&lt;p>在配置flume配置文件的时候，配置了滚动时间和最大字节数，但是在写入到hdfs的时候，其实是不按滚动时间去自动滚动的。&lt;/p>&lt;p>&lt;span>设置a1.sinks.k1.hdfs.minBlockReplicas=1。因为文件会因为所在块的复制而滚动文件。&amp;nbsp;&amp;nbsp;&lt;/span>&lt;/p>&lt;p>&lt;span>或者&lt;/span>&lt;/p>&lt;p>去掉round时间系列参数，并将rollSize和rollCount置0，表示不根据临时文件大小和event数量来滚动文件（滚动文件即指将HDFS上生成的以.tmp结尾的临时文件转换为实际存储文件）。当然，也可以调大rollSize参数（如调至100000000,表示100MB滚动文件，单位是bytes）。&lt;/p></description></item><item><title>flask传递列表等到jinja2模版的时候出现'；</title><link>https://pangyd.com/post/218-flaskjinja2/</link><pubDate>Fri, 19 Jul 2019 09:09:34 +0800</pubDate><guid>https://pangyd.com/post/218-flaskjinja2/</guid><description>&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">{% for i in connect.d %}
 "{{i[0]}}",
{% endfor %}#

#可以使用循环读取每一条数据&lt;/pre></description></item><item><title>在Hadoop HDFS NameNode web端中下载文件会重定向到localhost:50075</title><link>https://pangyd.com/post/215-hadoop-hdfs-namenode-weblocalhost-50075/</link><pubDate>Wed, 10 Jul 2019 08:46:58 +0800</pubDate><guid>https://pangyd.com/post/215-hadoop-hdfs-namenode-weblocalhost-50075/</guid><description>&lt;p>host文件在错误的IP地址上指定，则获取并报告环回适配器的地址。因此需要检查一下几项&lt;/p>&lt;p>1.检查hosts文件，确认127.0.0.1对应的是 localhost&lt;/p>&lt;p>2.检查&lt;span>HDFS-site.xml中dfs.name.rpc-address和dfs.datanode.http.address中配置的主机名是否和/etc/hostname中的主机名对应&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p></description></item><item><title>Hadoop 当中 Datanode节点不启动的解决办法</title><link>https://pangyd.com/post/214-hadoop-datanode/</link><pubDate>Sat, 06 Jul 2019 08:35:41 +0800</pubDate><guid>https://pangyd.com/post/214-hadoop-datanode/</guid><description>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;/p>&lt;p>&lt;/p>&lt;pre lay-lang="HTML" class="layui-code" skin="notepad">2019-03-28 08:31:49,347 WARN org.apache.hadoop.hdfs.server.common.Storage: Failed to add storage directory [DISK]file:/opt/hadoop-repo/data/
java.io.IOException: Incompatible clusterIDs in /opt/hadoop-repo/data: namenode clusterID = CID-50b8afea-9e44-4363-970d-4a40917d968a; datanode clusterID = CID-865e7596-297e-4d6a-a997-afec3be712e9
	at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:777)
	at org.apache.hadoop.hdfs.server.datanode.DataStorage.loadStorageDirectory(DataStorage.java:300)
	at org.apache.hadoop.hdfs.server.datanode.DataStorage.loadDataStorage(DataStorage.java:416)
	at org.apache.hadoop.hdfs.server.datanode.DataStorage.addStorageLocations(DataStorage.java:395)
	at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:573)
	at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:1393)
	at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:1358)
	at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:313)
	at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:216)
	at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:637)
	at java.lang.Thread.run(Thread.java:748)&lt;/pre>&lt;p>直接删除数据节点DataNode的current文件夹，即可启动&lt;/p>&lt;p>&lt;/p>&lt;p>&lt;/p></description></item><item><title>re正则模块详解</title><link>https://pangyd.com/post/206-re/</link><pubDate>Wed, 07 Nov 2018 08:10:45 +0800</pubDate><guid>https://pangyd.com/post/206-re/</guid><description>&lt;p>re正则表达式是一种工具，和其他工具一样，它是人们为了解决某一类专门的问题而发明的。想要理解正则表达式及其功用。最好的办法是了解他们可以解决什么样的问题&lt;/p>&lt;p>正则表达式的主要用途之一是搜索变化多端的文本，比如，搜索以http开头的 以句号等空白字结尾的字符串&amp;nbsp;&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;/p>&lt;pre lay-lang="Python" class="layui-code" skin="notepad">import re
&lt;p>text = &amp;ldquo;The Attila the Hun Show&amp;rdquo;&lt;/p>
&lt;h1 id="a-single-character-单个字符">a single character 单个字符&lt;/h1>
&lt;p>m = re.match(&amp;quot;.&amp;quot;, text)
if m: print repr(&amp;quot;.&amp;quot;), &amp;ldquo;=&amp;gt;&amp;rdquo;, repr(m.group(0))&lt;/p>
&lt;h1 id="any-string-of-characters-任何字符串">any string of characters 任何字符串&lt;/h1>
&lt;p>m = re.match(&amp;quot;.&lt;em>&amp;quot;, text)
if m: print repr(&amp;quot;.&lt;/em>&amp;quot;), &amp;ldquo;=&amp;gt;&amp;rdquo;, repr(m.group(0))&lt;/p>
&lt;h1 id="a-string-of-letters-at-least-one-只包含字母的字符串至少一个">a string of letters (at least one) 只包含字母的字符串(至少一个)&lt;/h1>
&lt;p>m = re.match(&amp;quot;\w+&amp;quot;, text)
if m: print repr(&amp;quot;\w+&amp;quot;), &amp;ldquo;=&amp;gt;&amp;rdquo;, repr(m.group(0))&lt;/p>
&lt;h1 id="a-string-of-digits-只包含数字的字符串">a string of digits 只包含数字的字符串&lt;/h1>
&lt;p>m = re.match(&amp;quot;\d+&amp;quot;, text)
if m: print repr(&amp;quot;\d+&amp;quot;), &amp;ldquo;=&amp;gt;&amp;rdquo;, repr(m.group(0))&lt;/p></description></item><item><title>Collections 内建集合模块</title><link>https://pangyd.com/post/199-collections/</link><pubDate>Sat, 29 Sep 2018 08:49:45 +0800</pubDate><guid>https://pangyd.com/post/199-collections/</guid><description>&lt;p>
&lt;/p>&lt;p>&lt;span lang="EN-US">Collections &lt;/span>集合类&lt;span lang="EN-US">&lt;/span>&lt;/p>
&lt;h3>&lt;span lang="EN-US">namedtuple&lt;/span>&lt;/h3>
&lt;p>我们知道&lt;code>&lt;span lang="EN-US">tuple&lt;/span>&lt;/code>可以表示不变集合，例如，一个点的二维坐标就可以表示成：&lt;span lang="EN-US">&lt;/span>&lt;/p>
&lt;pre>&lt;span class="prompt">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; &lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">p = (&lt;/span>&lt;/code>&lt;span class="number">&lt;span lang="EN-US">1&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">, &lt;/span>&lt;/code>&lt;span class="number">&lt;span lang="EN-US">2&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">)&lt;/span>&lt;/code>&lt;/pre>
&lt;p>但是，看到&lt;code>&lt;span lang="EN-US">(1, 2)&lt;/span>&lt;/code>，很难看出这个&lt;code>&lt;span lang="EN-US">tuple&lt;/span>&lt;/code>是用来表示一个坐标的。&lt;span lang="EN-US">&lt;/span>&lt;/p>
&lt;p>定义一个&lt;span lang="EN-US">class&lt;/span>又小题大做了，这时，&lt;code>&lt;span lang="EN-US">namedtuple&lt;/span>&lt;/code>就派上了用场：&lt;span lang="EN-US">&lt;/span>&lt;/p>
&lt;pre>&lt;span class="prompt">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; &lt;/span>&lt;/span>&lt;span class="keyword">&lt;span lang="EN-US">from&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US"> collections &lt;/span>&lt;/code>&lt;span class="keyword">&lt;span lang="EN-US">import&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US"> namedtuple&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="prompt">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; &lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">Point = namedtuple(&lt;/span>&lt;/code>&lt;span class="string">&lt;span lang="EN-US">'Point'&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">, [&lt;/span>&lt;/code>&lt;span class="string">&lt;span lang="EN-US">'x'&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">, &lt;/span>&lt;/code>&lt;span class="string">&lt;span lang="EN-US">'y'&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">])&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="prompt">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; &lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">p = Point(&lt;/span>&lt;/code>&lt;span class="number">&lt;span lang="EN-US">1&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">, &lt;/span>&lt;/code>&lt;span class="number">&lt;span lang="EN-US">2&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">)&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="prompt">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; &lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">p.x&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="number">&lt;span lang="EN-US">1&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="prompt">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; &lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">p.y&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="number">&lt;span lang="EN-US">2&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">&lt;/span>&lt;/code>&lt;/pre>
&lt;p>&lt;code>&lt;span lang="EN-US">namedtuple&lt;/span>&lt;/code>是一个函数，它用来创建一个自定义的&lt;code>&lt;span lang="EN-US">tuple&lt;/span>&lt;/code>对象，并且规定了&lt;code>&lt;span lang="EN-US">tuple&lt;/span>&lt;/code>元素的个数，并可以用属性而不是索引来引用&lt;code>&lt;span lang="EN-US">tuple&lt;/span>&lt;/code>的某个元素。&lt;span lang="EN-US">&lt;/span>&lt;/p>
&lt;p>这样一来，我们用&lt;code>&lt;span lang="EN-US">namedtuple&lt;/span>&lt;/code>可以很方便地定义一种数据类型，它具备&lt;span lang="EN-US">tuple&lt;/span>的不变性，又可以根据属性来引用，使用十分方便。&lt;span lang="EN-US">&lt;/span>&lt;/p>
&lt;p>可以验证创建的&lt;code>&lt;span lang="EN-US">Point&lt;/span>&lt;/code>对象是&lt;code>&lt;span lang="EN-US">tuple&lt;/span>&lt;/code>的一种子类：&lt;span lang="EN-US">&lt;/span>&lt;/p>
&lt;pre>&lt;span class="prompt">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; &lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">isinstance(p, Point)&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="builtin">&lt;span lang="EN-US">True&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="prompt">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; &lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">isinstance(p, tuple)&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="builtin">&lt;span lang="EN-US">True&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">&lt;/span>&lt;/code>&lt;/pre>
&lt;p>类似的，如果要用坐标和半径表示一个圆，也可以用&lt;code>&lt;span lang="EN-US">namedtuple&lt;/span>&lt;/code>定义：&lt;span lang="EN-US">&lt;/span>&lt;/p>
&lt;pre>&lt;span class="comment">&lt;span lang="EN-US"># namedtuple('&lt;/span>名称&lt;span lang="EN-US">', [&lt;/span>属性&lt;span lang="EN-US">list]):&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">&lt;/span>&lt;/code>&lt;/pre>&lt;pre>&lt;span class="constant">&lt;span lang="EN-US">Circle&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US"> = namedtuple(&lt;/span>&lt;/code>&lt;span class="string">&lt;span lang="EN-US">'Circle'&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">, [&lt;/span>&lt;/code>&lt;span class="string">&lt;span lang="EN-US">'x'&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">, &lt;/span>&lt;/code>&lt;span class="string">&lt;span lang="EN-US">'y'&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">, &lt;/span>&lt;/code>&lt;span class="string">&lt;span lang="EN-US">'r'&lt;/span>&lt;/span>&lt;code>&lt;span lang="EN-US">])&lt;/span>&lt;/code>&lt;/pre>
&lt;p>&lt;span lang="EN-US">&amp;nbsp;&lt;/span>&lt;/p>
&lt;p>&lt;b>&lt;span lang="EN-US">Deque&lt;/span>&lt;/b>&lt;span lang="EN-US">&lt;span>&amp;nbsp; &lt;/span>&lt;/span>双向队列&lt;span lang="EN-US">&lt;/span>&lt;/p>
&lt;p>使用&lt;code>&lt;span lang="EN-US">list&lt;/span>&lt;/code>存储数据时，按索引访问元素很快，但是插入和删除元素就很慢了，因为&lt;code>&lt;span lang="EN-US">list&lt;/span>&lt;/code>是线性存储，数据量大的时候，插入和删除效率很低。&lt;span lang="EN-US">&lt;/span>&lt;/p>
&lt;p>&lt;span lang="EN-US">deque&lt;/span>是为了高效实现插入和删除操作的双向列表，适合用于队列和栈：&lt;span lang="EN-US">&lt;/span>&lt;/p>
&lt;p>&lt;span lang="EN-US">list&lt;/span>是线性存储，数据量大的时候，效率慢&lt;span lang="EN-US">&lt;/span>&lt;/p>
&lt;p>&lt;code>&lt;span lang="EN-US">deque&lt;/span>&lt;/code>除了实现&lt;span lang="EN-US">list&lt;/span>的&lt;code>&lt;span lang="EN-US">append()&lt;/span>&lt;/code>和&lt;code>&lt;span lang="EN-US">pop()&lt;/span>&lt;/code>外，还支持&lt;code>&lt;span lang="EN-US">appendleft()&lt;/span>&lt;/code>和&lt;code>&lt;span lang="EN-US">popleft()&lt;/span>&lt;/code>，这样就可以非常高效地往头部添加或删除元素。&lt;span lang="EN-US">&lt;/span>&lt;/p>
&lt;p style="text-align: left" align="left">&lt;b>&lt;span lang="EN-US">defaultdict&lt;/span>&lt;/b>&lt;/p>
&lt;p style="text-align: left" align="left">&lt;span>使用&lt;span lang="EN-US">dict&lt;/span>时，如果引用的&lt;span lang="EN-US">Key&lt;/span>不存在，就会抛出&lt;span lang="EN-US">KeyError&lt;/span>。如果希望&lt;span lang="EN-US">key&lt;/span>不存在时，返回一个默认值，就可以用&lt;span lang="EN-US">defaultdict&lt;/span>：&lt;span lang="EN-US">&lt;/span>&lt;/span>&lt;/p>
&lt;p style="text-align: left" align="left">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; from collections import defaultdict&lt;/span>&lt;/p>
&lt;p style="text-align: left" align="left">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; dd = defaultdict(lambda: 'N/A')&lt;/span>&lt;/p>
&lt;p style="text-align: left" align="left">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; dd['key1'] = 'abc'&lt;/span>&lt;/p>
&lt;p style="text-align: left" align="left">&lt;span lang="EN-US">&amp;gt;&amp;gt;&amp;gt; dd['key1'] # key1&lt;/span>&lt;span>存在&lt;span lang="EN-US">&lt;/span>&lt;/span>&lt;/p></description></item></channel></rss>