<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/css" href="/css/feed.min.862ab8f8bb15f1f3203a5b9e6a474b6fcd7e7137c22209e346175b0856acfd97.css"?><rss data-theme="dark" data-theme-default="dark" version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:h="http://www.w3.org/1999/xhtml"><channel><title>TiSpark · atman · ihx.cc | AirPlan - A biger solution</title><link>https://atman.ihx.cc/tags/tispark/</link><description>君子不器，日日自新。一處關於技術、生活與自我探索的行記。</description><language>zh-CN</language><generator>Hugo</generator><copyright>DataBase - Atman as @man</copyright><lastBuildDate>Mon, 16 Apr 2018 00:00:00 +0800</lastBuildDate><atom:link href="https://atman.ihx.cc/tags/tispark/index.xml" rel="self" type="application/rss+xml"/><h:script src="/js/theme.min.e9b6d7597dde98fbf1181117d7e72cec3c16ab35de5b3f3bdb17dbd866e0c62c.js" type="text/javascript" defer="defer"/><h:header class="feed-header"><h:nav><h:a href="https://atman.ihx.cc/">首页</h:a><h:a href="https://atman.ihx.cc/archive/">Archive</h:a><h:button id="theme-toggle" class="feed-theme-toggle" type="button" aria-label="暗色模式" aria-pressed="true" title="切换亮暗风格">亮 / 暗</h:button></h:nav><h:p class="feed-eyebrow">RSS / 全文订阅</h:p><h:h1>TiSpark · atman · ihx.cc | AirPlan - A biger solution</h:h1><h:p>将下面的地址粘贴到 RSS 阅读器，即可订阅更新。这里展示最近 1 篇文章的摘要，阅读器中可阅读文章全文。</h:p><h:a class="feed-address" href="https://atman.ihx.cc/tags/tispark/index.xml">https://atman.ihx.cc/tags/tispark/index.xml</h:a><h:p class="feed-note">包含 post 和 look 中的文章 · 按发布时间倒序</h:p></h:header><item><title>AP - TiSpark 服务安装 部署 测试</title><link>https://atman.ihx.cc/post/20180416-tispark-deploy/</link><guid isPermaLink="true">https://atman.ihx.cc/post/20180416-tispark-deploy/</guid><pubDate>Mon, 16 Apr 2018 00:00:00 +0800</pubDate><dc:creator>Atman</dc:creator><category>Deploy</category><category>Zeppelin</category><category>TiSpark</category><description>0x00 介绍 TiSpark 项目 2020 年会被姊妹家 TiFlash 升级替换 pingcap/TiSpark 项目地址，使用前阅读以下文档 TiSpark 用户指南（英文版本） 官方 Blog TiSpark 文档 0x01 部署 TiSpark …</description><content:encoded><![CDATA[<h2 id="0x00-介绍">0x00 介绍</h2>
<blockquote>
<p>TiSpark 项目 2020 年会被姊妹家 TiFlash 升级替换</p>
</blockquote>
<ul>
<li><a href="https://github.com/pingcap/tispark">pingcap/TiSpark</a> 项目地址，使用前阅读以下文档
<ul>
<li><a href="https://github.com/pingcap/tispark/blob/master/docs/userguide.md">TiSpark 用户指南（英文版本）</a></li>
<li>官方 Blog <a href="https://pingcap.com/blog-cn/#TiSpark">TiSpark 文档</a></li>
</ul>
</li>
</ul>
<p><img src="https://raw.githubusercontent.com/pingcap/tispark/master/docs/architecture.png" alt="spark" title="tispark 架构图 docs.tidb.cc" loading="lazy" decoding="async">
</p>
<h2 id="0x01-部署-tispark">0x01 部署 TiSpark</h2>
<h3 id="前情提要">前情提要</h3>
<ul>
<li><code>tidb-ansible/roles/local/templates/binary_packages.yml.j2</code> 下载连接
<ul>
<li>此处为 tispark 下载连接，jar 包下载 <a href="http://download.pingcap.org/tispark-SNAPSHOT-jar-with-dependencies.jar">传送门</a></li>
</ul>
</li>
<li><code>tidb-ansible/conf/spark-defaults.yml</code>
<ul>
<li>tispark 配置文件信息，文件配置示例 <a href="https://github.com/pingcap/tidb-ansible/blob/master/conf/spark-defaults.yml">Github</a> 格式为 <code>key: value</code></li>
</ul>
</li>
<li><code>tidb-ansible/roles/tispark/tasks/main.yml</code>
<ul>
<li>此处为 tispark 安装步骤</li>
</ul>
</li>
</ul>
<h3 id="部署准备">部署准备</h3>
<ul>
<li>确定目标节点已经安装 java 1.8 以上版本
<ul>
<li>在目标节点执行 <code>java -version</code> 查看</li>
</ul>
</li>
<li>修改 inventory.ini 文件
<ul>
<li>
<p>spark_master 与 spark_slaves 为空时，默认安装在第一台 tidb <code>{{deploy}}/spark</code> 目录下，该安装模式为 standalone</p>
</li>
<li>
<p>以下为 spark 安装示例，非 standalone 模式</p>
</li>
<li>
<p>spark 默认安装为 standalone cluster</p>
</li>
<li>
<p>spark standalone cluster 模式下，master 不参与实际数据处理工作</p>
<pre><code class="language-mysql" data-lang="mysql">[spark_master]
spark-master ansible_host=172.16.10.64  deploy_dir=/data3/deploysparkmaster
# 手动指定 spark deploy dir 时，名字请勿以 `spark` 或者 `spark-` 开头
# 第一次安装失败或者中断后，请删除每个节点上的 spark 目录(包含 spark 本级)，然后重新执行 ansible-playbook deploy.yml

[spark_slaves]
spark-64 ansible_host=172.16.10.64  deploy_dir=/data3/deploy
# 单机部署 master + slave 并不会造成端口冲突 / 可以有效复用计算资源
spark-65 ansible_host=172.16.10.65  deploy_dir=/data3/deploy
spark-66 ansible_host=172.16.10.66  deploy_dir=/data3/deploy
</code></pre></li>
</ul>
</li>
</ul>
<blockquote>
<p>注意：以下参数中有部分参数需要新版本才能使用 (2018 年 6 月之后的版本)
最新 spark 参数请关注 <a href="https://github.com/pingcap/tidb-ansible/blob/master/conf/spark-defaults.yml">spark-default.yml</a></p>
</blockquote>
<ul>
<li>
<p>TiSpark 配置文件参数说明，按实际需求进行修改 <code>tidb-ansible/conf/spark-defaults.yml</code></p>
<ul>
<li>
<p>已经安装 Spark ，修改 <code>{{deploy}}/spark/conf/spark-defaults.conf</code> （可使用默认配置）</p>
<pre><code class="language-fallback" data-lang="fallback">spark.tispark.table.scan_split_factor 2
# 每个 Region 被切割成多少块，比如 8 就是说一个 Region 切 8 块；默认一个 Region 一个块
spark.tispark.task_per_split 4
# 每个 Spark  Task 使用多少并发量去并行读取块
spark.locality.wait 0s
# spark 每次调度等多久，等一个本地计算
spark.tispark.pd.addresses                      172.16.10.64:2379,172.16.10.65:2379,172.16.10.66:2379
# 指定 PD 信息
spark.tispark.grpc.framesize                    1564087970
spark.tispark.grpc.timeout_in_sec               100
spark.tispark.meta.reload_period_in_sec         60
spark.tispark.plan.allowaggpushdown             true
spark.tispark.index.scan_batch_size             500000
spark.tispark.index.scan_concurrency            2
spark.tispark.table.scan_concurrency            256
# 新版本下分别控制索引 / 扫表读取的并发线程数
spark.tispark.request.command.priority          Normal
# 新版本下对 TiKV 请求的优先级，如果是 OLTP 集群，请设定为 Low ，大小写敏感，可选有 High，Normal，Low

spark.sql.extensions: org.apache.spark.sql.TiExtensions
# spark 自动引入 tispark 功能，该参数需要 2018 年 8 月后版本支撑
</code></pre></li>
</ul>
</li>
<li>
<p><code>tidb-ansible/conf/spark-env.yml</code> spark 环境变量信息</p>
<ul>
<li>
<p>已经安装 spark 的修改 {{deploy_dir}}/conf/spark-env.sh 文件，也可通过命令行参数进行覆盖指定</p>
</li>
<li>
<p>根据机器配置调整 spark 所占用的 CPU &amp; RAM，示例如下：</p>
<pre><code class="language-fallback" data-lang="fallback">SPARK_EXECUTOR_CORES=5
# 控制每个 Executor 占用多少 cores
SPARK_EXECUTOR_MEMORY=5g
# 控制每个 Executor 占用多少内存，机器无其他服务时，建议总内存 80%
SPARK_WORKER_CORES=5
SPARK_WORKER_MEMORY=5g
</code></pre></li>
</ul>
</li>
</ul>
<h3 id="安装">安装</h3>
<blockquote>
<p>TiDB 目前默认已安装一台 spark 节点。以下为安装 spark cluster 。需要编写 inventory.ini，在 master_spark &amp; slaves_sparks 填写目标主机信息</p>
</blockquote>
<ul>
<li>初始化 master_spark &amp; slaves_sparks 目标主机信息
<ul>
<li>执行 <code>ansible-playbook -i inventory.ini bootstrap.yml -l master_spark,slaves_spark</code></li>
</ul>
</li>
<li>单独安装 spark 组件
<ul>
<li>执行 <code>ansible-playbook -i inventory.ini deploy.yml -l master_spark,slaves_spark</code></li>
</ul>
</li>
</ul>
<h3 id="运维">运维</h3>
<ul>
<li>启动 / 停止：启动停止时 playbook 不会检测中间过程状态，需要人工通过 <code>http://masterip:8080/</code> 检查 spark cluster 状态
<ul>
<li>执行 <code>ansible-playbook -i inventory.ini start_spark.yml</code> 启动集群</li>
<li>执行 <code>ansible-playbook -i inventory.ini stop_spark.yml</code> 启动集群</li>
</ul>
</li>
</ul>
<h2 id="0x02-测试服务">0x02 测试服务</h2>
<h3 id="端口--ip">端口 &amp; IP</h3>
<ul>
<li>注意防火墙放通以下端口: 8080，8081，7070，7077，4040</li>
<li>网页: <code>http://172.16.10.64:8080</code></li>
<li>通信端口: spark://172.16.10.64:7077</li>
<li>PD 集群: 172.16.10.64:2379,172.16.10.65:2379,172.16.10.66:2379</li>
</ul>
<h3 id="使用姿势">使用姿势</h3>
<blockquote>
<p>运行方式如下（注意自己安装的 Spark 版本再执行）</p>
</blockquote>
<h4 id="tispark-sql">TiSpark-SQL</h4>
<ul>
<li>通过 TiSpark-SQL 运行
<ul>
<li>下载 TiSpark-SQL <a href="https://github.com/pingcap/tispark/tree/master/core/scripts/tispark-sql">传送门</a></li>
<li>将文件保存导 <code>{{deploy}}/spark/bin</code> 下，赋予执行权限</li>
</ul>
</li>
<li>登陆 172.16.10.64 机器</li>
<li>进入目录 <code>cd /data3/deploy/spark/bin</code></li>
<li>执行 <code>./tispark-sql</code></li>
<li>直接输入 sql 语句，如 <code>show databases;</code></li>
</ul>
<h4 id="spark-shell">Spark-shell</h4>
<blockquote>
<p>本次使用的 Spark 2.3.2 版本</p>
</blockquote>
<ul>
<li>
<p>通过 spark-shell 运行</p>
<ul>
<li>登陆 172.16.10.64 机器</li>
<li>进入目录 <code>cd /data3/deploy/spark/bin</code></li>
<li>执行 <code>./spark-shell</code></li>
</ul>
<pre><code class="language-sql" data-lang="sql">spark.sql(&#34;show schemas&#34;).show
spark.sql(&#34;use mysql&#34;).show
spark.sql(&#34;show tables&#34;).show
</code></pre></li>
<li>
<p>替换 <code>spark.sql(&quot;show tables&quot;).show</code> 该命令中的 <code>show tables</code> 即可执行 SQL 查询。</p>
</li>
<li>
<p>TiSpark 目前仅支持查询，暂不支持回写。回写需求请发邮件至 (support # pingcap.com) 或通过其他方式联系 PingCAP 官方支持</p>
</li>
</ul>
<h3 id="版本变更">版本变更</h3>
<blockquote>
<p>spark 2.1.1 版本以及 2018 年 6 月份之前 tispark jar 包使用该步骤</p>
</blockquote>
<ul>
<li>
<p>通过 spark-shell 运行</p>
<ul>
<li>登陆 172.16.10.64 机器</li>
<li>进入目录 <code>cd /data3/deploy/spark/bin</code></li>
<li>执行 <code>./spark-shell</code></li>
</ul>
<pre><code class="language-fallback" data-lang="fallback">import org.apache.spark.sql.TiContext
val ti = new TiContext(spark)
ti.tidbMapDatabase(&#34;mysql&#34;) // 将数据库 mysql 中的所有表映射为 Spark SQL 表，在当前会话中只能映射一个数据库，重复无效
  // 如果数据库下表比较多，可以使用 tidbMapDatabase(&#34;tpch&#34;, autoLoadStatistics = false)  // autoLoadStatistics = false 该参数不加载统计信息，在不适用 index scan 的情况下无碍
spark.sql(&#34;show tables&#34;).show(truncate=false) // 查看当前数据库下所有表信息
</code></pre></li>
<li>
<p>如果使用 2.1.1 spark 配合 2018 年 6 月份以后 tispark jar 包，直接执行 <code>spark.sql(&quot;show schemas&quot;).show()</code> 只会出现一个 default database 现象，通过以上步骤引入 tispark jar 后，执行 <code>spark.sql(&quot;use mysql&quot;).show()</code>、<code>spark.sql(&quot;select count（*） from user&quot;).show()</code> 会出现错误堆栈</p>
</li>
</ul>
<h2 id="0x03-第三方">0x03 第三方</h2>
<h3 id="连接-tispark">连接 TiSpark</h3>
<ul>
<li>可以使用 jdbc 连接 TiSpark 服务</li>
<li>下载 ThriftServer 脚本 <a href="https://github.com/pingcap/tispark/tree/master/core/scripts">传送门</a>
<ul>
<li>将脚本复制到 {{deploy_dir}}/scripts/start-tithriftserver.sh</li>
<li>执行脚本启动 jdbc 服务器</li>
</ul>
</li>
<li>ThriftServer 提供 JDBC 访问入口, 适合 SQL workbench 之类的辅助 GUI 访问, 也可以使用 Hive Beeline 工具（但是实测下来仅限于 Hive 1.2 的 Beeline）</li>
<li>其他工具
<ul>
<li>zeppelin</li>
<li>submitjob</li>
</ul>
</li>
</ul>
<h3 id="安装-zeppelin">安装 zeppelin</h3>
<p><a href="https://github.com/apache/zeppelin">Zeppelin</a> 目前已托管于 Apache 基金会，但并未列为顶级项目，可以在其公布的官网访问。</p>
<p>它提供了一个非常友好的 WebUI 界面，操作相关指令。它可以用于做数据分析和可视化。其后面可以接入不同的数据处理引擎。包括 Flink，Spark，Hive 等。支持原生的 Scala，Shell，Markdown 等。</p>
<blockquote>
<p>官方提供更多安装方式，详情查看<a href="https://zeppelin.apache.org/download.html">Using the official docker image
</a></p>
</blockquote>
<ol>
<li>
<p>使用清华开源镜像站下载 Zeppelin</p>
<pre><code class="language-BASH" data-lang="BASH">https://mirrors.tuna.tsinghua.edu.cn/apache/zeppelin/
</code></pre></li>
<li>
<p>配置 conf/zeppelin-env.sh 将 SPARK_HOME 指向当前机器上的 SPARK 地址，例如</p>
<pre><code class="language-BASH" data-lang="BASH">export SPARK_HOME=/Users/ilovesoup1/workspace/spark-2.1.1-bin-hadoop2.7
</code></pre></li>
<li>
<p>检查 jackson 相关 JAR 包</p>
<ul>
<li>
<p><code>ls -al $SPARK_HOME/jars/jackson-*</code> 查看 spark</p>
</li>
<li>
<p>如现有版本比 Spark 内置版本旧，删除原有版本，用 spark/jars 下如下文件替换</p>
</li>
<li>
<p>zeppelin-0.7.3-bin-netinst/lib</p>
<pre><code class="language-BASH" data-lang="BASH">jackson-annotations-2.6.5.jar
jackson-core-2.6.5.jar
jackson-databind-2.6.5.jar
</code></pre></li>
</ul>
</li>
<li>
<p>启动 Zeppelin 服务</p>
<ul>
<li>
<p>服务将在本地 8080 启动</p>
<pre><code class="language-BASH" data-lang="BASH">./bin/zeppelin-daemon.sh start
</code></pre></li>
</ul>
</li>
<li>
<p>浏览器访问</p>
<pre><code class="language-BASH" data-lang="BASH">http://zepplineserver:8080
</code></pre><ul>
<li>
<p>点击 Create New note, 选中 Default Interpreter Spark</p>
</li>
<li>
<p>在页面中像 spark-shell 中一样测试</p>
<pre><code class="language-SQL" data-lang="SQL">import org.apache.spark.sql.TiContext
val ti = new TiContext(spark)
ti.tidbMapDatabase(&#34;test&#34;)
%sql show tables
</code></pre></li>
<li>
<p>点击 Shift+Enter 观察结果</p>
</li>
</ul>
</li>
</ol>
<h2 id="0x04-faq">0x04 FAQ</h2>
<h3 id="import-tisaprk-失败">import tisaprk 失败</h3>
<ul>
<li>
<p>第一次测试 spark-shell 时，如遇见以下问题，请检查 <code>{{deploy_dir}}/spark/conf/spark-defaults.yml</code> 文件中是否有正确使用 <code>spark.tispark.pd.addresses:</code> 参数。</p>
<ul>
<li><code>java.util.NoSuchElementException: spark.tispark.pd.addresses</code></li>
</ul>
<pre><code class="language-BASH" data-lang="BASH">scala&gt; import org.apache.spark.sql.TiContext
import org.apache.spark.sql.TiContext

scala&gt; val ti = new TiContext(spark)
java.util.NoSuchElementException: spark.tispark.pd.addresses
at org.apache.spark.SparkConf$$anonfun$get$1.apply(SparkConf.scala:243)
at org.apache.spark.SparkConf$$anonfun$get$1.apply(SparkConf.scala:243)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.SparkConf.get(SparkConf.scala:243)
at com.pingcap.tispark.TiUtils$.sparkConfToTiConf(TiUtils.scala:175)
at org.apache.spark.sql.TiContext.(TiContext.scala:36)
... 48 elided

scala&gt;
</code></pre></li>
</ul>
<h3 id="index-下推查询">index 下推查询</h3>
<ul>
<li>查看是否开启 index 下推</li>
</ul>
<p><code>spark.conf.get(&quot;spark.tispark.plan.allow_index_read&quot;)</code></p>
<ul>
<li>如果是 false，通过以下语句修改</li>
</ul>
<p><code>spark.conf.set(&quot;spark.tispark.plan.allow_index_read&quot;, &quot;true&quot;)</code></p>
]]></content:encoded><h:time datetime="2018-04-16T00:00:00+08:00">2018-04-16 · post</h:time><h:a class="feed-article-title" href="https://atman.ihx.cc/post/20180416-tispark-deploy/">AP - TiSpark 服务安装 部署 测试</h:a></item></channel></rss>