Konsumera API-data till Kafka

En steg-för-steg-guide för att ta in innehåll från en HTTP-begäran eller REST API-svar till Kafka

(6 dec 2020)

Foto av EJ Strat Unsplash

I dagens open source-klimat har det blivit vanligt att göra data lätt tillgängliga via API: er. Företag som Spotify och Twitter exponerar en del av sin data som är tillgänglig för analys genom REST API s. Detta gör sourcing av data via en HTTP-begäran eller REST API alltmer populär. För att göra dessa data tillgängliga i en effektiv dataanalysplattform måste användarna bygga någon form av pipeline för att dirigera data från källan till önskad analysplattform. Apache Kafka är ett elastiskt och effektivt sätt att källa till dessa data.

Apache Kafka är en plattform för distribution av öppen källkod distribuerad händelse som används för hög -Performance data pipelines, streaming analytics, data integration, and mission-critical applications.

Denna anteckningsbok är en genomgång i publicering av innehållet i svaret från en HTTP-begäran eller REST API till Kafka. Här antar vi att Kafka-tjänsten spunnades upp i en dockercontainer. Docker är en plattform för att utveckla, leverera och köra applikationer. Du kan läsa mer om dockaren här .

Steg 1: Läs innehållet i REST API-svaret / HTTP-svaret i en JSON-fil med följande kommando.

Curl är ett kommando för att få eller skicka data med URL-syntax, med valfri av de protokoll som stöds. Några av de protokoll som stöds är HTTP, HTTPS, FTP, IMAP, POP3, SCP, SFTP, SMTP, TFTP, TELNET, LDAP eller FILE.

Vi lägger till alternativen:

  • -L (giltigt för HTTP och HTTPS) för att kunna göra curl om begäran på den nya platsen om servern rapporterar att den begärda sidan har flyttat till en annan plats (indikerad med en Location: header och ett 3XX-svar koda). När autentisering används skickar curl bara sina referenser till den ursprungliga värden. Om en omdirigering tar krullning till en annan värd kommer den inte att kunna fånga upp användarnas + lösenord. Du kan begränsa antalet omdirigeringar som ska följas med alternativet – max-omdirigeringar.
  • -o bedömning-försök-nestade.json att skriva utdata till den här filen istället för stdout
  • Sedan tillhandahöll vi https://goo.gl/ME6hjp , webbadressen vi vill ta emot data från.
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

Steg 2 : Använd jq för att ändra hur vi läser i JSON-filen som vi fyllde med utdata från curl i steg 1 och testa det med cat.

Katten kommandot sammanfogar filer och skriver ut på standardutmatningen.

Vi tillhandahåller filnamn som vi vill sammanfoga, eller standardinmatning, till standardutmatning. Utan FIL, eller när FILE är – läser den standardinmatningen.

| (pipe) tillåter standardutgången för kommando 1 (kommandot före |) att vara standardingång för kommando 2 (kommandot efter |). Så vårt sammanhängande resultat fungerar som en ingång till jq ‘.’

jq är en lätt och flexibel JSON-processor för kommandoraden. Det låter dig enkelt skära och filtrera och mappa och transformera strukturerad data. ‘. []” Rullar ut matrisen och drar ut indexet i matrisen som en rad / rad och -c bevarar färgen från jq-formatering. Så jq . [] -C tillåter oss att separera ut varje index i JSON-matrisen till en ny rad och bevara färgen på formateringen från jq.

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

Steg 3: För att se hur många rader (vilket är hur många meddelanden vi publicerar till Kafka ) resultat från vårt kommando i steg 2.

Lägga till | wc -l låter oss ta vår standardutmatning från kommandot i steg 2 som är de jq-formaterade och extraherade raderna från array JSON till nästa kommando som inmatning. Nästa kommando är wc -l. wc skriver ut antalet nya rader eftersom -l tillhandahålls som ett alternativ som anger newline.

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

Resultatet ska vara antalet rader, till exempel:

3280

Steg 4: Här tar vi vad vi fick i steg 2 och publicera det i Kafka-ämnet ”bedömningsförsök”. Här kommer vi att använda docker-compose förutsatt att Kafka-tjänsten startas med Docker.

docker-compose exec kör ett kommando i behållaren vars namn ges, här container1.

Kommandot vi kör är bash -c “cat assessment-forsök-nested.json | jq ‘.[] ’-C | kafkacat -P -b kafka: 29092 -t bedömningsförsök & & echo Producerade 3280 meddelanden. ”

  • bash är att starta ett skal i behållaren
  • -c är ett alternativ för att kunna läsa kommandon från följande sträng
  • Strängen som följer sammanfogar först innehållet i filbedömningen-försök-nestade.json till standardutdata.
  • Den skickar sedan standardutgången från den som standardingång till nästa kommando: jq . [] -c som får allt innehåll i utgången (formaterad som JSON) och extraherar ut varje index i matrisen till en ny rad.
  • Standardutmatningen för den skickas sedan som standardingång till nästa kommando: kafkacat – P -b kafka: 29092 -t bedömningsförsök & & echo Producerade 3280 meddelanden. ”
  • kafkacat -P lanserar verktyget i producentläge. I detta läser kafkacat meddelanden från standardinmatning (stdin).
  • -b kafka: 29092 används för att specificera Kafka-mäklaren, vars namn bara är Kafka med värden – som båda är konfigurerade i docker-compose.yml
  • -t bedömningsförsök används för att ange ämnesnamnet som vi vill publicera till
  • & & används för att lista ett kommando som vi vill utföra efter det innan det har slutfört körningen
  • echo Producerade 3280 meddelanden. är ett meddelande vi vill visa om det tidigare kommandot för publicering till Kafka har utförts. Vi visste 3280 från steg 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 ska se ut som följande:

Produced 3280 messages.

Referenser

  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/