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; } }