简练的Hbase Fully-distributed 分布式测试环境部署记录
由于Hbase的非结构化特性,把她看成是一个存储系统比看成是数据库更加容易让人接受。
Hbase 是一个存储系统,不需要预定义很严格的矩阵结构,提供松散的组织数据的能力。而作为存储,她其实需要借助其他的文件系统支持,实际上并不一定限定于HDFS(在官方文档教程中,Hbase standalone 就是基于本地文件系统作为存储,也有厂商支持的较为稳定的Hbase + GPFS 的方案),只是因为来源于google 的Bigtable也是apache项目,因此两者结合有天然优势,支援也十分丰富。
这个测试环境采用一种完全分布式 fully-distributed 部署方法(区别于 standalone 和 伪分布式部署),采用外部zookeeper,也就是和原来的hadoop 共用一套zookeeper。
(hbase程序包中实际上包含了zookeeper进程,可以启动一个独立的zookeeper去管理hbase,这里不采用这个方式)
(1)创建系统用户并配置在集群之间的免密互访
为了管理的便利性,通过一个脚本start-hbase.sh 就启动其他几台机的进程,那么就需要配置免密码rsh于host007, host003, host001,host002 上。
创建hbase用户:useradd -d /usr/local/hbase -m -s /bin/bash -G sudo,hadoop,java,zookeeper,yarn,hive hbase
“-G sudo,hadoop,java,zookeeper,yarn,hive”:是否需要配置用户组的权限,就看原有系统的需要,并不是必须步骤,只是测试环境下,便于登陆、修改其他系统的文件和检查他们的进程,这里是顺便把权限授了。
针对hbase用户配置免密码。(这里就不展开了,相关说明文档很多,简单来说就是把私钥放在~hbase/.ssh目录下,然后把共钥写入到所有访问这台机的其他机器上的authorized_key文件中。另外必须要把.ssh目录和文件权限配置为700)
(2)配置regionservers
所有的hbase配置文件都在~hbase/conf目录下,找到regionservers文件,改成这次集群作为region server的几台机。改成
host004
host005
host006
一个hostname一行,也能够写ip。写hostname一定不要忘记编辑/etc/hosts定义hostname 和ip 的映射关系。
(3)配置master backup
在$HBASE_HOME 中创建 backup-masters 文件。(环境变量不是必须的,不过如果配置了$HBASE_HOME 会带来很多方便,特别是很多其他的hadoop组建配置都是默认针对$HBASE_HOME,如果没有配置,那么就无法找到默认文件,导致配置失效,所以强烈建议在 /etc/profile.d/ 创建一个启动环境变量的脚步,并且采用这种全局的方式执行。)
写入:
host003
(4)配置zookeeper
使用外部的独立zookeeper,则需要如下设置:
1. 在文件hbase-site.xml中,修改 HBASE_MANAGES_ZK = false。
2. 在hbase-site.xml中,对应地修改如下设置,指向外部zookeeper地址和端口:
<property> <name>hbase.zookeeper.quorum</name> <value>host004,host005,host006</value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property>
这样就指定了原来配置在host004,host005,host006上的zookeeper集群了,无非就是定义每个客户端的端口。
(4)hbase 的一些变量和参数
主要是针对hbase-env.sh 文件进行配置。
JAVA_HOME: export JAVA_HOME=/usr/local/java/jdk1.8.0_211
Heapsize: export HBASE_HEAPSIZE=600M
主要目录路径:一个是日志,一个是运行时的临时文件
export HBASE_LOG_DIR=/usr/local/hbase/hbase-1.4.10/Logs
export HBASE_PID_DIR=/usr/local/hbase/hbase-1.4.10/Pids
是否启用hbase自带的zookeeper:export HBASE_MANAGES_ZK=false
(5)分布式Hbase的定义
实际上只有一个参数,hbase-site.xml
<property> <name>hbase.cluster.distributed</name> <value>true</value> </property>
(6)定义HDFS的配置
如开篇说的,Hbase实际上需要结合一个文件系统提供给她用于组织她的数据,因此,需要定义一个文件系统访问路径给到Hbase。
Hbase 是可以简单地利用所支持的文件系统去进行数据的存储的,包括普通FS(配置为file://usr/local/habase/data),或者采用HDFS。甚至是支持其他自己开发的文件系统,当然如果要这么做,需要大量的定制。
如果采用了HDFS 文件系统,需要告诉hbase hdfs的配置信息,她才能够去正确访问对应的nameservice 。(注意:如果hbase不通过nameservice去访问HDFS,那就不需要了解HDFS 的配置情况,不需要core-site.xml ,hdfs-site.xml里面的配置信息,只需要配置为hdfs://host001:9000 就可以了)
<property> <name>hbase.rootdir</name> <value>hdfs://HadoopCluster1/hbase</value> </property>
接上面说的,由于利用了HDFS 集群的nameservice作为访问路径 ,需要由core-site.xml和hdfs-site.xml里面的配置描述提供,因此需要把hadoop集群的这两个文件复制到$HBASE_HOME/conf/ 目录里面。 Hbase 是会默认读取这两个文件中的信息,从而获得nameservice 对应的主机和端口。
(6)最后的检查
$HBASE_HOME/conf 中修改过的文件应该包括: regionserver, backup-master, hbase-env.sh , hbase-site.sh
最基本的配置如下:
Hbase-env.sh:
export JAVA_HOME=/usr/local/java/jdk1.8.0_211 export HBASE_HEAPSIZE=600M export HBASE_LOG_DIR=/usr/local/hbase/hbase-1.4.10/Logs export HBASE_PID_DIR=/usr/local/hbase/hbase-1.4.10/Pids export HBASE_MANAGES_ZK=false
hbase-site.sh
<configuration> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.rootdir</name> <value>hdfs://HadoopCluster1/hbase</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>host004,host005,host006</value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property> </configuration>
Regionservers:
host004 host005 host006
backup-masters:
host003
如果使用hdfs ,nameservice 方式,还需要有core-stie.xml, hdfs-site.xml在这个目录下。
(7)配置文件分发到集群内所有机器
把配置文件(conf 下面全部)复制到hbase 集群所有机器。那么,在那台机器上启动,那台就成为了Master,因为Master这台机器是没有指定的。其他的regionserver, backup-master 都是有指定的,脚步会根据指定的这些机器hostname rsh 过去,然后启动相应的daemons,这样整个集群就启动了。
在master上:
hbase@host007:~/hbase-1.4.10/bin$ ./start-hbase.sh
就可以按照配置启动。
原文地址:https://www.cnblogs.com/ZhouAlex/p/11387920.html
- 利用FFmpeg对火眼一体摄像机的回调数据进行处理:YUV转H264,H264封装flv,所有输入都是在内存中。
- MySQL 传统复制中常见故障处理和结构优化案例分析
- sql带条件查找最小缺失编号
- activiti学习笔记(六) 监听器
- activiti学习笔记(五) 流程部署
- 打开文件open()函数的使用方法详解
- activiti学习笔记(四) 配置器
- WaitForMultipleObjects用法详解,一看就懂
- activiti学习笔记(三) 监听生命周期
- Assignment 2 | 斯坦福CS231n-深度学习与计算机视觉课程
- 五个值得深思的PHP面试题
- 5个值得深思的 PHP 面试问题
- activiti学习笔记(二) 获取流程实例
- 文件操作(偏移量)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flink 解决 No ExecutorFactory found to execute the application
- 10.8 如何用js验证一下boz-sizing样式对块级盒子大小的影响?
- 10.9 块级盒子的内外边距:如何使用box-sizing重新定义盒子模式?
- 10.10 圆角边框border-radius与盒子阴影:如何使用它实现圆等特殊形状?
- 函数内部的this指向
- 正则表达式在js中的使用
- 10.11 如何使用git?
- 10.13 如何使用transform样式?
- 正则表达式中的特殊字符
- ES6新增语法--let
- ES6新增语法--const
- 10.14 如何实现一个居中弹出的窗口?
- css中好用的clamp()函数
- 解构赋值
- 箭头函数