当前位置:   article > 正文

docker搭建hbase环境_docker部署hbase

docker部署hbase

    hbase是hadoop生态中的一员,最早搭建hbase,需要先安装hadoop,然后安装zookeeper,再安装hbase。现在通过docker可以直接安装hbase,而且容器中并不需要hadoop。

    安装很简单。直接拉取镜像,然后运行即可。

docker run -d --name hbase -p 2181:2181 -p 16010:16010 -p 16020:16020 -p 16030:16030 harisekhon/hbase

    这里注意一点,对于端口映射,hbase用到了很多端口,有的地方直接使用-P参数,而不是用-p做端口一一映射。 

docker run -d --name hbase -P harisekhon/hbase

    如果通过-P参数,会将容器内部所有监听的端口都映射为随机端口,我们可以看看容器状态:

  1. [root@docker ~]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 748f76bf11f3 harisekhon/hbase "/entrypoint.sh" 31 minutes ago Up 31 minutes 0.0.0.0:32776->2181/tcp, 0.0.0.0:32775->8080/tcp, 0.0.0.0:32774->8085/tcp, 0.0.0.0:32773->9090/tcp, 0.0.0.0:32772->9095/tcp, 0.0.0.0:32771->16000/tcp, 0.0.0.0:32770->16010/tcp, 0.0.0.0:32769->16201/tcp, 0.0.0.0:32768->16301/tcp hbase

    其中,16010端口是hbase提供的webui界面暴露的端口,映射为了32770,我们可以通过虚拟机地址,以及这个端口访问hbase webui。

     到了这里,通过web界面能够看到hbase状态,然后,可以进入容器,运行hbase shell,执行建表,添加数据,扫描数据都没有问题。但是如果外部程序,比如java需要操作hbase,就非常麻烦。

    所以,这里不建议直接使用-P(大写)的方式启动hbase。

    推荐的启动方式:docker run -d --name hbase -p 2181:2181 -p 16010:16010 -p 16020:16020 -p 16030:16030 harisekhon/hbase

    不推荐的启动方式:docker run -d --name -P harisekhon/hbase

    springboot与hbase整合

    1、通过docker搭建hbase环境虽然简单,但是有个问题,就是它的主机映射直接使用的是容器ID,所以,我们外部java程序如果需要连接hbase,需要对容器ID添加到本机的hosts列表中。

192.168.61.150	docker dd13ff2dca8e

    2、引入hbase依赖库,这里,只需要额外引入hbase-client依赖即可。

  1. <dependency>
  2. <groupId>org.apache.hbase</groupId>
  3. <artifactId>hbase-client</artifactId>
  4. <version>2.4.3</version>
  5. </dependency>

   3、配置文件application.properties

  1. hbase.config.hbase.zookeeper.quorum=192.168.61.150
  2. hbase.config.hbase.zookeeper.property.clientPort=2181

   4、配置文件对应Java类,HbaseProperties.java

  1. package com.xx.hbase.config;
  2. import java.util.Map;
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4. @ConfigurationProperties(prefix = "hbase")
  5. public class HbaseProperties {
  6. private Map<String,String> config;
  7. public void setConfig(Map<String, String> config) {
  8. this.config = config;
  9. }
  10. public Map<String, String> getConfig() {
  11. return config;
  12. }
  13. }

    5、HbaseConfig.java

  1. package com.xx.hbase.config;
  2. import java.io.IOException;
  3. import java.util.Map;
  4. import org.apache.hadoop.hbase.HBaseConfiguration;
  5. import org.apache.hadoop.hbase.client.Connection;
  6. import org.apache.hadoop.hbase.client.ConnectionFactory;
  7. import org.apache.hadoop.hbase.client.HBaseAdmin;
  8. import org.springframework.boot.context.properties.EnableConfigurationProperties;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Configuration;
  11. @Configuration
  12. @EnableConfigurationProperties(HbaseProperties.class)
  13. public class HbaseConfig {
  14. private final HbaseProperties props;
  15. public HbaseConfig(HbaseProperties props) {
  16. this.props = props;
  17. }
  18. @Bean
  19. public org.apache.hadoop.conf.Configuration configuration(){
  20. org.apache.hadoop.conf.Configuration conf = HBaseConfiguration.create();
  21. Map<String, String> config = props.getConfig();
  22. config.forEach(conf::set);
  23. return conf;
  24. }
  25. @Bean
  26. public Connection getConnection() throws IOException{
  27. return ConnectionFactory.createConnection(configuration());
  28. }
  29. @Bean
  30. public HBaseAdmin hBaseAdmin() throws IOException {
  31. return (HBaseAdmin) getConnection().getAdmin();
  32. }
  33. }

    6、HbaseService.java

  1. package com.xx.hbase.config;
  2. import java.io.IOException;
  3. import java.util.Map;
  4. import org.apache.hadoop.hbase.Cell;
  5. import org.apache.hadoop.hbase.TableName;
  6. import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
  7. import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
  8. import org.apache.hadoop.hbase.client.Connection;
  9. import org.apache.hadoop.hbase.client.HBaseAdmin;
  10. import org.apache.hadoop.hbase.client.Put;
  11. import org.apache.hadoop.hbase.client.Result;
  12. import org.apache.hadoop.hbase.client.ResultScanner;
  13. import org.apache.hadoop.hbase.client.Scan;
  14. import org.apache.hadoop.hbase.client.Table;
  15. import org.apache.hadoop.hbase.client.TableDescriptor;
  16. import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
  17. import org.apache.hadoop.hbase.util.Bytes;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.stereotype.Service;
  20. @Service
  21. public class HbaseService {
  22. @Autowired
  23. private HBaseAdmin admin;
  24. @Autowired
  25. private Connection connection;
  26. public void createTable(String name,String colFamily) throws IOException {
  27. TableName table = TableName.valueOf(name);
  28. if(admin.tableExists(table)) {
  29. System.out.println("table ["+name+"] exist.");
  30. }
  31. ColumnFamilyDescriptor cfd = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(colFamily))
  32. .setMaxVersions(1).build();
  33. TableDescriptor tableDes = TableDescriptorBuilder.newBuilder(table).setColumnFamily(cfd).build();
  34. admin.createTable(tableDes);
  35. }
  36. public void putData(String name,String colFamily,String rowKey,Map<String, String> data) throws IOException {
  37. TableName table = TableName.valueOf(name);
  38. if(admin.tableExists(table)) {
  39. Table t = connection.getTable(table);
  40. Put put = new Put(Bytes.toBytes(rowKey));
  41. for(Map.Entry<String, String> entry:data.entrySet()) {
  42. put.addColumn(Bytes.toBytes(colFamily), Bytes.toBytes(entry.getKey()), Bytes.toBytes(entry.getValue()));
  43. }
  44. t.put(put);
  45. }else {
  46. System.out.println("table ["+name+"] does not exist.");
  47. }
  48. }
  49. public void getData(String name) throws IOException{
  50. TableName table = TableName.valueOf(name);
  51. Table t = connection.getTable(table);
  52. ResultScanner rs = t.getScanner(new Scan());
  53. for(Result r:rs) {
  54. System.out.println("row:"+new String(r.getRow()));
  55. for(Cell cell:r.rawCells()) {
  56. System.out.println("colFamily:"+Bytes.toString(cell.getFamilyArray(),cell.getFamilyOffset(),cell.getFamilyLength())+""
  57. +",qualifier:"+Bytes.toString(cell.getQualifierArray(),cell.getQualifierOffset(),cell.getQualifierLength())+
  58. ",value:"+Bytes.toString(cell.getValueArray(),cell.getValueOffset(),cell.getValueLength()));
  59. }
  60. }
  61. }
  62. }

    7、springboot启动类

  1. package com.xx.hbase;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class HbaseApp {
  6. public static void main(String[] args) {
  7. SpringApplication.run(HbaseApp.class, args);
  8. }
  9. }

    8、hbase单元测试类

  1. package com.xx.mybatis;
  2. import java.io.IOException;
  3. import java.util.Map;
  4. import org.apache.hbase.thirdparty.org.apache.commons.collections4.map.HashedMap;
  5. import org.junit.Test;
  6. import org.junit.runner.RunWith;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.boot.test.context.SpringBootTest;
  9. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  10. import com.xx.hbase.HbaseApp;
  11. import com.xx.hbase.config.HbaseService;
  12. @SpringBootTest(classes = HbaseApp.class)
  13. @RunWith(SpringJUnit4ClassRunner.class)
  14. public class HbaseTest {
  15. @Autowired
  16. private HbaseService hbaseService;
  17. @Test
  18. public void createTable() {
  19. try {
  20. hbaseService.createTable("stu", "info");
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. @Test
  26. public void putData() {
  27. String name = "stu";
  28. String colFamily = "info";
  29. String rowKey = "2";
  30. Map<String, String> data = new HashedMap<>();
  31. data.put("name", "bbb");
  32. data.put("email", "bb@126.com");
  33. try {
  34. hbaseService.putData(name, colFamily, rowKey, data);
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. @Test
  40. public void getData() {
  41. try {
  42. hbaseService.getData("stu");
  43. } catch (IOException e) {
  44. // TODO Auto-generated catch block
  45. e.printStackTrace();
  46. }
  47. }
  48. }

    这里单元测试类,没有使用断言,只是调用了一下建表,插入数据,查询数据三个方法,证明java调用hbase接口操作hbase是没有问题的。 

    9、在docker容器中操作hbase

    总结:

         1、启动容器,不要使用-P随机端口映射,这样对后续java外部程序接入hbase造成很大麻烦。

         2、docker启动的hbase,使用了容器ID作为host,所以如果是外部程序要接入hbase,需要在本机hosts中加入容器ID对应的主机映射。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/549430
推荐阅读
相关标签
  

闽ICP备14008679号