全栈工程师开发手册 (作者:栾鹏)
架构系列文章


首先我们需要对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中数据相关推荐

  1. K8S集群的详细安装步骤大数据教程

    Kubernetes是一个可移植的,可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化.它拥有一个庞大且快速增长的生态系统.Kubernetes的服务,支持和工具使用的非常广泛 ...

  2. 蚂蚁集团万级规模 k8s 集群 etcd 高可用建设之路

    蚂蚁集团运维着可能是全球最大的 k8s 集群:k8s 官方以 5k node 作为 k8s 规模化的顶峰,而蚂蚁集团事实上运维着规模达到 10k node 规模的 k8s 集群.一个形象的比喻就是,如 ...

  3. 蚂蚁集团于雨:万级规模 K8S 集群 Etcd 高可用建设之路

    -     前言    - 蚂蚁集团运维着可能是全球最大的 k8s 集群:k8s 官方以 5k node 作为 k8s 规模化的顶峰,而蚂蚁集团事实上运维着规模达到 10k node 规模的 k8s ...

  4. 《Kubernetes部署篇:基于docker使用kubespray工具离线部署高可用K8S集群(国内专网方案)》

    文章目录 一.部署背景简介 二.部署工具介绍 三.部署方案介绍 四.部署环境信息 五.部署资源下载 六.部署准备工作 6.1.系统内核升级 6.2.设置主机名 6.3.环境初始化 6.4.ssh多机互 ...

  5. 万级K8s集群背后etcd稳定性及性能优化实践

    作者:唐聪, 腾讯 CSIG 后台开发工程师 本文旨在帮助大家了解 etcd集群场景下稳定性与性能优化经验引的容量,避免给后面留坑. 背景与挑战 随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云 ...

  6. 备战双 11!蚂蚁金服万级规模 K8s 集群管理系统如何设计?

    戳蓝字"CSDN云计算"关注我们哦! 作者 |   沧漠 责编 | 阿秃 导读:Kubernetes 的出现使得广大开发同学也能运维复杂的分布式系统,它大幅降低了容器化应用部署的门 ...

  7. 备战双 11!96秒,100亿,支付宝万级规模 K8s 集群管理系统如何设计?

    2019年双11来了.1分36秒100亿,5分25秒超过300亿,12分49秒超500亿--全球最大流量洪峰54.4万笔,阿里巴巴核心系统全部上云... 背后的技术支撑到底是怎么样的呢? 导读:Kub ...

  8. 备战双11 蚂蚁金服10k规模k8s集群管理设计分享笔记

    分享嘉宾:张勇(花名:沧漠)蚂蚁金服技术专家,主要负责蚂蚁金服 PaaS 平台.K8s 集群管理系统设计.长期关注云原生领域开源社区,目前聚焦于如何增强 Kubernetes Node 能力和提升集群 ...

  9. 在sealos搭建的k8s集群中自定义kubeconfig文件

    推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...

最新文章

  1. 一旦一个业务可以由一个人来全部完成而不涉及分工,就会产生单干的情况
  2. java当前时间转化毫秒_Java学习笔记-时间相关类
  3. 用qss 来控制qlabel显示字体的位置_Word表格总填不好,这些技巧轻松来拯救
  4. Eclipse安装SVN插件方式简明介绍
  5. 与ai计算机专业大学排名,全球大学计算机科学与人工智能排名:卡耐基梅隆大学居首...
  6. html网页动态显示效果,html的table用法(让网页的视觉效果显示出来)
  7. android 使用c 代码实现,JNI开发实现helloworld,调用自己的C代码实现(1)
  8. anaconda中的python如何进行关联分析_Anaconda、Miniconda、Conda、pip的相互关系
  9. spark分片个数的确定及Spark内存错误(GC error)的迂回解决方式
  10. python基础 - 字符串与列表的基本操作方法
  11. PickerView的使用
  12. Google Earth影像数据破解之旅
  13. oracle知否有用coherence,Oracle Coherence概述
  14. vue之ele中的table组件(复选框的回显和重置)
  15. cts测试linux指令skip,CTS测试命令详细
  16. 为什么进行商业分析?什么是商业分析?(二)商业分析的角色、怎样进行商业分析与准备、相关方识别
  17. ug支持linux系统吗,UG12.02-linux,感兴趣的可以下载
  18. 《算法通识16讲》学习笔记
  19. 如何去除ul小圆点的html,html里面ul那个点怎么消
  20. 【miscellaneous】最新HEVC/H.265 4K视频,显卡解码测试

热门文章

  1. 地铁票务管理系统_地铁票务管理工作总结
  2. python计算空类型_python的变量 类型和存储
  3. android studio 自动引用,Android Studio三方引用报错但是项目可以运行的解决方案
  4. 【设计模式笔记】代理模式
  5. 【链表】删除链表的倒数第n个节点
  6. x264源代码简单分析:宏块编码(Encode)部分
  7. H.264 视频质量评价方法 (基于视频内容)
  8. ubuntu16.04安装python.h_ubuntu16.04安装python3.6踩过的坑
  9. elementui 表格格式化
  10. Nginx配置同时访问http和https