09-Protobuf的安装与使用

星期一, 4月 7, 2025 | 2分钟阅读

MyraZ
09-Protobuf的安装与使用

关于Linux系统大数据环境搭建——09-Protobuf的安装与使用。

09-Protobuf的安装与使用

安装

​ 上传、解压。

[root@node01 ~]# tar -zxvf protobuf-2.6.1.tar.gz
[root@node01 ~]# rm protobuf-2.6.1.tar.gz -rf
[root@node01 ~]# mkdir -p /opt/yjx/protobuf-2.6.1

​ 配置、编译、安装。

[root@node01 ~]# yum -y install gcc-c++
[root@node01 ~]# cd protobuf-2.6.1
[root@node01 protobuf-2.6.1]# ./configure --prefix=/opt/yjx/protobuf-2.6.1
[root@node01 protobuf-2.6.1]# make && make install

使用

  • 先编写 Protobuf 语言代码,设置压缩的字段和范围;
  • 执行 bin 目录下的 proto 程序,将 Protobuf 的程序编译为 Java 程序;
  • 使用 HBase Java API 时(加载或者读取),配合 Protobuf 里边的方法一起使用。

编码

​ 新建 vim /root/PhoneRecordProtos.proto 文件,新增以下内容:

package com.yjxxt.hbase.protobuf.util;
option java_outer_classname = "PhoneRecordProtos";
// 每条消息
message PhoneRecord
{
    required string otherphone = 1;
    optional int32 time = 2;
    optional int64 date = 3;
    optional string type = 4;
}
// 每日消息
message PhoneRecordDay
{
	repeated PhoneRecord phoneRecord = 1;
}
// 每月消息
message PhoneRecordMonth
{
	repeated PhoneRecordDay phoneRecordDay = 1;
}

执行

​ cd 到 protobuf 的 bin 目录下 cd /opt/yjx/protobuf-2.6.1/bin ,执行以下命令:

./protoc --java_out=/root --proto_path=/root/ /root/PhoneRecordProtos.proto

​ 将执行后生成的 Java 文件拉取到本地并拷贝至项目。

使用

​ 使用 Protobuf 加载数据和查询数据。

package com.yjxxt.protobuf;
import com.yjxxt.hbase.protobuf.util.PhoneRecordProtos;
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.util.Bytes;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.util.Date;
import java.util.List;
@DisplayName("Protobuf 测试类")
public class PhoneRecordProtobufTest {
    /**
    * HBase 的管理对象
    */
    private Admin admin;
    /**
    * 数据库连接
    */
    private Connection connection;
    /**
    * 表对象
    */
    private Table table;
    /**
    * 表名
    */
    private final static String TABLE_NAME = "t_phone_protobuf";
    /**
    * 列族
    */
    private final static String COLUMN_FAMILY_NAME = "info";
    
    @DisplayName("创建数据库连接并初始化管理类和数据库表")
    @BeforeEach
    public void init() throws IOException {
        // 初始化 HBase 配置类
        Configuration configuration = HBaseConfiguration.create();
        // 创建数据库连接
        connection = ConnectionFactory.createConnection(configuration);
        // 初始化 HBase 管理类
        admin = connection.getAdmin();
        // 获取数据库表
        table = connection.getTable(TableName.valueOf(TABLE_NAME));
    }
    
    @DisplayName("释放 HBase 资源")
    @AfterEach
    public void destory() throws IOException {
        if (table != null) {
        	table.close();
        }
        if (admin != null) {
        	admin.close();
        }
        if (connection != null) {
        	connection.close();
        }
    }
    
    
    @DisplayName("创建表")
    @Test
    public void testCreateTable() throws IOException {
        // 判断表是否存在
        if (admin.tableExists(TableName.valueOf(TABLE_NAME))) {
            System.out.println(TABLE_NAME + " 表已存在");
            return;
        }
        // 构建表
        TableDescriptorBuilder table = TableDescriptorBuilder
        	.newBuilder(TableName.valueOf(TABLE_NAME));
        // 构建列族
        ColumnFamilyDescriptor info = ColumnFamilyDescriptorBuilder
        	.newBuilder(Bytes.toBytes(COLUMN_FAMILY_NAME))
        	.build();
        // 设置列族
        table.setColumnFamily(info);
        // 创建表
        admin.createTable(table.build());
    }
    
    @DisplayName("配合 Protobuf 压缩数据")
    @Test
    public void puts() throws IOException {
        // 创建插入对象
        Put put = new Put("18001128288_20220901000000000".getBytes());
        // 配合 Protobuf 压缩数据
        PhoneRecordProtos.PhoneRecordDay.Builder phoneRecordDay =
        PhoneRecordProtos.PhoneRecordDay.newBuilder();
        // 插入100条通话记录
        for (int i = 100; i < 200; i++) {
            // 配合 Protobuf 创建每一条数据对象
            PhoneRecordProtos.PhoneRecord.Builder phoneRecord =
            PhoneRecordProtos.PhoneRecord.newBuilder();
            phoneRecord.setOtherphone("13812345" + i);
            phoneRecord.setTime(i);
            phoneRecord.setDate(new Date().getTime());
            phoneRecord.setType(String.valueOf(i % 2));
            // 将对象添加到每日记录
            phoneRecordDay.addPhoneRecord(phoneRecord);
        }
        // 将数据写出
        put.addColumn(Bytes.toBytes(COLUMN_FAMILY_NAME), Bytes.toBytes("day"),phoneRecordDay.build().toByteArray());
        // 插入数据
        table.put(put);
    }
    
    @DisplayName("配合 Protobuf 获取压缩数据")
    @Test
    public void gets() throws IOException {
        Get get = new Get(Bytes.toBytes("18001128288_20220901000000000"));
        Result result = table.get(get);
        byte[] value = result.getValue(Bytes.toBytes(COLUMN_FAMILY_NAME), Bytes.toBytes("day"));
        // 配合 Protobuf 解析压缩数据
        PhoneRecordProtos.PhoneRecordDay phoneRecordDay =
        PhoneRecordProtos.PhoneRecordDay.parseFrom(value);
        List<PhoneRecordProtos.PhoneRecord> phoneRecordList = phoneRecordDay.getPhoneRecordList();
        for (PhoneRecordProtos.PhoneRecord phoneRecord : phoneRecordList) {
            long date = phoneRecord.getDate();
            String otherPhone = phoneRecord.getOtherphone();
            int time = phoneRecord.getTime();
            System.out.println(otherPhone + " - " + time + " - " + date);
        }
    }
}

© 2024 - 2025 雪中烛

 

在线工具资源网站

在线工具官网

ProcessOn:👉ProcessOn在线作图

腾讯文档:👉腾讯文档

FlowUs 息流:👉FlowUs 息流

Mermaid Live Editor:👉在线流程图和图表编辑器 - 美人鱼实时编辑器

ME2在线工具(加密工具):👉ME2在线工具-在线开发学习生活工具箱

Textln:👉Textln文本智能云平台-通用文本解析

MinerU:👉MinerU数据提取工具

Crontab:👉Cron Expression Examples - Crontab.guru

正则表达式测试网站:👉regex101: build, test, and debug regex

技术资源网站

技术资源官网

Spring:👉Spring官网

MyBatis中文网 :👉MyBatis 中文网

Redis中文网:👉Redis中文网

Zookeeper:👉Apache ZooKeeper官网

Raft算法:👉Raft Consensus Algorithm官网

Hadoop:👉Apache Hadoop官网

Hive:👉Apache Hive官网

Phoenix:👉Apache Phoenix官网

Bootstrap中文网:👉Bootstrap中文网

Element:👉组件 | Element

Layui :👉Layui - 极简模块化前端 UI 组件库(官方文档)

FreeMarker :👉FreeMarker 中文官方参考手册

ztree树插件: 👉zTree – jQuery 树插件官网

x File Storage:👉x File Storage官网