Hbase搭建-基本操作
mysql:关系型数据库 RDBMS hive: 数据仓库 进行数据分析,没有实时性 hbase:基于文档的数据库 nosql not only sql hive和hbase的区别: hbase:数据库,不支持分析 hive:数据仓库,用作数据分析 hbase:基于hdfs的非关系型数据库,基于google的bigtable技术实现的。 实时性,低延迟,分布式、可伸缩、大数据存储。 数量级:十亿行 x 百万列 x 上千个版本 读未提交: 第一个会话修改的数据没有进行提交 另一个会话进行读取 =====> 读取的是修改后的数据 第一个会话进行回滚 =====> 回滚之后,没有修改 总结:hbase是基于hadoop的一个提供随机定位和实时读写的大表数据库 配置hbase本地模式: ================================= 1、tar开 tar -xzvf hbase-1.2.6.tar.gz -C /soft 2、创建符号链接 ln -s hbase-1.2.6 hbase 3、配置环境变量 sudo nano /etc/profile,添加 # hbase环境变量 export HBASE_HOME=/soft/hbase export PATH=$PATH:$HBASE_HOME/bin 3.5、使环境变量生效: source /etc/profile 4、hbase-env.sh export JAVA_HOME=/soft/jdk 5、hbase-site.xml <configuration> <property> <name>hbase.rootdir</name> <value>file:///home/centos/hbase</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/home/centos/hbase/zk</value> </property> </configuration> 6、启动hbase: start-hbase.sh 7、打开hbase的webUI: http://s101:16010 8、停止hbase进程: stop-hbase.sh 配置hbase的完全分布式: ======================================================== 1、修改hbase-site.xml <configuration> <!-- 开启hbase的集群模式 --> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 将hbase的工作目录放在hdfs中 --> <property> <name>hbase.rootdir</name> <value>hdfs://mycluster/user/hbase</value> </property> <!-- zk的工作目录,指定搭建zk指定的工作目录 --> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/home/centos/zk</value> </property> <!-- 指定zk客户端的地址 --> <property> <name>hbase.zookeeper.quorum</name> <value>s102:2181,s103:2181,s104:2181</value> </property> </configuration> 2、编辑hbase-env.sh //配置hbase不使用内置zk export HBASE_MANAGES_ZK=false 3、编辑conf/regionservers文件,修改为 s102 s103 s104 4、将hadoop配置文件夹下的core-site.xml和hdfs-site.xml 拷贝到hbase/conf文件夹 5、分发hbase符号链接以及hbase安装目录 xsync.sh /soft/hbase xsync.sh /soft/hbase-1.2.6 hbase含有两个进程: HMaster //master节点 HRegionServer //slave节点 启动hadoop生态圈各个组件的启动步骤: ====================================================== 1、启动zk 第一种方式:zkServer.sh start 第二种方式:xzk.sh start 2、启动hadoop: 1)先启动zk xzk.sh start 2)启动hadoop start-all.sh = start-dfs.sh + start-yarn.sh 3、启动hive: 1)先启动zk xzk.sh start 2)启动hadoop start-all.sh = start-dfs.sh + start-yarn.sh 3)启动hive或hiveserver2 hive || hiveserver2 4、启动hbase: 1)先启动zk xzk.sh start 2)启动hdfs start-dfs.sh 3)启动hbase start-hbase.sh hbase的HA模式: ======================================== 备份主节点(backup-masters)在hbase/conf文件夹下的backup-masters文件中 nano /soft/hbase/conf/backup-masters,添加 s105 hbase错误处理: ======================================== 问题1:master节点挂掉,而regionserver节点还在启动 解决1-1:hbase-daemons.sh stop regionserver 解决1-2:编写脚本awk,使用kill -9 命令直接杀掉进程 kill -9 `jps | grep HRegionServer | awk '{print $1}'` > /dev/null 2>&1 //输出重定向为空(输出,如错误信息,不打印) 0、切换到root权限 1、脚本编写/usr/local/bin/skill.sh #!/bin/bash kill -9 `jps | grep $1 | awk '{print $1}'` > /dev/null 2>&1 注意:脚本需要添加执行权限 2、将skill.sh脚本分发至其他主机 xsync.sh /usr/local/bin/skill.sh 3、在s101中编写/usr/local/bin/xkill.sh #!/bin/bash if [ $# -gt 1 ] ; then echo use only one param ; exit ; fi if [ $# -lt 1 ] ; then echo use only one param ; exit ; fi for (( i=101 ; i<=105 ; i++ )); do tput setaf 2 echo ================ s$i $1 ================ tput setaf 9 ssh s$i skill.sh $1 done 注意:脚本需要添加执行权限 4、使用方法: xkill.sh + PName eg: xkill.sh HRegionServer awk: awk '{print $1}' //以'\t'对每行进行切割,输出第一个数据 awk -F ',' '{print $1}' //将分隔符变为, 杀死进程:kill PID eg: kill 10529 kill -9 PID //绝杀 查看进程方式: 1、netstat -anop | grep xxx //网络进程 2、jps //java进程 3、ps -Af | grep master //linux进程 start-hbase.sh = hbase-daemon.sh start master + hbase-daemons.sh start regionserver + hbase-daemons.sh start master-backup hbase数据结构: ==================== hbase RDBMS 1、namespace database 2、table table 3、row row 4、col col 5、column family x id name age row1 1 tom 10 hbase中每行自带主键,称之为row id hbase 客户端操作: ==================================== hbase shell //进入hbase客户端 hbase RDBMS 1、列出数据库 list_namespace show databases; 2、查看帮助 help 'command' help show; 3、创建数据库 create_namespace 'ns1' create database d1; 4、删除数据库 drop_namespace 'ns1' drop database d1; 5、创建表 create 'ns1:t1', 'f1', 'f2' create table n1(id int, name varchar(20)) 6、列出表 list_namespace_tables 'ns1' show tables; 7、删除表 drop 'ns1:t1' drop table n1; 8、禁用表 disable 'ns1:t1' x 9、表描述 describe 'ns1:t1' desc n1; 10、添加数据 put 'ns1:t1','row1','f1:id','1' insert into n1 values(1,'tom'); 11、查看数据 scan 'ns1:t1' select * from n1; 12、清空表 truncate 'ns1:t1' truncate n1; HBase的API编程: ======================== 注意:编程之前将hbase-site.xml\core-site.xml\hdfs-site.xml放置在项目中的resource目录下 <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.2.6</version> </dependency> hbase中的数据格式:byte[] /** * 创建数据库 */ @Test public void createDB() throws Exception { //初始化配置信息 //Configuration conf = new Configuration(); Configuration conf = HBaseConfiguration.create(); //入口点,创建连接 Connection conn = ConnectionFactory.createConnection(conf); //得到集群管理员权限,可以对数据库和表进行增删改查 Admin admin = conn.getAdmin(); //通过构建器模式,创建NamespaceDescriptor实例,并设置库名ns2 NamespaceDescriptor nds = NamespaceDescriptor.create("ns2").build(); //NamespaceDecriptor nds = NamespaceDescriptor.create("ns2").build(); //通过管理员创建数据库 admin.createNamespace(nds);//admin.createNamespace(nds); admin.close(); System.out.println("ok"); } /** * 创建表 */ @Test public void createTable() throws Exception { //初始化配置信息 //Configuration conf = new Configuration(); Configuration conf = HBaseConfiguration.create(); //入口点,创建连接 Connection conn = ConnectionFactory.createConnection(conf);//Connection conn = ConnectionFactory.createConnection(conf); //得到集群管理员权限,可以对数据库和表进行增删改查 Admin admin = conn.getAdmin(); //Admin admin = conn.getAdmin(); //初始化tablename对象 TableName tn = TableName.valueOf("ns2:t2"); //TableName tn = TableName.valueOf("ns2:t2"); //得到表描述符 HTableDescriptor table = new HTableDescriptor(tn); HtableDescriptor table = new HTableDesriptor(tn); //得到列族的描述符 HColumnDescriptor cf = new HColumnDescriptor("f1"); HColumnDesciptor cf = new HColumnDescriptor("f1"); HColumnDescriptor cf2 = new HColumnDescriptor("f2"); //在表中添加列族 table.addFamily(cf); table.addFamily(cf2); //开始创建 admin.createTable(table); //admin.createTable(table); admin.close(); System.out.println("ok"); } /** * 添加数据到指定表 */ @Test public void putData() throws Exception { //初始化配置信息 //Configuration conf = new Configuration(); Configuration conf = HBaseConfiguration.create(); //入口点,创建连接 Connection conn = ConnectionFactory.createConnection(conf); //Connection conn = ConnectionFactory.createConnection(conf); //通过getTable方法获取表的实例 Table table = conn.getTable(TableName.valueOf("ns2:t2")); //Table table = conn.getTable(TableName.valueOf("ns2:t2")); //创建put实例 //hbase中任何值,都是以字节数组形式存在的 Put put = new Put(Bytes.toBytes("row1")); //Put = put = new Put(Bytes.toBytes("row1")); //添加列数据 put.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("name"),Bytes.toBytes("tom")); //put.addColum(Bytes.toBytes("f1"),Bytes.toBytes("name"),Bytes.toBytes("tom")); //创建数据 table.put(put); //table.put(put) System.out.println("ok"); conn.close();//conn.coles(); }