Forbruker API-data til Kafka

En trinnvis guide for å innta innhold fra en HTTP-forespørsel eller REST API-svar i Kafka

(6. des. 2020)

Foto av EJ Strat Unsplash

I dagens open source-klima har det blitt vanlig å gjøre data lett tilgjengelige via API-er. Bedrifter som Spotify og Twitter avslører noen av dataene sine som er tilgjengelige for analyse gjennom REST API s. Dette gjør sourcing av data via en HTTP-forespørsel eller REST API stadig mer populær. For å gjøre disse dataene tilgjengelige i en effektiv dataanalyseplattform, må brukerne bygge en slags rørledning for å dirigere data fra kilden til ønsket analyseplattform. Apache Kafka er en elastisk og effektiv måte å hente disse dataene på.

Apache Kafka er en åpen kildekode-distribuert plattform for streaming av hendelser som brukes til høy -ytelsesdatarørledninger, streaminganalyser, dataintegrasjon og oppdragskritiske applikasjoner.

Denne notisboken er et gjennomgangsarbeid i publisering av innholdet i svaret fra en HTTP-forespørsel eller REST API til Kafka. Her antar vi at Kafka-tjenesten ble spunnet opp i en dockercontainer. Docker er en plattform for å utvikle, sende og kjøre applikasjoner. Du kan lese mer om docker her .

Trinn 1: Les innholdet i REST API-svaret / HTTP-svaret i en JSON-fil ved hjelp av følgende kommando.

Curl er en kommando for å hente eller sende data ved hjelp av URL-syntaks, ved hjelp av hvilken som helst av de støttede protokollene. Noen av de støttede protokollene er HTTP, HTTPS, FTP, IMAP, POP3, SCP, SFTP, SMTP, TFTP, TELNET, LDAP eller FILE.

Vi legger til alternativene:

  • -L (gyldig for HTTP og HTTPS) for å kunne gjøre curl på nytt om forespørselen på det nye stedet hvis serveren rapporterer at den forespurte siden har flyttet til et annet sted (angitt med en Location: header og et 3XX-svar kode). Når autentisering brukes, sender curl bare legitimasjonen til den første verten. Hvis en viderekobling fører krøll til en annen vert, vil den ikke kunne fange opp bruker + passord. Du kan begrense antall viderekoblinger som skal følges ved å bruke alternativet – max-redirs.
  • -o assessering-forsøk-nestet.json å skrive utdata til denne filen i stedet for stdout
  • Så ga vi https://goo.gl/ME6hjp , URL-en vi vil motta data fra.
curl -L -o assessment-attempts-nested.json 
https://goo.gl/ME6hjp

Resultatet ser ut 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

Trinn 2 : Bruk jq til å endre måten vi leser i JSON-filen vi fylte ut med krøllutgang i trinn 1 og test det med katt.

Katten kommando sammenføyer filer og skriver ut på standardutdata.

Vi gir filnavn (e) vi ønsker å sammenkoble, eller standardinngang, til standardutdata. Uten FIL, eller når FIL er -, leser den standardinngangen.

| (pipe) gjør at standardutgangen til kommando 1 (kommandoen før |) kan være standardinngangen for kommando 2 (kommandoen etter |). Så vårt sammenhengende resultat fungerer som en inngang til jq ‘.’

jq er en lett og fleksibel JSON-prosessor med kommandolinje. Den lar deg enkelt kutte og filtrere og kartlegge og transformere strukturerte data. ‘. []’ Ruller ut matrisen og trekker ut indeksen i matrisen som en linje / rad og -c bevarer fargen fra jq-formatering. Så jq . [] -C lar oss skille ut hver indeks i JSON-matrisen til en ny linje og bevare fargen på formateringen gitt av jq.

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

Trinn 3: For å se hvor mange linjer (som vil være hvor mange meldinger vi publiserer til Kafka ) resultat fra kommandoen vår i trinn 2.

Legge til | wc -l lar oss ta standardutdata fra kommandoen i trinn 2, som er de jq-formaterte og ekstraherte linjene fra array JSON til neste kommando som input. Neste kommando er wc -l. wc skriver ut antall nye linjer fordi -l er gitt som et alternativ som spesifiserer ny linje.

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

Resultatet skal være antall linjer, for eksempel:

3280

Trinn 4: Her tar vi det vi fikk i trinn 2 og publiser det i Kafka-emnet vurderingsforsøk. Her vil vi bruke docker-compose forutsatt at Kafka-tjenesten lanseres ved hjelp av Docker.

docker-compose exec kjører en kommando i beholderen hvis navn er gitt, her container1.

Kommandoen vi kjører er bash -c “cat assessment-tried-nested.json | jq ‘.[] ’-C | kafkacat -P -b kafka: 29092 -t vurderingsforsøk & & echo Produserte 3280 meldinger. ”

  • bash er å starte et skall i beholderen
  • -c er et alternativ for å kunne lese kommandoer fra følgende streng
  • Strengen som følger først sammenføyer innholdet av filvurdering-forsøk-nestet.json til standard utdata.
  • Deretter overføres standardutgangen fra den som standardinngang til neste kommando: jq . [] -c som får alt innholdet i utdataene (formatert som JSON) og trekker ut hver indeks i matrisen til en ny linje.
  • Standardutgangen for den blir deretter sendt som standardinngang til neste kommando: kafkacat – P -b kafka: 29092 -t vurderingsforsøk & & ekko Produserte 3280 meldinger. ”
  • kafkacat -P lanserer verktøyet i produsentmodus. I dette leser kafkacat meldinger fra standardinngang (stdin).
  • -b kafka: 29092 brukes til å spesifisere Kafka-megleren, hvis navn bare er Kafka med verten – begge er konfigurert i docker-compose.yml
  • -t vurderingsforsøk brukes til å spesifisere emnenavnet vi vil publisere til
  • & & brukes til å liste en kommando som vi vil utføre etter den før den har fullført kjøringen
  • ekko Produsert 3280 meldinger. er en melding vi vil vise om den forrige kommandoen for publisering til Kafka har blitt utført. Vi kjente 3280 fra trinn 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 skal se slik ut:

Produced 3280 messages.

Referanser

  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/