2 façons de lire les données de Kafka vers la base de données Hbase en utilisant le mode pont

Lors de la lecture des données, faites attention à la taille de la mémoire du serveur et utilisez la commande pour la vérifier !

Si la mémoire est trop petite, une erreur de lecture se produira.

df 

première méthode

1. Importer les dépendances pom

<dependencies> 
    <dependency> 
        <groupId>junit</groupId> 
        <artifactId>junit</artifactId> 
        <version>4.12</version> 
        <scope>test</scope> 
    </dependency> 
    <dependency> 
        <groupId>org. apache.kafka</groupId> 
        <artifactId>kafka-clients</artifactId> 
        <version>2.0.0</version> 
    </dependency> 
    <dependency> 
        <groupId>org.apache.hbase</groupId> 
        <artifactId>hbase -client</artifactId> 
        <version>1.2.0</version> 
    </dependency> 
</dependencies>

2. Écrivez du code

classe publique HbaseReadKafka{ 

    static int i = 0; 
    connexion de connexion statique ; 

    static { 
        try { 
            Configuration cnf = HBaseConfiguration.create(); 
            cnf.set("hbase.zookeeper.quorum", "192.168.64.128:2181"); 
            conn = ConnectionFactory.createConnection(cnf); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 

    public static void main(String[] args) { 

        Propriétés prop = new Propriétés(); 
        prop.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.64.128:9092"); 
        prop.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "le plus ancien");
        prop.put(ConsumerConfig.GROUP_ID_CONFIG, "cm");
        prop.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); 
        prop.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); 
        prop.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false); 
        KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(prop); 
        consumer.subscribe(Arrays.asList(new String[]{"user_friends_raw"})); 
        while (true) { 
            ConsumerRecords<String, String> records = consumer.poll(Duration.ofSeconds(3)); 
            System.out.println("获取数据:" + records.count() + "====>" + (++i));
            List<Put> puts = new ArrayList<>(); 
            for (ConsumerRecord<String, String> record : records) { 
                //对kafka读取的数据处理 塞入集合
                String[] lignes = record.value().split(",", -1); 
                if (lines.length > 1) { 
                    String[] fids = lignes[1].split(" "); 
                    for (String fid : fids) { 
                        Put put = new Put((lines[0] + "-" + fid).getBytes()); 
                        put.addColumn("base".getBytes(), "userid".getBytes(), lignes[0].getBytes()); 
                        put.addColumn("base".getBytes(), "friendid".getBytes(), fid.getBytes()); 
                        puts.add(put); 
                    } 
                } 
            } 
            essayez { 
                Table htable = conn. 
                htable.put(puts); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
            //Effacer la collection de listes 
            puts.clear(); 
            //Soumission asynchrone 
            consumer.commitAsync(); 
            //Soumission synchrone 
/ / consommateur.commitSync(); 
        } 
} 
    }

Deuxième méthode

Aperçu des types !

 

1 Importer des pompons

   <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-shaded-client</artifactId>
            <version>1.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.2.RELEASE</version>
                <configuration>
                    <mainClass>com.kgc.UserinterestApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

2 Configurer yml

spring: 
  application: 
    nom: intérêt utilisateur 
  kafka: 
    serveurs d'amorçage: 192.168.64.128:9092 
    consommateur: 
        #Désactiver la soumission manuelle 
      activer-auto-commit: faux 
        #Lire le fichier à partir de la première position 
      auto-offset-reset: le plus ancien 
       #Encodage de sérialisation 
      clé -deserializer : org.apache.kafka.common.serialization.StringDeserializer 
      valeur-deserializer : org.apache.kafka.common.serialization.StringDeserializer 
    écouteur : 
      mode ack : manuel_immediate 
serveur : 
  port : 8999

3 Configurer le mode pont

#Ecrire l'interface 1

interface publique FillData<T,E>{ 
    List<T> fillData (List<E> lst); 
}

#Ecrire l'interface 2

/** 
 * Remplir automatiquement les données en fonction des résultats de la requête 
 * @param <T> 
 */ 

public interface FillHbaseData<T> extends FillData<Put,T> { 
    List<Put> fillData(List<T> list); 
} # Interface d'écriture 3


/** 
 * Interface de conversion de format de données basée sur différentes données utilisateur et modèles d'entités entrants 
 * @param <T> 
 */ 
public interface StringToEntity<T>{ 
    List<T> change(String line); 
}

#Ecrire l'interface 4

/** 
 * Les données kafka de l'interface de conversion de données sont converties en formats de données courants 
 * @param <T> 
 */ 
public interface DataChange<T> { 
    List<T> change(String line); 
}

#Écrire la classe abstraite 5 et implémenter l'interface 4

/** 
 *桥梁模式中的抽象角色
 */ 
classe abstraite publique AbstracDataChange<E,T> implémente DataChange<T> { 

    protected FillData<E,T> fillData; 
    protégé StringToEntity<T> stringToEntity ; 
    écrivain protégé Writer<E> ; 

    public AbstracDataChange(FillData<E, T> fillData, StringToEntity<T> stringToEntity, Writer<E>writer) { 
        this.fillData = fillData; 
        this.stringToEntity = stringToEntity ; 
        this.writer = écrivain; 
    } 


    public abstract List<T> change(String line); 

    public abstract void fill(ConsumerRecord<String,String> record,String tableName); 
}

 

#Écrire la classe d'implémentation d'interface 1 pour implémenter l'interface 2

1.1

/** 
 * 处理eventAttendees数据
 */ 
public class EventAttendeesFillDataImp implémente FillHbaseData<EventAttendees> { 

    @Override 
    public List<Put> fillData(List<EventAttendees> list) { 
        List<Put> puts=new ArrayList<>(); 
        list.stream().forEach(eventAttendees -> { 
            Put put = new Put((eventAttendees.getEventid()+eventAttendees.getUserid()+eventAttendees.getAnswer()).getBytes()); 
            put.addColumn("base" .getBytes(),"eventid".getBytes(),eventAttendees.getEventid().getBytes());  
            put.addColumn("base".getBytes(),"userid".getBytes(),eventAttendees.getUserid(). getBytes());
            put.addColumn("base".getBytes(),"answer".getBytes(),eventAttendees.getAnswer(). getBytes()); 
            met. ajouter(mettre); 

        }); 
        retourner des put;
    } 
}

#Écrire la classe d'implémentation d'interface 2 pour implémenter l'interface 2

1.2

public class EventsFillDataImp implémente FillHbaseData<Events> { 
    @Override 
    public List<Put> fillData(List<Events> list) { 
        List<Put> puts=new ArrayList<>(); 
        list.stream().forEach(events -> { 
            Put put=new Put(events.getEventid().getBytes()); 
            put.addColumn("base".getBytes(),"userid".getBytes(),events .getUserid().getBytes()); 
            put.addColumn("base".getBytes(),"starttime".getBytes(),events.getStarttime().getBytes()); 
            put.addColumn("base".getBytes (),"city".getBytes(),events.getCity().getBytes()); 
            put.addColumn("base".getBytes(),"state".getBytes(),events.
            put.addColumn("base".getBytes(),"zip".getBytes(),events.getZip().getBytes()); 
            put.addColumn("base".getBytes(),"country".getBytes(),events.getCountry().getBytes()); 
            put.addColumn("base".getBytes(),"lat".getBytes(),events.getLat().getBytes()); 
            put.addColumn("base".getBytes(),"lng".getBytes(),events.getLng().getBytes()); 
            puts.add(put); 
        }); 
        retourner des put; 
    } 
}

#Écrire la classe d'implémentation d'interface 3 pour implémenter l'interface 2

1.3

/** 
 * Liste des amis des utilisateurs list<Put> 
 */ 
public class UserFriendsFillDataImp implémente FillHbaseData<UserFriends> { 
    @Override 
    public List<Put> fillData(List<UserFriends> list) { 
        List<Put> puts=new ArrayList<>(); 
        list.stream().forEach(userFriends -> { 
            Put put = new Put((userFriends.getUserid()+"-"+userFriends.getFriendid()).getBytes()); 
            put.addColumn("base".getBytes (),"userid".getBytes(), userFriends.getUserid().getBytes()); 
            put.addColumn("base".getBytes(),"friendid".getBytes(), userFriends.getFriendid().getBytes( )); 
            met. ajouter(mettre); 
        }); 
        retourner des put; 
    }
}

#Écrire la classe d'implémentation d'interface 1 pour implémenter l'interface 3

public class EventAttendeesChangeImp implémente StringToEntity<EventAttendees> { 
    /** 
     * Les données sont entrées comme eventid oui peut-être invité non 
     * ex:123,112233 34343,234234 45454,112233 23232 234234,343343 34343 
     * Convertir le format de données en 123 112233 oui ,123 34343 oui,123 234234 peut-être ...... 
     * @param line 
     * @return 
     */ 
    @Override 
    public List<EventAttendees> change(String line) { 
        String[] infos = line.split(",", -1); 
        List<EventAttendees> eas= new ArrayList<>(); 
        //Compte d'abord toutes les personnes qui ont répondu oui 
        if (!infos[1].trim().equals("")&&infos[1]!=null) { 
            Arrays .asList(infos[1].split(" ")).stream()
                    .forEach(yes->{ 
                        EventAttendees eventAttendees = EventAttendees.builder().eventid(infos[0]).userid(yes).answer("yes").build(); 
                        eas.add(eventAttendees); 
                    }); 
        } 
        //Peut-être 
        que si (!infos[2].trim().equals("")&&infos[2]!=null) { 
            Arrays.asList(infos[2].split(" ")). stream() 
                    .forEach(maybe->{ 
                        EventAttendees eventAttendees = EventAttendees.builder().eventid(infos[0]).userid(maybe).answer("maybe").build(); eas 
                        .
        if (!infos[3].trim().equals("")&&infos[3]!=null) { 
            Arrays.asList(infos[3].split(" ")).stream() 
                    .forEach(invité- >{ 
                        EventAttendees eventAttendees = EventAttendees.builder().eventid(infos[0]).userid(invited).answer("invited").build(); 
                        eas.add(eventAttendees); 
                    }); 
        } 
        //计算no的人
        if (!infos[4].trim().equals("")&&infos[4]!=null) { 
            Arrays.asList(infos[4].split(" ")).stream () 
                    .forEach(no->{ 
                        EventAttendees eventAttendees = EventAttendees.builder().eventid(infos[0]).userid(no).
                        eas.add (événementAttendees); 
                    }); 
        } 
        retourner eas; 
    } 
}

#Écrire la classe d'implémentation d'interface 2 pour implémenter l'interface 3

public class EventsChangeImp implémente StringToEntity<Events> { 
    @Override 
    public List<Events> change(String line) { 
        String[] infos = line.split(",", -1); 
        List<Events> events=new ArrayList<>(); 
        Événements event = Events.builder().eventid(infos[0]).userid(infos[1]).starttime(infos[2]) .city(infos[3]).state(infos[4]). 
                zip (infos[5]) 
                .country(infos[6]).lat(infos[7]).lng(infos[8]).build(); 
        events.add(événement); 
        événements de retour ; 
    } 
}

#Écrire la classe d'implémentation d'interface 3   pour implémenter l'interface 3

/** 
 * 将 123123,123435 435455 345345 => 123123,12335 123123,435455 123123,345345 * 
 / 
public class UserFriendsChangeImp implémente StringToEntity<UserFriends> { 
    @Override 
    public List<UserFriends> change(String line) { 
        String[ ] infos = line.split(",",-1); 
        List<UserFriends> ufs=new ArrayList<>(); 
        if(infos.length>=1){ 
            UserFriends userFriends = UserFriends.builder().userid(infos[0]).friendid("").build(); 
            ufs.add(userFriends); 
        }else { 
            Arrays.asList(infos[1].split(" ")).stream() 
                    .forEach(fid -> {
                        UserFriends uf = UserFriends.builder().userid(infos[0]).friendid(fid).build(); 
                        ufs.add(uf); 
                    }); 
        } 
        renvoie les ufs ; 
    } 
}

3.1 Configuration

La classe d'entité DataChangeFillHbaseDatabase termine l'intégration de l'interface

classe publique DataChangeFillHbaseDatabase<T> extends AbstracDataChange<Put,T> { 
    static int count ; 

    public DataChangeFillHbaseDatabase(FillData<Put, T> fillData, StringToEntity<T> stringToEntity, Writer<Put> écrivain) { 
        super(fillData, stringToEntity, écrivain); 
    } 

    @Override 
    public List<T> change(String line) { 
        return stringToEntity.change(line); 
    } 

    @Override 
    public void fill(ConsumerRecord<String,String> record,String tableName) { 
        //读kafka获得的ConsumerRecord 转字符串
        List<Put> puts = fillData.fillData(change(record.value())); 

// puts.forEach( System.out ::
        writer.write(puts,tableName); 
        System.out.println("hu a obtenu les données kafka======>"+count++); 

    } 
}

3.2 Configurer les classes d'entités

# Classe d'entité 1

@Data 
@AllArgsConstructor 
@NoArgsConstructor 
@Builder 
public class EventAttendees { 
    private String eventid ; 
    ID utilisateur de chaîne privée ; 
    réponse de chaîne privée ; 
}

# Classe d'entité 2

@Data 
@AllArgsConstructor 
@NoArgsConstructor 
@Builder 
public class Events { 
    private String eventid; 
    ID utilisateur de chaîne privée ; 
    heure de début de la chaîne privée ; 
    ville privée à cordes ; 
    État de chaîne privé ; 
    Zip de chaîne privé ; 
    pays de chaîne privé ; 
    chaîne privée lat ; 
    chaîne privée lng ; 
} 

# 实体类 3
@Data 
@AllArgsConstructor 
@NoArgsConstructor 
@Builder 
public class UserFriends { 
    private String userid; 
    ID ami de chaîne privé ; 
}

 3.3 Configurer la couche de service pour la lecture et l'écriture de fichiers

# Il s'agit d'un écrivain 
public interface Writer<T> {
    void write(List<T> puts, String tableName); 
}

#Classe d'implémentation d'interface

/** 
 * Acceptez l'ensemble de données list<put> converti et remplissez-le dans la base de données hbase 
 */ 
@Component 
public class HbaseWriter implémente Writer<Put> { 
    @Resource 
    private Connection connection; 
    public void write(List<Put> puts,String tableName) { 
        try { 
            Table table = connection.getTable(TableName.valueOf(tableName)); 
            table.put(puts); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 
}

Classe #KafkaReader

@Component 
public class KafkaReader { 
    @Resource 
    private Writer<Put> écrivain ; 

    @KafkaListener(groupId = "cm", sujets = {"events_raw"}) 
    public void readEventToHbase(ConsumerRecord<String, String> record, Accusé de réception) { 
        AbstracDataChange<Put, Events> eventHandler = new DataChangeFillHbaseDatabase<Events>( 
                new EventsFillDataImp( ), 
                new EventsChangeImp(), 
                écrivain 
        ); 
        eventHandler.fill(enregistrement,"événements"); 
        ack.acknowledge(); 
    } 

    @KafkaListener(groupId = "cm", sujets = {"event_attendees_raw"})
    public void readEventAttendeesToHbase (ConsumerRecord<String, String> record, Accusé de réception) { 
        AbstracDataChange<Put, EventAttendees> eventHandler = new DataChangeFillHbaseDatabase<EventAttendees>( 
                new EventAttendeesFillDataImp(), 
                new EventAttendeesChangeImp(), 
                writer 
        ); 
        eventHandler.fill(record,"eventsattends"); 
        ack.acknowledge(); 
    } 

// @KafkaListener(groupId = "cm", topic = {"user_friends_raw"}) 
    public void readUserFriendsToHbase(ConsumerRecord<String, String> record, Accusé de réception) { 
        AbstracDataChange<Put,
                new UserFriendsFillDataImp(), 
                new UserFriendsChangeImp(), 
                écrivain 
        ); 
        eventHandler.fill(record,"userfriends"); 
        ack.acknowledge(); 
    } 
}

3.4 configuration de base 

@Configuration 
public class HbaseConfig { 
    @Bean 
    public org.apache.hadoop.conf.Configuration getConfig(){ 
        org.apache.hadoop.conf.Configuration cfg = HBaseConfiguration.create(); 
        cfg.set(HConstants.ZOOKEEPER_QUORUM,"192.168.64.128:2181"); 
        retourner cfg ; 
    } 
    @Bean 
    @Scope(value = "prototype") 
    public Connection getConnection(){ 
        Connection connection = null; 
        essayez { 
            connection = ConnectionFactory.createConnection(getConfig()); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
        renvoie la connexion ; 
    }
    @Bean 
    public Supplier<Connection> hBaseConnection(){ 
        return this::getConnection; 
    } 
}

Je suppose que tu aimes

Origine blog.csdn.net/just_learing/article/details/126444470
conseillé
Classement