Maison développement back-end Golang Utilisez HBase dans le langage Go pour implémenter des applications de base de données NoSQL efficaces

Utilisez HBase dans le langage Go pour implémenter des applications de base de données NoSQL efficaces

Jun 15, 2023 pm 08:56 PM
nosql go语言 hbase

Avec l’avènement de l’ère du big data, le stockage et le traitement de données massives sont particulièrement importants. En termes de bases de données NoSQL, HBase est actuellement une solution largement utilisée. En tant que langage de programmation statiquement fortement typé, le langage Go est de plus en plus utilisé dans des domaines tels que le cloud computing, le développement de sites Web et la science des données en raison de sa syntaxe simple et de ses excellentes performances. Cet article expliquera comment utiliser HBase en langage Go pour implémenter des applications de base de données NoSQL efficaces.

  1. Introduction à HBase

HBase est un système de stockage de données distribué basé sur des colonnes, hautement évolutif et hautement fiable. Il fonctionne sur un cluster Hadoop et peut gérer des tâches de stockage et de traitement de données à très grande échelle. Le modèle de données de HBase est similaire à Bigtable de Google, une base de données NoSQL basée sur des colonnes. HBase présente les caractéristiques suivantes :

  • Basé sur la plateforme informatique distribuée Hadoop, il peut stocker des données au niveau PB sur des milliers de machines.
  • Prend en charge la lecture et l'écriture rapides des données, le stockage et l'accès sont très rapides.
  • Prend en charge plusieurs méthodes d'accès aux données telles que la lecture aléatoire, la lecture par analyse, l'analyse de table complète, etc.
  • Prend en charge le stockage et l'interrogation de données multiversions et peut traiter efficacement les données de séries chronologiques.
  • Prend en charge l'expansion horizontale et peut facilement étendre les capacités de stockage et de traitement.
  • Fournit une série de filtres et d'encodeurs pour prendre en charge le traitement et la transformation des données.
  1. Le langage Go exploite HBase

Le langage Go fournit la bibliothèque Thrift pour implémenter des opérations sur HBase. Thrift est un framework multilingue sous Apache qui peut générer du code dans plusieurs langages, notamment Java, Python, Ruby, C++, etc. Thrift permet aux développeurs de définir des services RPC à l'aide d'un langage de définition simple et de générer du code côté client et côté serveur. Dans le langage Go, vous pouvez utiliser la bibliothèque thriftgo pour le développement.

2.1 Installer Thrift

Avant d'utiliser Thrift, vous devez d'abord installer le compilateur Thrift. Vous pouvez télécharger la version correspondante du compilateur depuis le site officiel de Thrift, la décompresser et l'ajouter aux variables d'environnement.

2.2 Définir l'interface Thrift de HBase

Le fichier de définition Thrift est appelé IDL (Interface Definition Language, langage de définition d'interface). Le fichier d'interface Thrift de HBase est Hbase.thrift. Il peut être téléchargé depuis la documentation officielle ou depuis github via la commande git clone.

$ git clone https://github.com/apache/hbase

Toutes les définitions d'interface Thrift de HBase peuvent être trouvées dans le fichier Hbase.thrift, et nous pouvons choisir de les utiliser selon nos besoins. Par exemple, ce qui suit est une définition d'interface qui répertorie les tables :

struct TColumnDescriptor {

1: required binary name,
2: binary value,
3: bool __isset.value,
4: optional CompressionType compression,
5: optional int32 maxVersions,
6: optional int32 minVersions,
7: optional int32 ttl,
8: optional bool inMemory,
9: optional BloomType bloomFilterType,
10: optional int32 scope,
11: optional bool __isset.compression,
12: optional bool __isset.maxVersions,
13: optional bool __isset.minVersions,
14: optional bool __isset.ttl,
15: optional bool __isset.inMemory,
16: optional bool __isset.bloomFilterType,
17: optional bool __isset.scope
Copier après la connexion

}

TColumnDescriptor peut être considéré comme la définition d'une famille de colonnes, qui comprend le nom de la famille de colonnes, le type de compression, la version maximale et le délai d'expiration. , ainsi que le stockage en mémoire et d'autres propriétés. En langage Go, vous devez utiliser le compilateur Thrift pour compiler le fichier Hbase.thrift en code du langage Go. La bibliothèque thriftgo doit être installée avant la compilation.

$ go get -u github.com/apache/thrift/lib/go/thrift

Ensuite, exécutez la commande suivante dans le répertoire HBase pour générer le code de langue Go.

$ thrift --gen go src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift

Après avoir exécuté la commande, vous verrez tout le code de langue Go généré dans le répertoire gen-go généré document.

2.3 Connexion au serveur HBase

Pour vous connecter au serveur HBase, vous devez créer un lien de transport et utiliser un pool de connexions pour gérer le lien. Le pool de connexions peut gérer plusieurs liaisons de transport et la réutilisation de ces liaisons peut améliorer le débit global. Voici un exemple de code pour se connecter à HBase :

package main

import (

"context"
"fmt"
"sync"

"git.apache.org/thrift.git/lib/go/thrift"
"hbase"
Copier après la connexion

)

type pool struct {

hosts    []string         // HBase服务器地址列表
timeout  thrift.TDuration // 连接超时时间
size     int              // 连接池大小
pool     chan *conn       // 连接池
curConns int              // 当前连接池中的连接数

lock sync.RWMutex
Copier après la connexion

}

type conn struct {

trans hbase.THBaseServiceClient // HBase客户端
used  bool                      // 是否被使用
Copier après la connexion

}

// NewPool initialise le pool de connexion
func NewPool(hosts []string, timeout int, size int) *pool {

p := &pool{
    hosts:    hosts,
    timeout:  thrift.NewTDuration(timeout * int(thrift.MILLISECOND)),
    size:     size,
    pool:     make(chan *conn, size),
    curConns: 0,
}

p.lock.Lock()
defer p.lock.Unlock()

for i := 0; i < size; i++ {
    p.newConn()
}

return p
Copier après la connexion

}

// AddConn Ajouter une connexion
func (p *pool) AddConn() {

p.lock.Lock()
defer p.lock.Unlock()

if p.curConns < p.size {
    p.newConn()
}
Copier après la connexion

}

// Fermer Fermer la connexion Pool
func (p *pool) Close() {

p.lock.Lock()
defer p.lock.Unlock()

for i := 0; i < p.curConns; i++ {
    c := <-p.pool
    _ = c.trans.Close()
}
Copier après la connexion

}

// GetConn Obtenir la connexion
func (p pool) GetConn() (conn, erreur) {

select {
case conn := <-p.pool:
    if conn.used {
        return nil, fmt.Errorf("Connection is already in use")
    }

    return conn, nil
default:
    if p.curConns >= p.size {
        return nil, fmt.Errorf("Connection pool is full")
    }

    p.lock.Lock()
    defer p.lock.Unlock()

    return p.newConn(), nil
}
Copier après la connexion

}

// PutConn Return Connect
func (p pool) PutConn(conn conn) {

conn.used = false
p.pool <- conn
Copier après la connexion

}

// newConn Créer une connexion
func (p pool) newConn() conn {

socket := thrift.NewTSocketTimeout(p.hosts[0], p.timeout)
transport := thrift.NewTFramedTransport(socket)
protocol := thrift.NewTBinaryProtocolTransport(transport, true, true)
client := hbase.NewTHBaseServiceClientFactory(transport, protocol)

if err := transport.Open(); err != nil {
    return nil
}

p.curConns++

return &conn{
    trans: client,
    used:  false,
}
Copier après la connexion

}

Utilisation l'exemple de code ci-dessus, il est possible de créer un pool de connexions pour se connecter à HBase. Après avoir défini des paramètres tels que les hôtes, le délai d'attente et la taille, vous pouvez utiliser la méthode NewPool pour créer un pool de connexions. Les connexions dans le pool de connexions peuvent être obtenues à l'aide de la méthode GetConn et renvoyées par la méthode PutConn.

2.4 Exploiter les données

Après vous être connecté au serveur HBase, vous pouvez utiliser la connexion dans le pool de connexions pour opérer sur les données. Voici quelques exemples d'opérations sur les données :

//Obtenir une liste de tables
func GetTableNames(c *conn) ([]string, error) {

names, err := c.trans.GetTableNames(context.Background())
if err != nil {
    return nil, err
}

return names, nil
Copier après la connexion

}

//Obtenir une ligne de données
func GetRow (c conn, tableName string, rowKey string) (hbase.TRowResult_, erreur) {

// 构造Get请求
get := hbase.NewTGet()
get.Row = []byte(rowKey)
get.TableName = []byte(tableName)

result, err := c.trans.Get(context.Background(), get)
if err != nil {
    return nil, err
}

if len(result.Row) == 0 {
    return nil, fmt.Errorf("Row %s in table %s not found", rowKey, tableName)
}

return result, nil
Copier après la connexion

}

// Écrire une ligne de données
func PutRow(c *conn, tableName string, rowKey string, columns map[ string]map [string][]byte,

         timestamp int64) error {
// 构造Put请求
put := hbase.NewTPut()
put.Row = []byte(rowKey)
put.TableName = []byte(tableName)

for cf, cols := range columns {
    family := hbase.NewTColumnValueMap()

    for col, val := range cols {
        family.Set(map[string][]byte{
            col: val,
        })
    }

    put.ColumnValues[[]byte(cf)] = family
}

put.Timestamp = timestamp

_, err := c.trans.Put(context.Background(), put)
if err != nil {
    return err
}

return nil
Copier après la connexion

}

La méthode GetTableNames peut obtenir une liste de tables, la méthode GetRow peut obtenir une ligne de données et la méthode PutRow peut écrire une ligne de données. a noté que la requête TPut doit être construite dans la méthode PutRow.

  1. Résumé

Cet article présente comment utiliser HBase en langage Go pour implémenter des applications de base de données NoSQL efficaces. De la définition de l'interface Thrift, de la connexion au serveur HBase aux données d'exploitation, il explique étape par étape comment utiliser le langage Go pour faire fonctionner HBase. Grâce aux hautes performances du langage Go et aux fonctionnalités multilingues du framework Thrift, des applications de base de données NoSQL efficaces peuvent être créées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Apr 02, 2025 pm 02:06 PM

La bibliothèque utilisée pour le fonctionnement du numéro de point flottante dans le langage go présente comment s'assurer que la précision est ...

Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Problème de threading de file d'attente dans Go Crawler Colly explore le problème de l'utilisation de la bibliothèque Crawler Crawler dans le langage Go, les développeurs rencontrent souvent des problèmes avec les threads et les files d'attente de demande. � ...

Dans Go, pourquoi les chaînes d'impression avec println et string () ont-elles des effets différents? Dans Go, pourquoi les chaînes d'impression avec println et string () ont-elles des effets différents? Apr 02, 2025 pm 02:03 PM

La différence entre l'impression de chaîne dans le langage go: la différence dans l'effet de l'utilisation de fonctions println et string () est en Go ...

Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Apr 02, 2025 pm 04:12 PM

Quelles bibliothèques de GO sont développées par de grandes entreprises ou des projets open source bien connus? Lors de la programmation en Go, les développeurs rencontrent souvent des besoins communs, ...

Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Apr 02, 2025 pm 04:54 PM

Le problème de l'utilisation de Redessstream pour implémenter les files d'attente de messages dans le langage GO consiste à utiliser le langage GO et redis ...

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Apr 02, 2025 pm 05:09 PM

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Lorsque vous utilisez Goland pour le développement du langage GO, de nombreux développeurs rencontreront des balises de structure personnalisées ...

Quelle est la différence entre la structure de définition des mots clés `var` et« type »dans le langage Go? Quelle est la différence entre la structure de définition des mots clés `var` et« type »dans le langage Go? Apr 02, 2025 pm 12:57 PM

Deux façons de définir les structures dans le langage GO: la différence entre les mots clés VAR et le type. Lorsque vous définissez des structures, GO Language voit souvent deux façons d'écrire différentes: d'abord ...

Pourquoi est-il nécessaire de passer des pointeurs lors de l'utilisation de bibliothèques Go et Viper? Pourquoi est-il nécessaire de passer des pointeurs lors de l'utilisation de bibliothèques Go et Viper? Apr 02, 2025 pm 04:00 PM

GO POINTER SYNTAXE ET ATTENDRE DES PROBLÈMES DANS LA BIBLIOTHÈQUE VIPER Lors de la programmation en langage Go, il est crucial de comprendre la syntaxe et l'utilisation des pointeurs, en particulier dans ...

See all articles