# 1. 前提
执行
mvn clean package assembly:single -DskipTests
没问题,并在hbase-assembly/target目录下生成hbase-2.2.2-bin.tar.gz 文件夹
证明Maven 下载依赖没问题
1.1 报错 1
这里应该是报错找不到
com.google.protobuf:protoc:exe:osx-aarch_64:3.5.1
可能存在问题的点是protocol 下载时,需要将总pom.xml文件和hbase-protocal(应该是)目录下的
<configuration>
<protocArtifact>com.google.protobuf:protoc:${external.protobuf.version}:exe:osx-x86_64</protocArtifact>
<protoSourceRoot>${basedir}/src/main/protobuf/</protoSourceRoot>
<clearOutputDirectory>false</clearOutputDirectory>
<checkStaleness>true</checkStaleness>
</configuration>
位置的版本改成
:exe:osx-x86_64
因为protobuf 3.5.1 版本,没有支持M1芯片的版本
## 1.2. 报错2
/Users/kturnura/Code/Source/hbase-2.2.2/hbase-common/src/main/java/org/apache/hadoop/hbase/util/Bytes.java:56:16
java: 程序包sun.misc不存在
修改项目Project Structure
需要将这两个位置的版本都改成Java 8
2. 启动HMaster
将 源码的conf目录移动到hbase-server
项目目录下
将其标记为Resources Root 目录(此处博主已标记)
配置hbase-site.xml
<property>
<!-- # 此配置用来存放HBase的数据目录,你不需要事先创建HBase目录,只用保证其父级目录存在。-->
<!-- # 当然,你也可以随意指定这个目录。-->
<name>hbase.rootdir</name>
<value>/Users/kturnura/Code/Source/hbase-2.2.2</value>
</property>
<property>
<!-- # 此配置是为了跳过版本检查-->
<name>hbase.defaults.for.version.skip</name>
<value>true</value>
</property>
主要是配置hbase.defaults.for.version.skip
属性,否则会有一个报错
配置HMaster 启动
-
java8 模块
-
选择hbase-server子项目
-
配置HMaster 所在包位置
-
HMaster启动选项
start
-
JVM参数
- 这个在这里
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
启动时,不需要在本地启动Zookeeper
启动时,不需要在本地启动Zookeeper
启动时,不需要在本地启动Zookeeper
启动成功,此处hbase的一些数据生成在了hbase-2.2.2目录下
3. Java API 连接HBase代替 HBase Shell
由于Hbase 2.2.2 的jruby 版本不支持 M1 芯片,详情请看
可以在编译后导入新的Jruby版本使用HBase Shell ,但源码调试比较麻烦
本文暂时使用HBaseUtils 来测试HMaster的连接
这里使用了一个很简单的HBaseUtils
package org.apache.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.Pair;
import java.io.IOException;
import java.util.List;
public class HBaseUtils {
private static Connection connection;
static {
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "localhost");
configuration.set("hbase.zookeeper.property.clientPort","2181");
try {
connection = ConnectionFactory.createConnection(configuration);
}catch (IOException e) {
e.printStackTrace();
}
}
/**
* 创建Hbase表
* @param tableName: 表名
* @param columnFamilies : 列族的数组
*/
public static boolean createTable(String tableName, List<String> columnFamilies) {
try {
HBaseAdmin admin = (HBaseAdmin) connection.getAdmin();
if (admin.tableExists(TableName.valueOf(tableName))) {
return false;
}
TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(TableName.valueOf(tableName));
columnFamilies.forEach(columnFamily -> {
ColumnFamilyDescriptorBuilder cfDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamily));
cfDescriptorBuilder.setMaxVersions(1);
ColumnFamilyDescriptor familyDescriptor = cfDescriptorBuilder.build();
tableDescriptor.setColumnFamily(familyDescriptor);
});
admin.createTable(tableDescriptor.build());
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
/**
* 删除Hbase表
* @param tableName: 要删除的表名
*/
public static boolean deleteTable(String tableName) {
try {
HBaseAdmin admin = (HBaseAdmin) connection.getAdmin();
// 删除表前需要先禁用表
admin.disableTable(TableName.valueOf(tableName));
admin.deleteTable(TableName.valueOf(tableName));
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
public static boolean isExist(String tableName) {
try {
HBaseAdmin admin = (HBaseAdmin) connection.getAdmin();
if(!admin.tableExists(TableName.valueOf(tableName))){
// 表不存在,创建表
return false;
}else {
return true;
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 检索全表
*
* @param tableName 表名
*/
public static ResultScanner getScanner(String tableName) {
try {
Table table = connection.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
return table.getScanner(scan);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
String tableName = "RemoteSensing";
// 新建表
System.out.println("Test");
List<String> columnFamilies = Arrays.asList("info", "data");
boolean table = HBaseUtils.createTable(tableName, columnFamilies);
System.out.println("表创建结果:" + table);
}
}
可以运行两次Main方法,看第一次是否创建成功,第二次是否创建失败