说起玩大数据,相信很多人都会因为 Apache 全家桶软件配置而菊花一紧。Docker 的出现,把很多玩大数据就是配机器、配环境的开发者从泥潭中拯救了出来,虽然还不能完全替代线上环境,但是在开发环境,无疑为开发者节约了大量搭建本地环境的时间。比较遗憾的是,我们团队之前也是没有独立的数据测试环境?,于是把在本地搭建 HBase 环境整理和记录如下。
系统环境:
- MacBook Pro (Retina, 15-inch, Mid 2015)
- 2.2 GHz Intel Core i7
- 16 GB 1600 MHz DDR3
- macOS 10.13.6
安装 Docker CE for Mac
从Docker Community Edition for Mac下载安装。
Mac 上的 Docker 环境经过 docker-machine/virtualbox 几次变化,如今的 Docker CE 已经支持原生 Mac 环境,因此当前阶段 Docker CE for Mac 就是唯一推荐的 Mac Docker 环境,再也不用通过安装 virtualbox 这种借蛋生鸡的方式了,实在是很赞。此外,现在的 Docker CE 集成了 Kubernetes, 因此本地玩 k8s 也不需要额外进行安装配置。如果你计划以后就是玩 k8s, 那么你以前安装的 Kitematic 也可以卸载掉了。Kitematic 除了一个图形化的 container 管理界面,实在没有什么值得留恋的,因此官方停止其开发无疑是个正确的决定。
获取和启动 HBase Docker 镜像
- 获取容器镜像
1 2 |
docker pull harisekhon/hbase |
更多大数据全家桶 Docker 镜像可以参见 HariSekhon/Dockerfiles。
- 启动容器
1 2 |
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.1 harisekhon/hbase |
参数解释:
-d
: 后台启动。-h
: 容器主机名,必须设置该项并配置 hosts,否则无法连通容器。-p
: 网络端口映射,这里只把要使用的端口(zookeeper端口、HBase Master端口、HBase RegionServer端口等)映射了出来,你可以根据自己需要进行端口映射。常用 HBase端口可以参见下表:
但是,harisekhon/hbase
修改了默认端口:
1 2 3 4 5 6 |
# Stargate 8080 / 8085 # Thrift 9090 / 9095 # HMaster 16000 / 16010 # RS 16201 / 16301 EXPOSE 2181 8080 8085 9090 9095 16000 16010 16201 16301 |
因此,你看到启动参数中的端口参数是那样的。
--name
: 容器别名。
设置hosts (推荐使用 Gas Mask):
1 2 |
127.0.0.1 myhbase |
成功启动后,就可以在 http://localhost:16010/master-status 查看 HBase 状态了:
需要注意的一点是:容器销毁后,数据也也会被同时销毁。因此你可以通过 -v YOUR_DIR:/hbase-data
的方式将数据目录映射到宿主机目录,防止数据丢失。
编写测试代码
- 创建 table
1 2 3 4 5 |
# 进入容器 docker exec -it hbase1.3.1 /bin/bash /hbase/bin/hbase shell hbase(main):001:0> create 't1', {NAME => 'f1', VERSIONS => 1} |
- 读写 table
Maven 添加依赖:
1 2 3 4 5 6 7 8 9 10 11 |
<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase</artifactId> <version>1.3.1</version> </dependency> |
HelloHBase.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
<br />//import org.apache.hadoop.conf.HBaseConfiguration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes; public class HelloHBase { static Configuration conf = null; static { conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum","localhost"); conf.set("hbase.zookeeper.property.clientPort","2181"); conf.set("log4j.logger.org.apache.hadoop.hbase","INFO"); } private static void addData(String tableName, String rowKey, String family, String[] columns, String[] values) { try { Connection connection = ConnectionFactory.createConnection(conf); Table table = connection.getTable(TableName.valueOf(tableName)); Put put = new Put(Bytes.toBytes(rowKey)); for (int i = 0; i < columns.length; i++) { put.addColumn(Bytes.toBytes(family), Bytes.toBytes(columns[i]), Bytes.toBytes(values[i])); } table.put(put); } catch (Exception e) { System.out.println("add data exception:"); e.printStackTrace(); } } private static Result readData(String tableName, String rowKey, String family) { try { Connection connection = ConnectionFactory.createConnection(conf); Table table = connection.getTable(TableName.valueOf(tableName)); Get get = new Get(Bytes.toBytes(rowKey)); get.addFamily(Bytes.toBytes(family)); Result result = table.get(get); return result; } catch (Exception e) { System.out.println("get data exception:"); e.printStackTrace(); } return null; } public static void main(String[] args) { String tableName = "t1"; String family = "f1"; String rowKey = "row1"; System.out.println("add data"); addData(tableName, rowKey, family, new String[] {"c1"}, new String[] {"v1"}); System.out.println("read data"); Result result = readData(tableName, rowKey, family); for (Cell cell: result.listCells()) { System.out.println("family:"+Bytes.toString(cell.getFamilyArray(),cell.getFamilyOffset(),cell.getFamilyLength())); System.out.println("qualifier:"+Bytes.toString(cell.getQualifierArray(),cell.getQualifierOffset(),cell.getQualifierLength())); System.out.println("value:"+Bytes.toString(cell.getValueArray(),cell.getValueOffset(),cell.getValueLength())); System.out.println("Timestamp:"+cell.getTimestamp()); } } } |