

In de vorige twee blogposts van deze serie zijn het onderzoek en het maken van een ETL-pipeline met behulp van Singer aan bod gekomen. In dit derde en laatste deel, richten we ons op hoe we de pijplijn meer cloud-native kunnen maken.
Pipeline
We kwamen de naam Pipelinewise al tegen tijdensons onderzoek toen we op zoek waren naar Singer taps en targets. Tijdens die zoektocht vonden we de Pipelinewise Transform Field stapen de Pipelinewise Target S3 CSV target, die worden gebruikt in onze op Singer gebaseerde pipeline-oplossing.
Op de website van Pipelinewise staat het volgende
PipelineWise is een Data Pipeline Framework dat gebruik maakt van de Singer.io specificatie om data op te nemen en te repliceren van verschillende bronnen naar verschillende bestemmingen.
Gebouwd met ELT in gedachten: PipelineWise past in het ELT landschap en is geen traditionele ETL tool. PipelineWise streeft ernaar de gegevens van de bron naar een Analytics-Data-Store te reproduceren in een formaat dat zo dicht mogelijk bij het oorspronkelijke ligt. Sommige kleine laadtijd transformaties worden ondersteund, maar complexe mapping en joins moeten worden gedaan in de Analytics-Data-Store om betekenis te extraheren.
PipelineWise is een Data Pipeline Framework dat gebruikmaakt van de Singer.io-specificatie om gegevens van verschillende bronnen op te nemen en te repliceren naar verschillende bestemmingen.
Gebouwd met ELT in gedachten: PipelineWise past in het ELT landschap en is geen traditionele ETL tool. PipelineWise streeft ernaar de gegevens van de bron naar een Analytics-Data-Store te reproduceren in een formaat dat zo dicht mogelijk bij het oorspronkelijke ligt. Sommige kleine laadtijd transformaties worden ondersteund, maar complexe mapping en joins moeten worden gedaan in de Analytics-Data-Store om er betekenis uit te halen.
Pipelinewise breidt Singer in principe uit van een EL-product naar een ELT-product. De transformatiemogelijkheden zijn beperkt, maar meer dan genoeg voor onze use case. Wat ook meteen opvalt, is de sectie Running in Docker in hun documentatie.

Als we onze Singer-gebaseerde pijplijn kunnen repliceren in Pipelinewise, stelt deze extra Docker-functionaliteit ons in staat om onze volledige oplossing eenvoudig op een cloud native manier uit te voeren. Dat betekent dat we geen moeite hoeven te doen om een of meer aangepaste Docker-containers te bouwen rond onze bestaande tap/transform/target oplossing.
Onze Singer-pijplijn repliceren in Pipelinewise
Zoals waarschijnlijk het geval is voor veel ontwikkelaars deze dagen, was Docker al geïnstalleerd op mijn systeem. Als dat niet het geval is voor jou, volg dan gewoon de installatie-instructies ophun site om het te installeren. Als je eenmaal Docker hebt, is het werken met Pipelinewise zo eenvoudig als het klonen van hun Github repository enhet bouwen van een Docker image. Dit image bevat de benodigde taps & targets.
Om de Singer-pijplijn uit de vorige blogpost te repliceren, hebben we tap-oracle,target-s3-csv entransform-field nodig. De eerste is eigenlijk een Pipelinewise-versie van de Singer tap-oracle. Vreemd genoeg heeft het betere documentatie over de configuratie dan het origineel. Door deze tap te specificeren als een Pipelinewise connector tijdens de docker build, wordt ook automatisch de benodigdeOracle Instant Client geïnstalleerd.
git clone https://github.com/transferwise/pipelinewise.git cd ./pipelinewise docker build --build-arg connectors=tap-oracle,target-s3-csv,transform-field -t pipelinewise:latest . alias pipelinewise="$(pwd)/bin/pipelinewise-docker".
Dit duurt even voordat het klaar is (ongeveer 6 minuten op mijn machine), waarna we de eigenlijke pijplijn kunnen maken. Je kunt je image ook een andere naam geven of een andere versie dan de nieuwste gebruiken. Verander in dat geval de waarden in het bestand bin/pipelinewise-docker. Dit zorgt ervoor dat de alias jouw waarden gebruikt.
pipelinewise init --name anonimization-pipeline
Het bovenstaande commando maakt een nieuwe map aan met de naam anonimization-pipeline in de pipelinewise mapdie is aangemaakt door het uitchecken van het archief. Er staan een aantal voorbeeldbestanden in deze map. Om onze Singer-pijplijn te repliceren, kunnen we ze gewoon allemaal verwijderen, behalve tap_oracle.yml.sample en target_s3_csv.yml.sample. Voor deze 2 bestanden moeten we de extensie.sample verwijderen.
Bewerk nu het tap_oracle.yml bestandzodat het de onderstaande inhoud heeft:
--- id: "oracle" naam: "Oracle Import connector" type: "tap-oracle" db_conn: host: "localhost" port: 1521 sid: "OraDoc" gebruiker: "etl" wachtwoord: "admin123" filter_schemas: "ETL" doel: "s3" schema's: - bron_schema: "ETL" doel_schema: "ETL" tabellen: - tabel_naam: "TEST" replicatie_methode: "FULL_TABLE" transformaties: - kolom: "FIRST_NAME" type: "HASH
Een Pipelinewise tap dient 2 doelen tegelijk. Het is het extractiegedeelte, maar ook, door middel van de sectie transformaties voor een tabel, het transformatiegedeelte van de pijplijn. Bewerk vervolgens het bestand target_s3_csv.yml en geef het de onderstaande inhoud:
--- id: "s3" naam: "S3 Target connector" type: "target-s3-csv" db_conn: aws_access_key_id: "your_own_aws_access_key_id_value" aws_secret_access_key: "your_own_aws_secret_access_key_value" s3_bucket: "anonymized-data-bucket".
Importeer tot slot de pijplijn:
developer@laptop pipelinewise % pipelinewise import --dir anonimization-pipeline time=2021-05-18 11:55:02 logger_name=pipelinewise log_level=INFO message=Profiling mode not enabled time=2021-05-18 11:55:03 logger_name=pipelinewise.cli.config log_level=INFO message=Zoek YAML config bestanden in /app/wrk time=2021-05-18 11:55:03 logger_name=pipelinewise.cli.config log_level=INFO message=LOADING TARGET: target_s3_csv.yml time=2021-05-18 11:55:03 logger_name=pipelinewise.cli.config log_level=INFO message=LOADING TAP: tap_oracle.yml time=2021-05-18 11:55:03 logger_name=pipelinewise.cli.config log_level=INFO message=SAVING CONFIG time=2021-05-18 11:55:03 logger_name=pipelinewise.cli.config log_level=INFO message=SAVING MAIN CONFIG JSON to /root/.pipelinewise/config.json time=2021-05-18 11:55:03 logger_name=pipelinewise.cli.config log_level=INFO message=SAVING TARGET JSONS to /root/.pipelinewise/s3/config.json time=2021-05-18 11:55:03 logger_name=pipelinewise.cli.config log_level=INFO message=SAVING TAP JSONS to /root/.pipelinewise/s3/oracle time=2021-05-18 11:55:03 logger_name=pipelinewise.cli.pipelinewise log_level=INFO message=ACTIVATING TAP STREAM SELECTIONS... [Parallel(n_jobs=-1)]: Using backend ThreadingBackend with 6 concurrent workers. time=2021-05-18 11:55:03 logger_name=pipelinewise.cli.pipelinewise log_level=INFO message=Ontdekken van oracle (tap-oracle) tap in s3 (target-s3-csv) doel... time=2021-05-18 11:55:04 logger_name=pipelinewise.cli.pipelinewise log_level=INFO message=Schrijft nieuw eigenschappenbestand met wijzigingen in /root/.pipelinewise/s3/oracle/properties.json [Parallel(n_jobs=-1)]: Done 1 tasks | elapsed: 0.9s [Parallel(n_jobs=-1)]: Done 1 out of 1 | elapsed: 0.9s finished time=2021-05-18 11:55:04 logger_name=pipelinewise.cli.pipelinewise log_level=INFO message= ------------------------------------------------------- IMPORTING YAML CONFIGS FINISHED ------------------------------------------------------- Total targets to import : 1 Total taps to import : 1 Taps imported successfully : 1 Taps failed to import : [] Runtime : 0:00:01.007921 -------------------------------------------------------
Dit importeert de pijplijn. Het doet ook de tap catalogus ontdekking die we handmatig deden in de vorige aflevering van deze blog post. Wanneer we het pipelinewise status commandouitvoeren, zou onze pijplijn correct geïmporteerd, ingeschakeld en klaar voor gebruik moeten zijn.
developer@laptop pipelinewise % pipelinewise status time=2021-05-18 11:57:40 logger_name=pipelinewise log_level=INFO message=Profiling mode not enabled Tap ID Tap Type Target ID Target Type Enabled Status Last Sync Last Sync Result -------- ---------- ----------- ------------- --------- ------------------- ------------------ oracle tap-oracle s3 target-s3-csv True ready 2021-03-11T14:18:23 success 1 pipeline(s)
De pijplijn uitvoeren
Nu hoeven we alleen nog maar de eigenlijke pijplijn uit te voeren. Doe dit met de pipelinewiserun_tap opdracht:
developer@laptop pipelinewise % pipelinewise run_tap --tap oracle --target s3 time=2021-05-18 12:04:24 logger_name=pipelinewise log_level=INFO message=Profiling mode not enabled time=2021-05-18 12:04:24 logger_name=pipelinewise.cli.pipelinewise log_level=INFO message=Running oracle tap in s3 target time=2021-05-18 12:04:24 logger_name=pipelinewise.cli.pipelinewise log_level=INFO message=Geen tabel beschikbaar die gesynchroniseerd moet worden door fastsync time=2021-05-18 12:04:24 logger_name=pipelinewise.cli.pipelinewise log_level=INFO message=Tabel(s) geselecteerd om te synchroniseren door singer: ['ETL-TEST'] time=2021-05-18 12:04:24 logger_name=pipelinewise.cli.commands log_level=INFO message=Writing output into /root/.pipelinewise/s3/oracle/log/s3-oracle-20210518_120424.singer.log time=2021-05-18 12:04:25 logger_name=pipelinewise.cli.pipelinewise log_level=INFO message= ------------------------------------------------------- TAP RUN SUMMARY ------------------------------------------------------- Status : SUCCES Runtime : 0:00:01.545607 -------------------------------------------------------
De uitvoer laat zien dat onze pijplijn met succes is uitgevoerd. Er is een nieuw CSV-bestand toegevoegd aan onze emmer:
developer@laptop pipelinewise % aws s3 ls s3://anonymized-data-bucket/ --profile your_aws_profile_name 2021-05-18 14:04:26 198 ETL-TEST-20210518T120425.csv 2021-04-13 22:38:50 186 TEST-20210413T223846.csv
Bovendien bevat het bestand de juiste informatie:
developer@laptop pipelinewise % aws s3 cp s3://anonymized-data-bucket/ETL-TEST-20210518T120425.csv --profile your_aws_profile_name - | cat FIRST_NAME,LAST_NAME,PERSON_ID,PHONE a8cfcd74832004951b4408cdb0a5dbcd8c7e52d43f7fe244bf720582e05241da,Doe,1,0499010203
5c5db120cb11bee138ff3143edcbedaead684de7a0ba140e12287d436c5dc487,Doe,2,0499040506
Externe configuratie
Nu hebben we iets dat in staat is om onze pijplijn uit de vorige blogpost te repliceren, maar deze keer met behulp van een Docker-gebaseerde aanpak. Het is nu in staat om te draaien in alle contexten die Docker-images accepteren. Dit varieert van een eenvoudige fysieke server of een compute instance waar je Docker of Docker Compose zelf installeert en draait, tot een container as a service setup zoals Amazon ECS en tot een volledig Kubernetes cluster.
Het enige dat nog ontbreekt om ons cloud native scenario te voltooien, is een externe configuratie voor onze pipeline. We hebben dit nodig om alle waarden door te geven die verschillen tussen omgevingen in plaats van specifieke configuratiebestanden te moeten maken voor elke omgeving.
Gelukkig ondersteunt Pipelinewise dit ook. We hoeven alleen maar de env_var notatie te gebruiken voor elke waarde die we willen injecteren. Hier is een voorbeeld voor de S3-geheimen:
--- id: "s3" naam: "S3 Target connector" type: "target-s3-csv" db_conn: aws_access_key_id: "" aws_secret_access_key: "" s3_bucket: "anonymized-data-bucket".

Als je Docker Compose gebruikt, werkt dit direct goed. Je kunt omgevingsvariabelen opgeven in je docker-compose.yml of in een .env bestandzoals je kunt zien in Sample Project for Docker Development Environment. Om dit lokaal te laten werken, moest ik echter mijn bin/pipelinewise-docker bestandiets wijzigen. Deze wijziging is nodig om omgevingsvariabelen door te geven aan het normale commando op een manier dat de docker die erin draait ze ook gebruikt:
... while [[ $# -gt 0 ]]; do case $1 in --dir) HOST_DIR=$(cd "$(dirname "$2")"; pwd)/$(basename "$2") ARGS="$ARGS --dir $CONT_WORK_DIR" shift shift ;; -e) ENV+="$1 $2 " shift shift ;; *) ARGS="$ARGS $1" shift ;; esac done .... docker run \ --rm \ $ENV \ -v ${HOST_CONFIG_DIR}:${CONT_CONFIG_DIR} \ -v ${HOST_DIR}:${CONT_WORK_DIR} \ ${IMAGE}:${VERSION} \ ${ARGS}
Met de bovenstaande wijzigingen wordt de pipeline-wise import dan:
developer@laptop pipelinewise % pipelinewise import --dir anonimization-pipeline -e "AWS_ACCESS_KEY_ID=your_own_aws_access_key_id_value" -e "your_own_aws_secret_access_key_value=OraDoc"
Conclusie
Deze post heeft laten zien dat de conversie van Singer naar Pipelinewise vrij eenvoudig is. Het geeft ons een Docker-gebaseerd systeem dat eenvoudig lokaal of in de cloud kan worden gebruikt met externe configuratie. Planning is geen onderdeel van Pipelinewise zelf, maaris eenvoudig te realiseren. Afhankelijk van je keuze van implementatie, kun je het doen met een eenvoudige cron of iets als Apache luchtstroom.
Voor mij was dit een interessante POC om te doen. Ik was aangenaam verrast dat ik een aantal eenvoudige tools vond die eenvoudig te gebruiken zijn en aan elkaar kunnen worden gekoppeld. Er waren wat kleine problemen onderweg, maar niets onoverkomelijks.
De enige opmerking die ik heb is dat hoewel Singer en Pipelinewise perfect werken en zullen blijven werken, ze tegenwoordig vooral lijken te worden gebruikt in andere (SaaS) producten. Dat betekent dat de vrije en open delen misschien niet meer zo actief worden ontwikkeld, dus dat is iets om in gedachten te houden.
What others have also read


Bij de ontwikkeling van software kunnen aannames ernstige gevolgen hebben en we moeten altijd op onze hoede zijn. In deze blogpost bespreken we hoe je omgaat met aannames bij het ontwikkelen van software. Stel je voor... je rijdt naar een bepaalde pl
Lees verder

ACA doet veel projecten. In het laatste kwartaal van 2017 deden we een vrij klein project voor een klant in de financiële sector. De deadline voor het project was eind november en onze klant werd eind september ongerust. We hadden er echter alle vert
Lees verder

OutSystems: een katalysator voor bedrijfsinnovatie In het snelle zakelijke landschap van vandaag de dag moeten organisaties innovatieve oplossingen omarmen om voorop te blijven lopen. Er zijn veel strategische technologische trends die cruciale bedri
Lees verderWant to dive deeper into this topic?
Get in touch with our experts today. They are happy to help!

Want to dive deeper into this topic?
Get in touch with our experts today. They are happy to help!

Want to dive deeper into this topic?
Get in touch with our experts today. They are happy to help!

Want to dive deeper into this topic?
Get in touch with our experts today. They are happy to help!


