Forbruge API-data til Kafka

En trinvis vejledning til at indtage indhold fra en HTTP-anmodning eller REST API-svar i Kafka

(6. dec. 2020)

Foto af EJ Strat Uplash

I dagens open source-klima er det blevet almindeligt at gøre data let tilgængelige via APIer. Virksomheder som Spotify og Twitter udsætter nogle af deres data til rådighed til analyse gennem REST API s. Dette gør sourcing af data via en HTTP-anmodning eller REST API mere og mere populær. For at gøre disse data tilgængelige i en effektiv dataanalyseplatform skal brugerne bygge en slags pipeline til routing af data fra kilden til den ønskede analyseplatform. Apache Kafka er en modstandsdygtig og effektiv måde at kilde disse data på.

Apache Kafka er en open source distribueret hændelses streaming platform, der bruges til høj -performance-datarørledninger, streaming-analyse, dataintegration og missionskritiske applikationer.

Denne notesbog er et gennembrud i offentliggørelsen af ​​indholdet af svaret fra en HTTP-anmodning eller REST API til Kafka. Her antager vi, at Kafka-tjenesten blev spundet op i en dockercontainer. Docker er en platform til udvikling, forsendelse og kørsel af applikationer. Du kan læse mere om docker her .

Trin 1: Læs indholdet af REST API-svaret / HTTP-svaret i en JSON-fil ved hjælp af følgende kommando.

Curl er en kommando til at hente eller sende data ved hjælp af URL-syntaks ved hjælp af en hvilken som helst af de understøttede protokoller. Nogle af de understøttede protokoller er HTTP, HTTPS, FTP, IMAP, POP3, SCP, SFTP, SMTP, TFTP, TELNET, LDAP eller FILE.

Vi tilføjer mulighederne:

  • -L (gyldig for HTTP og HTTPS) for at få krølle til at gentage anmodningen på det nye sted, hvis serveren rapporterer, at den anmodede side er flyttet til en anden placering (angivet med en Location: header og et 3XX-svar kode). Når godkendelse bruges, sender curl kun sin legitimationsoplysninger til den oprindelige vært. Hvis en omdirigering tager krølle til en anden vært, kan den ikke opfange bruger + adgangskoden. Du kan begrænse antallet af omdirigeringer, der skal følges, ved hjælp af indstillingen – max-redirs.
  • -o vurdering-forsøg-nested.json til at skrive output til denne fil i stedet for stdout
  • Derefter leverede vi https://goo.gl/ME6hjp , den URL, vi vil modtage data fra.
curl -L -o assessment-attempts-nested.json 
https://goo.gl/ME6hjp

Resultatet ser ud som:

\% 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

Trin 2 : Brug jq til at ændre den måde, vi læser på i JSON-filen, vi udfyldte med output af krølle i trin 1, og test det med kat.

Katten kommando sammenkæder filer og udskriver på standardoutputtet.

Vi leverer filnavn (e) vi vil sammenkæde eller standardinput til standardoutput. Uden FIL, eller når FILE er -, læser den standardindgangen.

| (pipe) tillader standardoutput fra kommando 1 (kommandoen før |) at være standardindgang for kommando 2 (kommandoen efter |). Så vores sammenkædede resultat fungerer som et input til jq .

jq er en let og fleksibel JSON-processor til kommandolinjen. Det giver dig mulighed for let at skære og filtrere og kortlægge og transformere strukturerede data. . [] Udruller arrayet og trækker indekset i arrayet ud som en linje / række, og -c bevarer farven fra jq-formatering. Så jq . [] -C giver os mulighed for at adskille hvert indeks i arrayet af JSON til en ny linje og bevare farven på formateringen leveret af jq.

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

Trin 3: For at se hvor mange linjer (som vil være hvor mange beskeder vi offentliggør til Kafka ) resultat fra vores kommando i trin 2.

Tilføjelse | wc -l lader os tage vores standardoutput fra kommandoen i trin 2, som er de jq-formaterede og udpakkede linjer fra array JSON til den næste kommando som input. Den næste kommando er wc -l. wc udskriver antallet af nye linjer, fordi -l er angivet som en mulighed, der angiver ny linje.

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

Resultatet skal være antallet af linjer, for eksempel:

3280

Trin 4: Her tager vi det, vi fik i trin 2 og offentliggør det i Kafka-emnet vurderingsforsøg. Her bruger vi docker-compose forudsat at Kafka-tjenesten startes ved hjælp af Docker.

docker-compose exec kører en kommando i containeren, hvis navn er angivet, her container1.

Den kommando, vi kører, er bash -c “cat assessment-tried-nested.json | jq ‘.[] ’-C | kafkacat -P -b kafka: 29092 -t vurderingsforsøg & & echo Produceret 3280 meddelelser. ”

  • bash er at starte en shell i beholderen
  • -c er en mulighed for at kunne læse kommandoer fra følgende streng
  • Den følgende streng først sammenkæder indholdet af filvurderingen-forsøg-nestet.json til standardoutput.
  • Derefter overføres standardoutputtet fra det som standardindgang til den næste kommando: jq . [] -c som får alt indholdet af output (formateret som JSON) og udtrækker hvert indeks af arrayet til en ny linje.
  • Standardoutputtet for det sendes derefter som standard input til den næste kommando: kafkacat – P -b kafka: 29092 -t vurderingsforsøg & & echo Produceret 3280 meddelelser. ”
  • kafkacat -P lancerer værktøjet i producenttilstand. I dette læser kafkacat meddelelser fra standardinput (stdin).
  • -b kafka: 29092 bruges til at specificere Kafka-mægleren, hvis navn kun er Kafka med værten – som begge er konfigureret i docker-compose.yml
  • -t vurderingsforsøg bruges til at specificere emnenavnet, som vi vil offentliggøre til
  • & & bruges til at liste en kommando, som vi vil udføre efter den, før den har fuldført udførelsen
  • ekko Producerede 3280 meddelelser. er en besked, vi ønsker at få vist, hvis den tidligere kommando for offentliggørelse til Kafka er blevet udført med succes. Vi kendte 3280 fra trin 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.""

Resultatet skulle se sådan ud:

Produced 3280 messages.

Referencer

  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/