写在前面

  • 目的是希望借助Docker容器技术,降低HBase基础学习门槛。
  • 即,不需要掌握繁琐的配置过程,就可以基于IDE工具进行​​HBase​​ 相关开发。
  • 毕竟,对于基于开源大数据技术生态体系的公司,HBase还是不可或缺的
  • 此处废话,不可省略!
  • 实验N次,或实现方式复杂,或Docker 容器服务访问失败。
  • 最后, 本就想搭建个人HBase测试环境,没想到绕了一个大圈,回到源点解决了问题。
  • 至于怎么解决的,啊哈, 我不会告诉你的!
  • 你愁啥,就说你呢!

实验材料

  • 虚拟机
  • VMware Workstation - CentOS Linux 7 (Core)
  • Docker环境
  • ​docker -v​
  • ​Docker version 18.09.2, build 6247962​
  • 获取HBase镜像
  • ​docker pull harisekhon/hbase​
  • 镜像结果

创建HBase容器

  • run 命令:
  • ​docker run -d -h myhbase -p 2181:2181 -p 8080:8080 -p 8085:8085 -p 9090:9090 -p 9095:9095 -p 16000:16000 -p 16010:16010 -p 16201:16201 -p 16301:16301 --name hbase1.3 --net=host harisekhon/hbase​
  • 参数具体含义(部分)
  • 其中​​--net host​​ 参数为核心,即使用网络与宿主机一样。

参数

作用

-d

后台运行容器,并返回容器ID

-h

指定容器的hostname

-p

端口映射,格式为:主机(宿主)端口:容器端口

–name

为容器指定一个名称

–net

指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型

  • 参数具体含义(详细)

访问效果

  • 查看容器状态信息​​docker ps​
  • eclipse + hbase(Docker镜像) 本地开发环境搭建(一)_docker


  • HBase UI
  • eclipse + hbase(Docker镜像) 本地开发环境搭建(一)_eclipse_02

  • 查看容器元数据信息(部分)
  • 查看命令​​docker inspect 容器ID/name​
  • 部分配置结果
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "host",
"PortBindings": {
"16000/tcp": [{"HostIp": "","HostPort": "16000"}],
"16010/tcp": [{"HostIp": "","HostPort": "16010"}],
"16201/tcp": [{"HostIp": "","HostPort": "16201"}],
"16301/tcp": [{"HostIp": "","HostPort": "16301"}],
"2181/tcp": [{"HostIp": "","HostPort": "2181"}],
"8080/tcp": [{"HostIp": "","HostPort": "8080"}],
"8085/tcp": [{"HostIp": "","HostPort": "8085"}],
"9090/tcp": [{"HostIp": "","HostPort": "9090"}],
"9095/tcp": [{"HostIp": "","HostPort": "9095"}]},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},

HelloHBase测试

  • Eclipse(IDE)开发代码
package com.kngines;

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Durability;
import org.apache.hadoop.hbase.client.HBaseAdmin;

public class HelloHBase {
static Configuration conf = null;
static {
conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "192.168.232.128");
conf.set("hbase.zookeeper.property.clientPort", "2181");
conf.set("hbase.master", "192.168.232.128:16000");
}

public static void main(String[] args) {
createNamespaceAndCreateTable("HadoopHbase:InsertCSV");
}

@SuppressWarnings("deprecation")
public static void createNamespaceAndCreateTable(String tablename) {
HBaseAdmin admin = null; // 通过HBaseAdmin管理员加载配置文件
try {
admin = new HBaseAdmin(conf);
// Namespace指的是一个 表的逻辑分组 ,同一组中的表有类似的用途
admin.createNamespace(NamespaceDescriptor.create("HadoopHbase").build());
} catch (IOException e) {
e.printStackTrace();
}

// tab_name HadoopHbase:InsertCSV
HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tablename));

// 设置写WAL日志的级别,为同步写WAL。安全性较高,一定程度影响性能。
tableDesc.setDurability(Durability.ASYNC_WAL);
HColumnDescriptor hcd = new HColumnDescriptor("info");
tableDesc.addFamily(hcd);

try {
if (admin.tableExists(TableName.valueOf(tablename))) {
System.out.println("++++ " + tablename + " exists.");
} else {
admin.createTable(tableDesc);
System.out.println("++++ HadoopHbase:InsertCSV is created successfully.");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 关闭HBaseAdmin进程
admin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
  • 执行结果
16:59:35.463 [main-SendThread(192.168.232.128:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x1694217d4e4001e, packet:: clientPath:null serverPath:null finished:false header:: 6,8  replyHeader:: 6,390,0  request:: '/hbase,F  response:: v{'meta-region-server,'rs,'splitWAL,'backup-masters,'table-lock,'flush-table-proc,'master-maintenance,'online-snapshot,'switch,'master,'running,'draining,'namespace,'hbaseid,'table} 
++++ HadoopHbase:InsertCSV is created successfully.
16:59:36.242 [main] DEBUG org.apache.zookeeper.ZooKeeper - Closing session: 0x1694217d4e4001e
16:59:36.242 [main] DEBUG org.apache.zookeeper.ClientCnxn - Closing client for session: 0x1694217d4e4001e
16:59:36.247 [main-SendThread(192.168.232.128:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x1694217d4e4001e, packet:: clientPath:null serverPath:null finished:false header:: 7,-11 replyHeader:: 7,394,0 request:: null response:: null
16:59:36.247 [main] DEBUG org.apache.zookeeper.ClientCnxn - Disconnecting client for session: 0x1694217d4e4001e
16:59:36.247 [main] INFO org.apache.zookeeper.ZooKeeper - Session: 0x1694217d4e4001e closed
16:59:36.248 [main-EventThread] INFO org.apache.zookeeper.ClientCnxn - EventThread shut down
  • HBase 中结果
  • eclipse + hbase(Docker镜像) 本地开发环境搭建(一)_eclipse_03


参考文章

  • 实验失败
  • 宿主机IP为192,容器IP为172,域名等解析失败
  • 有时间可以了解学习下
  • 实验失败
  • 有关增加网桥等,个人感觉繁琐,有难度