Ted yu:h base and hoya
-
Upload
hdhappy001 -
Category
Technology
-
view
110 -
download
1
description
Transcript of Ted yu:h base and hoya
我的简介
• 致力于HBase工作3年
• 2011年6月成为HBase代码提交者和PMC成员
概要
• Stripe compaction
• Hoya
• Q & A
Compactions 例子
Architecting the Future of Big Data
•Memstore 填满时,文件被刷新
•当积累足够的文件时,它们被压缩
MemStore
HDFS
writes
HFile
…
HFile HFile HFile HFile
但是, compaction 导致速度变慢
看起来很多I/ O但没有明显的好处 对读操作的效果示例
0
5
10
15
20
25
0 3600 7200 10800
Re
ad la
ten
cy, m
s
Load test time, sec
© Hortonworks Inc. 2011
改进 compactions的关键方法
•从较少的文件读取
–行键,版本,时间等的独立的文件
–允许大量的uncompacted文件存在
•不压缩你不需要压缩的数据
–例如,在类似OpenTSDB的系统中旧的数据
–显然,导致更少的I/ O
•使 compactions 较小
–没有太多的I / O放大,或太多的文件
–结果:较少的compactions相关的故障
•HBase 与少数大的区域工作更好; 但是,大的compactions
导致系统无法使用
© Hortonworks Inc. 2011
Stripe compactions (HBASE-7667)
Architecting the Future of Big Data
•有点像LevelDB, 在每个region/store划分键
•但是, 只有1级 (加上可选的L0)
•相对于regions, 分区是更灵活的
–默认情况下是几个大小大致相等的stripes
•要读取, 只是阅读有关的stripes加上L0, 如果存在
HFile HFile
Region start key: ccc
eee
Row-key axis
iii: region end key ggg
H
HFile HFile HFile
HFile L0
get 'hbase'
© Hortonworks Inc. 2011
Stripe compactions – 写入
Architecting the Future of Big Data
•数据从MEMSTORE刷新成几个文件
•每一个stripe 大部分的时间分开Compact
MemStore
HDFS
HFile HFile
H
HFile HFile HFile
H
H
H
HFile
© Hortonworks Inc. 2011
Stripe compactions – 其他
Architecting the Future of Big Data
•为什么要 Level0?
–Bulk loaded 文件转至L0
–刷新也可以进入单个L0文件 (避免小文件)
–然后几个L0的文件,压缩成striped文件
•如果压缩一个完整的stripe +L0, 可以去掉deletes
–无需major compactions, 永远
•2个stripes一起Compact – 如果非平衡, 重新调整
–然而非常罕见 - 非平衡的stripes 不是一个大问题
•边界可以被用来改善将来的区域分割
© Hortonworks Inc. 2011
Stripe compactions - 性能
Architecting the Future of Big Data
•EC2, c1.xlarge, preload; 然后测量随机读取性能
–LoadTestTool + deletes + overwrites;
0
500
1000
1500
2000
2500 3500 4500 5500 6500 7500 8500
Ran
do
m g
ets
pe
r se
con
d
Test time, sec.
Default gets-per-second, 30sec. MA
Stripe gets-per-second, 30sec. MA
© Hortonworks Inc. 2011
直接刷新到stripes
•刷新能写入多个文件, 避免L0所造成的I/ O放大
•冲突的文件: 保持 stripes 的现有文件; 新文件放入L0
© Hortonworks Inc. 2011
YARN: 把Hadoop带到批处理之外
HBase on Yarn
• 在大的YARN集群中的小HBase集群
• 动态的HBase集群
• 弹性的HBase集群
• 面向工作流的短暂/间歇集群
• 更有效地利用/共享集群资源
HBase on Yarn
• Hoya 是一个YARN上的应用
• 完全 由CLI 驱动 • 所有组件都是YARN services
• 输入是集群说明, 以JSON文档格式持久化,放在HDFS上
• HDFS和ZooKeeper 由多个集群实例共享
• 操作: create, freeze/thaw, flex, exists <群集名字>
Hoya 结构
• HoyaClient: 解析命令行, 执行本地操作, 与HoyaAppMaster通信
• HoyaAppMaster: AM 服务, 实现AMRMClientAsync和NMClientAsync的回调
• HBaseProviderService: 在containers中部署和执行master和region servers
YARN管理集群
HDFS
YARN Node Manager
HDFS
YARN Node Manager
HDFS
YARN Resource Manager
HDFS
YARN Node Manager
• 服务器运行YARN节点管理器
• NM向资源管理器发送心跳
• RM在群集中调度工作
• RM分配容器给应用程序
• NMs 启动容器
• NMs 报告容器健康
Hoya Client 创建 App Master
HDFS
YARN Node Manager
HDFS
YARN Node Manager
HDFS
YARN Resource Manager
HDFS
YARN Node Manager
Hoya Client Hoya AM
Hoya AM 用 YARN部署 HBase
HDFS
YARN Node Manager
HDFS
YARN Node Manager
HDFS
YARN Resource Manager
Hoya Client
HDFS
YARN Node Manager
Hoya AM
HBase Region Server
HBase Region Server
HBase Master
HBase和客户端通过Zookeeper结合
HDFS
YARN Node Manager
HBase Region Server
HDFS
YARN Node Manager
HBase Region Server
HDFS
YARN Resource Manager
HBase Client HDFS
YARN Node Manager
Hoya AM Hoya Client
HBase Master
YARN 把故障通知给AM
HDFS
YARN Node Manager
HDFS
YARN Node Manager
HBase Region Server
HDFS
YARN Resource Manager
Hoya Client
HDFS
YARN Node Manager
Hoya AM
HBase Region Server
HBase Region Server
HBase Master
HOYA - 酷的功能
• 配置目录是缓存的,动态修补后推升到master和region servers的本地资源
• HBase .tar文件存储在HDFS上 - 集群可以使用相同/不同的HBase版本
• 集群伸缩和计划外容器损失的处理是相同的代码.
• region servers节点无Hoya代码
• RPC服务使用Protobuf -为其他语言客户打开服务
• 跟踪与持久化角色实例的位置信息 - 失败或解冻后, 把实例放置得接近数据
集群规范: 持久化
{
"version" : "1.0",
"name" : "cl1",
"type" : "hbase",
"state" : 1,
"createTime" : 1377276630308,
"originConfigurationPath" : "hdfs://ubuntu:9000/user/stevel/.hoya/cluster/cl1/original",
"generatedConfigurationPath" : "hdfs://ubuntu:9000/user/stevel/.hoya/cluster/cl1/generated",
"zkHosts" : "localhost",
"zkPort" : 2181,
"zkPath" : "/yarnapps_hoya_stevel_cl1",
"hbaseDataPath" : "hdfs://ubuntu:9000/user/stevel/.hoya/cluster/cl1/hbase",
"imagePath" : "hdfs://ubuntu:9000/hbase.tar",
"options" : {
"hoya.test" : "true"
},
...
}
角色规范
"roles" : { "worker" : { "yarn.memory" : "256", "role.instances" : "5", "role.name" : "worker", "jvm.heapsize" : "256", "yarn.vcores" : "1", "app.infoport" : "0" "env.MALLOC_ARENA_MAX": "4" }, "master" : { "yarn.memory" : "128", "role.instances" : "2", "role.name" : "master", "jvm.heapsize" : "128", "yarn.vcores" : "1", "app.infoport" : "8585" } }
伸缩/故障处理是相同的代码
boolean flexCluster(ClusterDescription updated) { providerService.validateClusterSpec(updated); appState.updateClusterSpec(updated); return reviewRequestAndReleaseNodes(); } void onContainersCompleted(List<ContainerStatus> completed) { for (ContainerStatus status : completed) { appState.onCompletedNode(status); } reviewRequestAndReleaseNodes(); }
保护YARN AM RPC接口
• 在一个安全的集群中的YARN应用程序, 会从客户端获得委托令牌以和AM交谈
• 它还得到了令牌以便AM可以和RM交谈
• 进程会自动锁定任何你启动的RPC服务-所以客户端必须向AM验证自己
保护YARN AM RPC:代码
// set up secret manager secretManager = new ClientToAMTokenSecretManager(appAttemptID, null); Server server = RpcBinder.createProtobufServer( new InetSocketAddress("0.0.0.0", 0), getConfig(), secretManager, NUM_RPC_HANDLERS, blockingService, null); server.start(); RegisterApplicationMasterResponse response = asyncRMClient .registerApplicationMaster(appMasterHostname, appMasterRpcPort, null); if (UserGroupInformation.isSecurityEnabled()) { secretManager.setMasterKey( response.getClientToAMTokenMasterKey().array());
正在进行的
• 多个提供者:HBase+其他
• 活跃度探测: HTTP GET, RPC端口, RPC 操作 ?
• 更好的故障处理,黑名单功能
应用程序对Hoya的要求
• 从压缩包安装,以普通用户运行
• 部署/启动无需人工干预
• 与集群/节点的其他应用实例共存
• 处理位于同一节点的角色实例
• 支持'杀'作为一个关闭选项
YARN-896:长寿命服务
• AM重启, 重新连接到以前的容器
• 应用程序令牌更新
• 对容器发出信号的能力
• AM/RM管理的组调度
• 在对容器的要求中提供反关联暗示
Phoenix简介
• 开源 https://github.com/forcedotcom/phoenix
• 提仪成为 Apache Phoenix
• HBase 上的SQL
• JDBC 驱动程序
• 用户可以专注于业务逻辑
二级索引
• 全局索引 - 另外建索引表
• 全表扫描变成point get
• 根据查询性能,优化器自动选择
• 和HBase一样提供ACID 保证
• 成功时才可见
建索引的语法
• CREATE INDEX <index_name>
ON <table_name>(<columns_to_index>…)
INCLUDE (<columns_to_cover>…);
哈希Joins
• 把小表广播到所有的region servers
• 以内存map形式缓存
• 扫描大表
• 在协处理器中join
哈希Join例子
SELECT * FROM employee e JOIN department d
ON e.dept_id = d.dept_id
WHERE e.salary < 120 AND d.revenue > 100
哈希Join例子
SELECT * FROM employee e JOIN department d
ON e.dept_id = d.dept_id
WHERE e.salary < 120 AND d.revenue > 100
哈希Join例子
SELECT * FROM department d
WHERE d.revenue > 100
• 将扫描结果送至各服务器
• 以内存map形式缓存
哈希Join例子
SELECT * FROM employee e JOIN department d
ON e.dept_id = d.dept_id
WHERE e.salary < 120 AND d.revenue > 100
哈希Join例子
SELECT * FROM employee e
WHERE e.salary < 120
• 扫描员工表
• 协处理器利用内存map进行join(根据e.dept_id = d.dept_id)
• 反回结果
• 清理缓存
Q & A
Thanks!