API-gegevens in Kafka gebruiken

Een stapsgewijze handleiding om inhoud van een HTTP-verzoek of REST API-reactie in Kafka

(6 december 2020)

Foto door EJ Strat op Unsplash

In het huidige open-source klimaat is het gemeengoed geworden om gegevens direct beschikbaar te maken via APIs. Bedrijven als Spotify en Twitter stellen een deel van hun gegevens beschikbaar voor analyse via REST API s. Dit maakt het sourcen van data via een HTTP-verzoek of REST API steeds populairder. Om deze gegevens beschikbaar te maken in een efficiënt gegevensanalyseplatform, zullen gebruikers een soort pijplijn moeten bouwen om gegevens van de bron naar het gewenste analyseplatform te routeren. Apache Kafka is een veerkrachtige en efficiënte manier om deze gegevens te verzamelen.

Apache Kafka is een open-source gedistribueerd streamingplatform voor evenementen dat wordt gebruikt voor high -prestatiegegevenspijplijnen, streaminganalyses, gegevensintegratie en bedrijfskritische toepassingen.

Dit notitieboekje is een voorbeeld van het publiceren van de inhoud van het antwoord van een HTTP-verzoek of REST API naar Kafka. Hier gaan we ervan uit dat de Kafka-service in een dockercontainer is gesponnen. Docker is een platform voor het ontwikkelen, verzenden en uitvoeren van applicaties. U kunt hier meer lezen over docker.

Stap 1: Lees de inhoud van het REST API-antwoord / HTTP-antwoord in een JSON-bestand met behulp van het volgende commando.

Curl is een commando voor het ophalen of verzenden van gegevens met behulp van de URL-syntaxis, met behulp van van de ondersteunde protocollen. Enkele van de ondersteunde protocollen zijn HTTP, HTTPS, FTP, IMAP, POP3, SCP, SFTP, SMTP, TFTP, TELNET, LDAP of FILE.

We voegen de opties toe:

  • -L (geldig voor HTTP en HTTPS) om curl het verzoek op de nieuwe plaats opnieuw te laten uitvoeren als de server meldt dat de opgevraagde pagina naar een andere locatie is verplaatst (aangegeven met een Location: header en een 3XX-antwoord code). Wanneer authenticatie wordt gebruikt, stuurt curl alleen zijn inloggegevens naar de oorspronkelijke host. Als een omleiding de curl naar een andere host brengt, kan deze de gebruiker + het wachtwoord niet onderscheppen. U kunt het aantal te volgen omleidingen beperken door de optie – max-redirs te gebruiken.
  • -o assessment-pogingen-nested.json om uitvoer naar dit bestand te schrijven in plaats van stdout
  • Vervolgens hebben we https://goo.gl/ME6hjp opgegeven, de URL waarvan we gegevens willen ontvangen.
curl -L -o assessment-attempts-nested.json 
https://goo.gl/ME6hjp

Het resultaat zou er als volgt uitzien:

\% Total \% Received \% Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0100 9096k 100 9096k 0 0 14.6M 0 --:--:-- --:--:-- --:--:-- 14.6M

Stap 2 : Gebruik jq om de manier te wijzigen waarop we lezen in het JSON-bestand dat we hebben ingevuld met de uitvoer van curl in stap 1 en test dat met cat.

De kat commando voegt bestanden en afdrukken samen op de standaarduitvoer.

We leveren de bestandsnaam / -namen die we willen samenvoegen, of standaardinvoer, aan de standaarduitvoer. Zonder FILE, of wanneer FILE – is, leest het de standaardinvoer.

De | (pipe) staat toe dat de standaarduitvoer van commando 1 (het commando vóór de |) de standaardinvoer is voor commando 2 (het commando na de |). Dus ons aaneengeschakelde resultaat fungeert als een invoer voor jq ‘.’

jq is een lichtgewicht en flexibele JSON-opdrachtregelprocessor. Hiermee kunt u gemakkelijk segmenteren en filteren en in kaart brengen en gestructureerde gegevens transformeren. ‘. []’ Rolt de array uit en haalt de index in de array eruit als een regel / rij en de -c behoudt de kleur van de jq-opmaak. Dus de jq . [] -C stelt ons in staat om elke index in de array van de JSON in een nieuwe regel te scheiden en de kleur van de opmaak van jq te behouden.

cat assessment-attempts-nested.json | jq ".[]" -c

Stap 3: Om te zien hoeveel regels (dat is hoeveel berichten we naar Kafka publiceren ) resultaat van onze opdracht in stap 2.

Toevoegen | Met wc -l kunnen we onze standaarduitvoer van het commando in stap 2, dat is de jq-geformatteerde en geëxtraheerde regels van array JSON, naar het volgende commando als invoer overnemen. Het volgende commando is wc -l. wc drukt het aantal nieuwe regels af omdat de -l is opgegeven als een optie die een nieuwe regel specificeert.

cat assessment-attempts-nested.json | jq ".[]" -c | wc -l

Het resultaat zou het aantal regels moeten zijn, bijvoorbeeld:

3280

Stap 4: Hier nemen we wat we hebben in Stap 2 en publiceer dat in het Kafka-onderwerp beoordelingspogingen. Hier zullen we docker-compose gebruiken, ervan uitgaande dat de Kafka-service wordt gestart met Docker.

docker-compose exec voert een commando uit in de container waarvan de naam is opgegeven, hier container1.

De opdracht die we uitvoeren is bash -c “cat assessment-pogingen-nested.json | jq ‘.[] ’-C | kafkacat -P -b kafka: 29092 -t assessment-pogingen & & echo Produceerde 3280 berichten.

  • bash is om een ​​shell in de container te starten
  • -c is een optie om commandos uit de volgende string te kunnen lezen
  • De volgende string voegt eerst de inhoud van het bestand assessment-pogingen-nested.json samen in standaarduitvoer.
  • Vervolgens wordt de standaarduitvoer als standaardinvoer doorgegeven aan het volgende commando: jq . [] -c welke haalt alle inhoud van de uitvoer op (geformatteerd als JSON) en extraheert elke index van de array in een nieuwe regel.
  • De standaarduitvoer daarvan wordt dan als standaardinvoer doorgegeven aan het volgende commando: kafkacat – P -b kafka: 29092 -t assessment-pogingen & & echo Produceerde 3280 berichten.
  • kafkacat -P start het hulpprogramma in producer-modus. Hierin leest kafkacat berichten van standaardinvoer (stdin).
  • -b kafka: 29092 wordt gebruikt om de Kafka-makelaar te specificeren, waarvan de naam gewoon Kafka is met de host – die beide zijn geconfigureerd in de docker-compose.yml
  • -t assessment-pogingen wordt gebruikt om de onderwerpnaam te specificeren waarnaar we willen publiceren
  • & & wordt gebruikt om een ​​commando weer te geven dat we willen uitvoeren na het commando voordat het met succes is uitgevoerd
  • echo Geproduceerd 3280 berichten. is een bericht dat we wilt laten zien of het vorige commando om naar Kafka te publiceren met succes is uitgevoerd. We kenden 3280 uit stap 3.
docker-compose exec container1 bash -c "cat assessment-attempts-nested.json | jq ".[]" -c | kafkacat -P -b kafka:29092 -t assessment-attempts && echo "Produced 3280 messages.""

Het resultaat zou er als volgt uit moeten zien:

Produced 3280 messages.

Referenties

  1. https://kafka.apache.org/
  2. https://docs.docker.com/get-started/overview/
  3. https://www.geeksforgeeks.org/curl-command-in-linux-with-examples/
  4. https: / /stedolan.github.io/jq/