Macos M1 IDEA本地调试 HBase 2.2.2

# 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 启动

  1. java8 模块

  2. 选择hbase-server子项目

  3. 配置HMaster 所在包位置

  4. HMaster启动选项start

  5. JVM参数

    1. 这个在这里

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

启动时,不需要在本地启动Zookeeper

启动时,不需要在本地启动Zookeeper

启动时,不需要在本地启动Zookeeper

启动成功,此处hbase的一些数据生成在了hbase-2.2.2目录下

3. Java API 连接HBase代替 HBase Shell

由于Hbase 2.2.2 的jruby 版本不支持 M1 芯片,详情请看

可以在编译后导入新的Jruby版本使用HBase Shell ,但源码调试比较麻烦

参考博客2

本文暂时使用HBaseUtils 来测试HMaster的连接

这里使用了一个很简单的HBaseUtils

java 复制代码
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方法,看第一次是否创建成功,第二次是否创建失败

相关推荐
:-)1 小时前
idea中的vue文件没有高亮显示
前端·javascript·vue.js·ecmascript·intellij-idea
典典分享指南3 小时前
Windows 自动化踩坑实录
python·intellij-idea·pyqt·emacs·visual studio
你疯了抱抱我3 小时前
【MacOS】自己开发的APP,dock图标圆角 + 调整大小(py2app 版)
macos
就叫_这个吧3 小时前
IDEA本地springcloud项目 接入SkyWalking实现链路追踪
spring cloud·intellij-idea·skywalking
k4m7v2pz5 小时前
Apple Silicon Mac 上用 Wine 跑《重武器老鼠》:从下载到进游戏全流程
macos·wine·老游戏·rosetta 2·mighty rodent·腾讯软件中心
卓怡学长16 小时前
w176基于SpringBoot的医院管理系统
java·spring boot·spring·maven·intellij-idea
吴声子夜歌16 小时前
Java面试——HBase原理及应用
java·面试·hbase
chunmiao303218 小时前
苹果首款2nm芯片M6与M5 Ultra发布,Mac本地跑大模型进入新阶段
macos
guo_wen_qiang1 天前
mac中iTerm有没有类似xshell远程连接服务器的用户名密码方式,不用每次都要输入用户密码
运维·服务器·macos
HySpark1 天前
语音分段策略优化实践:如何解决错误分段引发的级联误差
ide·macos·语音识别·xcode·熙瑾会悟