基於 Docker 搭建 Mac 本地 HBase 環境
說起玩大資料,相信很多人都會因為 Apache 全家桶軟體配置而菊花一緊。Docker 的出現,把很多玩大資料就是配機器、配環境的開發者從泥潭中拯救了出來,雖然還不能完全替代線上環境,但是在開發環境,無疑為開發者節約了大量搭建本地環境的時間。比較遺憾的是,我們團隊之前也是沒有獨立的資料測試環境:sweat_smile:,於是把在本地搭建 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
從 ofollow,noindex" target="_blank">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 映象
- 獲取容器映象
docker pull harisekhon/hbase
更多大資料全家桶 Docker 映象可以參見 HariSekhon/Dockerfiles 。
- 啟動容器
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 -p
但是, harisekhon/hbase
修改了預設埠:
# 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 ):
127.0.0.1 myhbase
成功啟動後,就可以在 http://localhost:16010/master-status 檢視 HBase 狀態了:
需要注意的一點是:容器銷燬後,資料也也會被同時銷燬。因此你可以通過 -v YOUR_DIR:/hbase-data
的方式將資料目錄對映到宿主機目錄,防止資料丟失。
編寫測試程式碼
- 建立 table
# 進入容器 docker exec -it hbase1.3.1 /bin/bash /hbase/bin/hbase shell hbase(main):001:0> create 't1', {NAME => 'f1', VERSIONS => 1}
- 讀寫 table
Maven 新增依賴:
<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:
<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()); } } }
擴充套件閱讀
–EOF–