今天发现昨天压根不需要另外再搭建一个spark的集群环境。因为tidb1.0版本已经集成了tiSpark组件,所以搭建完tidb集群,它就是一个内置spark集群的环境。
我晕~不过昨天还是有价值的,那就是昨天文章前半部分的内容,可通过配置hostname让tidb各节点互相通信。可见昨天文章:http://www.jianshu.com/p/08d3072c2621
ok,今天就先把tidb集群搭建过程记录下来
准备
和http://www.jianshu.com/p/7bd05b55b182这篇单节点部署类似,首先安装ansible,接着下载 TiDB-Ansible
机器配置资源如下
域名 | IP | tidb集群角色 |
---|---|---|
tidb1 | 192.168.122.16 | TiDB/PD |
tidb2 | 192.168.122.18 | TiKV |
tidb3 | 192.168.122.19 | TiKV |
tidb4 | 192.168.122.20 | TiKV |
spark集群
域名 | IP | 主从关系 |
---|---|---|
tidb1 | 192.168.122.16 | Master |
tidb2 | 192.168.122.18 | Slave |
tidb3 | 192.168.122.19 | Slave |
tidb4 | 192.168.122.20 | Slave |
编辑inventory.ini
还是先编辑inventory.ini内容
# TiDB Cluster Part
[tidb_servers]
tidb1
[tikv_servers]
tidb2
tidb3
tidb4
[pd_servers]
tidb1
[spark_master]
tidb1
[spark_slaves]
tidb2
tidb3
tidb4
# Monitoring Part
[monitoring_servers]
tidb1
[grafana_servers]
tidb1
[monitored_servers:children]
tidb_servers
tikv_servers
pd_servers
spark_master
spark_slaves
## Binlog Part
[pump_servers:children]
tidb_servers
[cistern_servers]
[drainer_servers]
[pd_servers:vars]
# location_labels = ["zone","rack","host"]
## Global variables
[all:vars]
deploy_dir = /home/tidb/deploy
## Connection
# ssh via root:
ansible_user = root
ansible_become = true
ansible_become_user = tidb
# ssh via normal user
# ansible_user = tidb
cluster_name = test-cluster
# misc
enable_elk = False
enable_firewalld = False
enable_ntpd = True
machine_benchmark = True
set_hostname = False
tidb_version = v1.0.0
use_systemd = True
# binlog trigger
enable_binlog = False
这里enable_ntpd和machine_benchmark设置为True,use_systemd也设置为True
部署
和之前一样,继续用root账户,相关inventory.ini文件配置如前所述。接下来的过程和单节点部署类似
使用 local_prepare.yml playbook, 下载 TiDB
ansible-playbook local_prepare.yml
初始化系统环境,修改内核参数。如服务运行用户尚未建立,此初始化操作会自动创建该用户
ansible-playbook bootstrap.yml
如果 ansible 使用 root 用户远程连接需要密码, 使用 -k 参数,执行其他 playbook 同理
ansible-playbook bootstrap.yml -k
部署
ansible-playbook deploy.yml -k
启动
ansible-playbook start.yml -k
测试安装是否成功
使用 MySQL 客户端连接测试, TCP 4000 端口是 TiDB 服务默认端口。
mysql -u root -h 192.168.122.16 -P 4000
TiSpark安装
其实执行到这里,TiSpark已经安装部署好了。 TiDB 集群中默认已集成 Spark、TiSpark jar 包及 TiSpark sample data。
目录信息
Spark 已默认部署在 TiDB 实例部署目录/home/tidb/deploy/spark 目录中
TiSpark jar 包默认部署在 Spark 部署目录 jars 文件夹下
/home/tidb/deploy/spark/jars/tispark-0.1.0-beta-SNAPSHOT-jar-with-dependencies.jar
TiSpark sample data 及导入脚本默认部署在 TiDB-Ansible 目录下
/usr/local/tidb-ansible/resources/bin/tispark-sample-data
导入样例数据
假设 TiDB 集群已启动,其中一台 TiDB 实例服务 IP 为 192.168.122.16,端口为 4000,用户名为 root, 密码为空。
cd /usr/local/tidb-ansible/resources/bin/tispark-sample-data
修改sample_data.sh中 TiDB 登录信息,比如:
mysql -h 192.168.122.16 -P 4000 -u root < dss.ddl
执行脚本
./sample_data.sh
执行脚本的机器上需要安装 MySQL client,CentOS 用户可通过
yum -y install mysql
来安装。
登录 TiDB 并验证数据包含TPCH_001库及以下表
执行
mysql -u root -h 192.168.122.16 -P 4000
如下图
范例
假设您的 PD 节点 IP 为 192.168.122.16,端口 2379, 先进入 spark 部署目录启动 spark-shell:
cd /home/tidb/deploy/spark/bin
./spark-shell
scala> import org.apache.spark.sql.TiContext
scala> val ti = new TiContext(spark, List("192.168.122.16:2379"))
scala> ti.tidbMapDatabase("TPCH_001")
之后您可以直接调用 Spark SQL:
scala> spark.sql("select count(*) from lineitem").show
结果为
+--------+|count(1)|+--------+| 60175|+--------+
下面执行另一个复杂一点的 Spark SQL:
scala> spark.sql(
"""select
| l_returnflag,
| l_linestatus,
| sum(l_quantity) as sum_qty,
| sum(l_extendedprice) as sum_base_price,
| sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
| sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
| avg(l_quantity) as avg_qty,
| avg(l_extendedprice) as avg_price,
| avg(l_discount) as avg_disc,
| count(*) as count_order
|from
| lineitem
|where
| l_shipdate <= date '1998-12-01' - interval '90' day
|group by
| l_returnflag,
| l_linestatus
|order by
| l_returnflag,
| l_linestatus
""".stripMargin).show
结果为下图
碰到的问题和解决方案
1.每台server需要安装ntpd
报错信息如下
安装ntpd,并启动ntpd服务
yum install ntp ntpdate
service ntpd start
2.确保spark不会冲突
昨天我自己安装了一个spark集群,后来发现
然后我把原有spark进程杀掉就行了
3.PD启动不了,报timeout错误
这里是我之前搭建tidb集群后,又修改了inventory.ini 文件,没有关闭原来的集群导致的。
此时应执行集群销毁命令
ansible-playbook unsafe_cleanup.yml
然后重新从执行ansible-playbook bootstrap.yml开始运行就可以了,见部署章节