k8s集群中 spark访问hbase中数据
全栈工程师开发手册 (作者:栾鹏)
架构系列文章
首先我们需要对hbase的访问原理非常清楚.可以参考:https://blog.csdn.net/luanpeng825485697/article/details/80319552
我们这里已经在k8s中部署了hdfs和zookeeper以及hbase.部署可以参考: https://blog.csdn.net/luanpeng825485697/article/details/81985602
hbase数据分区是按照region进行的,分区的location就是各个region的location。那么后续分配executor时可以按照region所在机器分配对应executor,直接在本机读取数据计算。
我们先来往hbase里面写两个数据
hbase shell
whoami
list # 如果list出错,说正在初始化中,要等待,可以在dashboard中看
exists 't1'
create 't1',{NAME => 'f1', VERSIONS => 2},{NAME => 'f2', VERSIONS => 2}
put 't1','rowkey001','f1:col1','value01'
put 't1','rowkey002','f1:col1','value01'
put 't1','rowkey003','f1:col1','value01'
put 't1','rowkey004','f1:col1','value01'
我们使用python来实现连接
python代码如下
# 这些函数只在driver驱动中执行. 只有DRR的mapreduce才会在exec程序中执行
# 需要设置hbase的hostname和subdomain 并在dns增加一条重定向from pyspark.sql import SparkSession
from pyspark.sql import SQLContextspark = SparkSession.builder.appName("hbase_test").getOrCreate()
sc = spark.sparkContextzookeeper = 'zookeeper-1.cloudai-2.svc.cluster.local,zookeeper-2.cloudai-2.svc.cluster.local,zookeeper-3.cloudai-2.svc.cluster.local'
table = 't1'# # 读取
conf = {"hbase.zookeeper.quorum": zookeeper,"hbase.zookeeper.property.clientPort":"2181","hbase.regionserver.port":"60010",# "hbase.master":"10.233.9.21:60000",# "hbase.master.port":"60000","zookeeper.znode.parent":"/hbase","hbase.defaults.for.version.skip":"true","hbase.mapreduce.inputtable": table
}keyConv = "org.apache.spark.examples.pythonconverters.ImmutableBytesWritableToStringConverter"
valueConv = "org.apache.spark.examples.pythonconverters.HBaseResultToStringConverter"
hbase_rdd = sc.newAPIHadoopRDD("org.apache.hadoop.hbase.mapreduce.TableInputFormat","org.apache.hadoop.hbase.io.ImmutableBytesWritable","org.apache.hadoop.hbase.client.Result",keyConverter=keyConv,valueConverter=valueConv,conf=conf)
count = hbase_rdd.count()
hbase_rdd.cache()
output = hbase_rdd.collect()
for (k, v) in output:print((k, v))
在代码中我们配置了zookeeper的地址, spark会先访问spark来获取hbase的所有信息,包含master,regionserver的信息.
为了保证正确,我们可以先自己查询一遍看看是否正确.
zookeeper的存储原理可以参考:http://www.cnblogs.com/leesf456/p/6179118.html
进入zookeeper的pod,
./bin/zkCli.sh # 计入zookeeper命令行ls / # 查看zookeeper根目录存储:
包含zookeeper hbase两个文件夹(数据节点)ls2 /zookeeper 查看zookeeper节点目录ls2 /hbase 查看hbase节点信息:
[meta-region-server, backup-masters, table, draining, region-in-transition, table-lock, running, master, namespace, hbaseid, online-snapshot, replication, splitWAL, recovering-regions, rs, flush-table-proc]查看hbase集群在zookeeper记录的信息,比如:regionserver1-slave-1,regionserver2-slave-2
ls2 /hbase/rs
[hbase-master-deployment-1-ddb859944-ctbrm,16201,1541399059310]
这里可以看出, 记录在zookeeper中的数据是pod的主机名hostname 而不是ip表锁节点会有所有表。
[zk: localhost:2181(CONNECTED) 10] ls2 /hbase/table-lock
[TestTable, product, device, t1, rec_history, hbase:namespace, face_detect]
cZxid = 0x100000009
ctime = Wed Sep 19 07:25:49 UTC 2018
mZxid = 0x100000009
mtime = Wed Sep 19 07:25:49 UTC 2018
pZxid = 0x300000749
cversion = 21
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 7查看所有表
[zk: localhost:2181(CONNECTED) 11] ls2 /hbase/table
[TestTable, product, t1, rec_history, device, hbase:meta, hbase:namespace, face_detect]
cZxid = 0x100000006
ctime = Wed Sep 19 07:25:49 UTC 2018
mZxid = 0x100000006
mtime = Wed Sep 19 07:25:49 UTC 2018
pZxid = 0x30000074b
cversion = 22
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 8查看hbase的meta表信息,包含server信息。
[zk: localhost:2181(CONNECTED) 14] get /hbase/table/hbase:meta?master:60000o,?OG?e?PBUF
cZxid = 0x100000029
ctime = Wed Sep 19 07:25:57 UTC 2018
mZxid = 0x10000002a
mtime = Wed Sep 19 07:25:57 UTC 2018
pZxid = 0x100000029
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 31
numChildren = 0
由于hbase的通信是通过hostname连接的. 所以我们在python代码中设置了将hostname写入到hosts文件,但是这个代码只在driver驱动中执行,只有DRR数据才会分解到exec驱动中执行. 所以只有driver的pod中成功修改了hosts 而exec仍然无法解析hostname
有几种方案:
1 将hbase的hostname和pod的ip想办法能配置到镜像中 因为pod的ip可能是变化的,所以必须以配置的方式添加进去.
2 添加代理,或者自定义DNS 将hbase的hostname代理到pod的ip
3 重定向 将hostname 重定向到pod的访问地址
{pod-name}.{subdomain}.{namespace}.svc.cluster.local
4 创建service-headless服务的名称和hbase的hostname设置成一样,并且让spark和hbase在同一个命名空间下 ( 这种最简单 )
我们先按照第4种方案在hbase所在的命名空间创建和hbase的pod的hostname相同的service-headless,并且让spark也在这个命名空间下运行
apiVersion: v1
kind: Service
metadata:name: hbase-master-1namespace: cloudai-2
spec:selector:app: hbase-master-1clusterIP: Noneports:- name: rpcport: 60000targetPort: 60000 # 配置的hbase的链接端口 - name: infoport: 60001 # hbase运行状态的网页查询端口targetPort: 60001- name: regionport: 60010 targetPort: 60010- name: regioninfoport: 60011 targetPort: 60011- name: thriftport: 9090 # thrift服务器ip,让外界通过thrift来访问hbasetargetPort: 9090
如果我们想让spark在一个独立的命名空间运行,就要另寻它法了.
创建hbase的deployment时指定pod的hostname和subdomain
hostname: hbase-master-1 # 设定主机名
subdomain: hbase-headless # 设定子域名
为subdomain建一个service-headless
apiVersion: v1
kind: Service
metadata:name: hbase-headlessnamespace: cloudai-2
spec:selector:app: hbase-master-1clusterIP: Noneports:- name: rpcport: 60000targetPort: 60000 # 配置的hbase的链接端口 - name: infoport: 60001 # hbase运行状态的网页查询端口targetPort: 60001- name: regionport: 60010 targetPort: 60010- name: regioninfoport: 60011 targetPort: 60011- name: thriftport: 9090 # thrift服务器ip,让外界通过thrift来访问hbasetargetPort: 9090
这样就能访问hbase的pod了,只不过域名必须是
hbase-master-1.hbase-headless.cloudai-2.svc.cluster.local
下面我们来设置代理, 在使用hbase的hostname访问pod时也能正常访问到hbase的pod.
我这里在dns中增加了一个重定向解析记录
我这里的dns使用的coredns,在创建Corefile的configmap时使用下面的方法
apiVersion: v1
data:Corefile: |.:53 {errorshealthrewrite name hbase-master-1 hbase-master-1.hbase-headless.cloudai-2.svc.cluster.localkubernetes cluster.local in-addr.arpa ip6.arpa {pods insecureupstreamfallthrough in-addr.arpa ip6.arpa}prometheus :9153proxy . /etc/resolv.confcache 30reload}
kind: ConfigMap
metadata:name: corednsnamespace: kube-system
这样dns在解析hbase-master-1时返回的是hbase-master-1.hbase-headless.cloudai-2.svc.cluster.local的ip
如果你使用的是kube-dns,可以参考https://blog.csdn.net/luanpeng825485697/article/details/84108166
k8s集群中 spark访问hbase中数据相关推荐
- K8S集群的详细安装步骤大数据教程
Kubernetes是一个可移植的,可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化.它拥有一个庞大且快速增长的生态系统.Kubernetes的服务,支持和工具使用的非常广泛 ...
- 蚂蚁集团万级规模 k8s 集群 etcd 高可用建设之路
蚂蚁集团运维着可能是全球最大的 k8s 集群:k8s 官方以 5k node 作为 k8s 规模化的顶峰,而蚂蚁集团事实上运维着规模达到 10k node 规模的 k8s 集群.一个形象的比喻就是,如 ...
- 蚂蚁集团于雨:万级规模 K8S 集群 Etcd 高可用建设之路
- 前言 - 蚂蚁集团运维着可能是全球最大的 k8s 集群:k8s 官方以 5k node 作为 k8s 规模化的顶峰,而蚂蚁集团事实上运维着规模达到 10k node 规模的 k8s ...
- 《Kubernetes部署篇:基于docker使用kubespray工具离线部署高可用K8S集群(国内专网方案)》
文章目录 一.部署背景简介 二.部署工具介绍 三.部署方案介绍 四.部署环境信息 五.部署资源下载 六.部署准备工作 6.1.系统内核升级 6.2.设置主机名 6.3.环境初始化 6.4.ssh多机互 ...
- 万级K8s集群背后etcd稳定性及性能优化实践
作者:唐聪, 腾讯 CSIG 后台开发工程师 本文旨在帮助大家了解 etcd集群场景下稳定性与性能优化经验引的容量,避免给后面留坑. 背景与挑战 随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云 ...
- 备战双 11!蚂蚁金服万级规模 K8s 集群管理系统如何设计?
戳蓝字"CSDN云计算"关注我们哦! 作者 | 沧漠 责编 | 阿秃 导读:Kubernetes 的出现使得广大开发同学也能运维复杂的分布式系统,它大幅降低了容器化应用部署的门 ...
- 备战双 11!96秒,100亿,支付宝万级规模 K8s 集群管理系统如何设计?
2019年双11来了.1分36秒100亿,5分25秒超过300亿,12分49秒超500亿--全球最大流量洪峰54.4万笔,阿里巴巴核心系统全部上云... 背后的技术支撑到底是怎么样的呢? 导读:Kub ...
- 备战双11 蚂蚁金服10k规模k8s集群管理设计分享笔记
分享嘉宾:张勇(花名:沧漠)蚂蚁金服技术专家,主要负责蚂蚁金服 PaaS 平台.K8s 集群管理系统设计.长期关注云原生领域开源社区,目前聚焦于如何增强 Kubernetes Node 能力和提升集群 ...
- 在sealos搭建的k8s集群中自定义kubeconfig文件
推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...
最新文章
- 一旦一个业务可以由一个人来全部完成而不涉及分工,就会产生单干的情况
- java当前时间转化毫秒_Java学习笔记-时间相关类
- 用qss 来控制qlabel显示字体的位置_Word表格总填不好,这些技巧轻松来拯救
- Eclipse安装SVN插件方式简明介绍
- 与ai计算机专业大学排名,全球大学计算机科学与人工智能排名:卡耐基梅隆大学居首...
- html网页动态显示效果,html的table用法(让网页的视觉效果显示出来)
- android 使用c 代码实现,JNI开发实现helloworld,调用自己的C代码实现(1)
- anaconda中的python如何进行关联分析_Anaconda、Miniconda、Conda、pip的相互关系
- spark分片个数的确定及Spark内存错误(GC error)的迂回解决方式
- python基础 - 字符串与列表的基本操作方法
- PickerView的使用
- Google Earth影像数据破解之旅
- oracle知否有用coherence,Oracle Coherence概述
- vue之ele中的table组件(复选框的回显和重置)
- cts测试linux指令skip,CTS测试命令详细
- 为什么进行商业分析?什么是商业分析?(二)商业分析的角色、怎样进行商业分析与准备、相关方识别
- ug支持linux系统吗,UG12.02-linux,感兴趣的可以下载
- 《算法通识16讲》学习笔记
- 如何去除ul小圆点的html,html里面ul那个点怎么消
- 【miscellaneous】最新HEVC/H.265 4K视频,显卡解码测试
热门文章
- 地铁票务管理系统_地铁票务管理工作总结
- python计算空类型_python的变量 类型和存储
- android studio 自动引用,Android Studio三方引用报错但是项目可以运行的解决方案
- 【设计模式笔记】代理模式
- 【链表】删除链表的倒数第n个节点
- x264源代码简单分析:宏块编码(Encode)部分
- H.264 视频质量评价方法 (基于视频内容)
- ubuntu16.04安装python.h_ubuntu16.04安装python3.6踩过的坑
- elementui 表格格式化
- Nginx配置同时访问http和https