nlextract/NLExtract

Omgevingsvariabelen gebruiken voor argumenten

Robkromwijk opened this issue · 5 comments

Wij gebruiken NLextract voor meerdere registraties (BAG, BGT, BRT). Per registratie is er eigen *.args betanden voor de input parameters, waardoor deze op meerdere plaatsen moeten worden bijgehouden. Onze voorkeur zou hebben om met omgevingsvariabelen te werken in onze OTAP-straat, zodat de paramterwaardes maar op 1 plek hoeft worden bijgehouden.

Daarvoor zouden de *.args bestanden deze omgevingsvariabelen moeten kunnen inlezen. Is dit al mogelijk? Zo ja, hoe werkt dit? Zo nee, dan een feature voor op de backlog wat mij betreft.

Het gebruik van environment variabelen wordt al ondersteund. Althans heb dit zelf ooit in een Kubernetes project gebruikt met Stetl (basis ETL framework van NLExtract), zie bijv hier
https://github.com/smartemission/kubernetes-se/tree/master/smartemission/cronjobs.

Het is een faciliteit van Stetl, ik meen zelfs dat e.e.a. gemixed kan worden, dus zowel uit environment als een .args bestand, er zijn wel conventies, om name-clashes te voorkomen:

  • in het .cfg bestand zitten variabelen als {var_naam}
  • de omgevings-variable moet beginnen met stetl_ (of STETL_) dus bijv stetl_var_naam

Dit is een gebruikelijke conventie in de Docker wereld.
Zie net dat dit ook netjes gedocumenteerd is: https://www.stetl.org/en/latest/using.html#reusable-stetl-configs

Hoewel ik niet gecharmeerd ben van het feit dat de omgevingsvariabelen moeten beginnen met stetl_, lost dit inderdaad wel mijn issue op.

Ik kies ervoor om stetl package te installeren en rechtstreeks aan te roepen. Op deze manier kan ik de nl-extract onaangepast laten, zodat bij een eventuele nieuwe versie ik geen aanpassingen binnen deze package hoef te doen

stetl -c $p_nlextract_dir/bgt/etl/conf/etl-imgeo-v2.1.1.cfg -a $p_nlextract_dir/bgt/etl/options/default.args -a host=$DB_HOST -a port=$DB_PORT -a database=$DB_NAME -a user=$DB_USER -a password=$DB_PASSWORD -a schema=$DB_SCHEMA -a input_dir=/Users/robkromwijk/git/basisstatistiek_bronnen/data/bgtnl/20220419 -a spatial_extent=

Helaas krijg ik nog wel foutmelding:

2022-04-20 10:34:32,043 util INFO Found lxml.etree, native XML parsing, fabulous!
2022-04-20 10:34:32,281 util INFO Found GDAL/OGR Python bindings, super!!
2022-04-20 10:34:32,295 main INFO Stetl version = 2.0
2022-04-20 10:34:32,303 main INFO Found args file at: /Users/robkromwijk/git/basisstatistiek_bronnen/syntax/bgtnl/../../src/nlextract-1.5.3/bgt/etl/options/default.args
2022-04-20 10:34:32,304 ETL INFO INIT - Stetl version is 2.0
2022-04-20 10:34:32,304 ETL INFO Config/working dir = /Users/robkromwijk/git/basisstatistiek_bronnen/src/nlextract-1.5.3/bgt/etl/conf
2022-04-20 10:34:32,304 ETL INFO Reading config_file = /Users/robkromwijk/git/basisstatistiek_bronnen/syntax/bgtnl/../../src/nlextract-1.5.3/bgt/etl/conf/etl-imgeo-v2.1.1.cfg
2022-04-20 10:34:32,305 ETL INFO Substituting 11 args in config file from args_dict: ['gfs_template', 'multi_opts', 'database', 'host', 'temp_dir', 'user', 'port', 'schema', 'password', 'spatial_extent', 'input_dir']
2022-04-20 10:34:32,305 ETL INFO Substituting args OK
2022-04-20 10:34:32,306 ETL INFO START
2022-04-20 10:34:32,306 util INFO Timer start: total ETL
2022-04-20 10:34:32,306 chain INFO Assembling Chain: input_sql_pre|schema_name_filter|output_postgres...
2022-04-20 10:34:32,329 input INFO cfg = {'class': 'stetl.inputs.fileinput.StringFileInput', 'file_path': 'sql/create-schema.sql,sql/drop-tables-v2.1.1.sql,sql/drop-final-tables-v2.1.1.sql'}
2022-04-20 10:34:32,329 fileinput INFO file_list=[]
2022-04-20 10:34:32,329 factory ERROR cannot create object instance from class 'stetl.inputs.fileinput.StringFileInput' e=File list is empty!!

Hoewel ik niet gecharmeerd ben van het feit dat de omgevingsvariabelen moeten beginnen met stetl_, lost dit inderdaad wel mijn issue op.

Dit is toch echt de conventie voor veel (Docker) componenten, zeker in een Kubernetes-omgeving. Anders gaan namen "clashen" bijv als een variable "HOST" heet o.i.d. veel voorbeelden bijv Grafana heeft GF_.

Ik kies ervoor om stetl package te installeren en rechtstreeks aan te roepen. Op deze manier kan ik de nl-extract onaangepast laten, zodat bij een eventuele nieuwe versie ik geen aanpassingen binnen deze package hoef te doen

Ik weet niet of dit verstandig is: de Stetl versie die met NLExtract meekomt als Git Submodule is verzekerd te werken met alle NLExtract processen.

stetl -c $p_nlextract_dir/bgt/etl/conf/etl-imgeo-v2.1.1.cfg -a $p_nlextract_dir/bgt/etl/options/default.args -a host=$DB_HOST -a port=$DB_PORT -a database=$DB_NAME -a user=$DB_USER -a password=$DB_PASSWORD -a schema=$DB_SCHEMA -a input_dir=/Users/robkromwijk/git/basisstatistiek_bronnen/data/bgtnl/20220419 -a spatial_extent=

Kan niet zien wat hier fout gaat, maar lijkt alsof the input bestanden niet worden gevonden.

Hi @justb4 ,
inderdaad kunnen de input bestanden niet gevonden worden. De relatieve paden in etl-imgeo-v2.1.1.cfg kunnen niet vinden, omdat stetl niet weet relatief vanaf welke map.

Om de meegeleverde stetl te draaien, moet ik toch onderstaande commando's gebruiken? Stetl lijkt niet gevonden, maar met "pip install stetl" wel. Daarnaast vormen de relatieve paden nog steeds het probleem voor een succesvolle run.

export STETL_HOME=$p_current_dir/../../src/nlextract-1.5.3/externals/stetl

python $STETL_HOME/stetl/main.py -c $p_nlextract_dir/bgt/etl/conf/etl-imgeo-v2.1.1.cfg -a $p_nlextract_dir/bgt/etl/options/default.args -a host=$BSK_DB_HOST -a port=$BSK_DB_PORT -a database=$BSK_DB_NAME -a user=$BSK_DB_USER -a password=$BSK_DB_PASSWORD -a schema=adhoc -a input_dir=/Users/robkromwijk/git/basisstatistiek_bronnen/data/bgtnl/20220419 -a spatial_extent=