jenkins-bot has submitted this change and it was merged. Change subject: Data loader for sending hive data to ES ......................................................................
Data loader for sending hive data to ES Run with: spark-submit --master yarn transferToES.py -s /tmp/source.parquet -u http://my.elastic/ Bug: T113440 Change-Id: Id4df5bffca445b396c875329bce005327110ddab --- A all.dblist A hostmap.json A makeHostnames.py M setup.cfg A transferToES.py 5 files changed, 1,907 insertions(+), 1 deletion(-) Approvals: EBernhardson: Looks good to me, approved jenkins-bot: Verified diff --git a/all.dblist b/all.dblist new file mode 100644 index 0000000..71f3eba --- /dev/null +++ b/all.dblist @@ -0,0 +1,892 @@ +aawiki +aawikibooks +aawiktionary +abwiki +abwiktionary +acewiki +advisorywiki +afwiki +afwikibooks +afwikiquote +afwiktionary +akwiki +akwikibooks +akwiktionary +alswiki +alswikibooks +alswikiquote +alswiktionary +amwiki +amwikiquote +amwiktionary +angwiki +angwikibooks +angwikiquote +angwikisource +angwiktionary +anwiki +anwiktionary +arbcom_dewiki +arbcom_enwiki +arbcom_fiwiki +arbcom_nlwiki +arcwiki +arwiki +arwikibooks +arwikimedia +arwikinews +arwikiquote +arwikisource +arwikiversity +arwiktionary +arzwiki +astwiki +astwikibooks +astwikiquote +astwiktionary +aswiki +aswikibooks +aswikisource +aswiktionary +auditcomwiki +avwiki +avwiktionary +aywiki +aywikibooks +aywiktionary +azwiki +azwikibooks +azwikiquote +azwikisource +azwiktionary +azbwiki +barwiki +bat_smgwiki +bawiki +bawikibooks +bclwiki +bdwikimedia +be_x_oldwiki +betawikiversity +bewiki +bewikibooks +bewikimedia +bewikiquote +bewikisource +bewiktionary +bgwiki +bgwikibooks +bgwikinews +bgwikiquote +bgwikisource +bgwiktionary +bhwiki +bhwiktionary +biwiki +biwikibooks +biwiktionary +bjnwiki +bmwiki +bmwikibooks +bmwikiquote +bmwiktionary +bnwiki +bnwikibooks +bnwikisource +bnwiktionary +boardgovcomwiki +boardwiki +bowiki +bowikibooks +bowiktionary +bpywiki +brwiki +brwikimedia +brwikiquote +brwikisource +brwiktionary +bswiki +bswikibooks +bswikinews +bswikiquote +bswikisource +bswiktionary +bugwiki +bxrwiki +cawiki +cawikibooks +cawikimedia +cawikinews +cawikiquote +cawikisource +cawiktionary +cbk_zamwiki +cdowiki +cebwiki +cewiki +chairwiki +chapcomwiki +checkuserwiki +chowiki +chrwiki +chrwiktionary +chwiki +chwikibooks +chwiktionary +chywiki +ckbwiki +cnwikimedia +collabwiki +commonswiki +cowiki +cowikibooks +cowikimedia +cowikiquote +cowiktionary +crhwiki +crwiki +crwikiquote +crwiktionary +csbwiki +csbwiktionary +cswiki +cswikibooks +cswikinews +cswikiquote +cswikisource +cswikiversity +cswiktionary +cuwiki +cvwiki +cvwikibooks +cywiki +cywikibooks +cywikiquote +cywikisource +cywiktionary +dawiki +dawikibooks +dawikiquote +dawikisource +dawiktionary +dewiki +dewikibooks +dewikinews +dewikiquote +dewikisource +dewikiversity +dewikivoyage +dewiktionary +diqwiki +dkwikimedia +donatewiki +dsbwiki +dvwiki +dvwiktionary +dzwiki +dzwiktionary +eewiki +elwiki +elwikibooks +elwikinews +elwikiquote +elwikisource +elwikiversity +elwikivoyage +elwiktionary +emlwiki +enwiki +enwikibooks +enwikinews +enwikiquote +enwikisource +enwikiversity +enwikivoyage +enwiktionary +eowiki +eowikibooks +eowikinews +eowikiquote +eowikisource +eowiktionary +eswiki +eswikibooks +eswikinews +eswikiquote +eswikisource +eswikiversity +eswikivoyage +eswiktionary +etwiki +etwikibooks +etwikimedia +etwikiquote +etwikisource +etwiktionary +euwiki +euwikibooks +euwikiquote +euwiktionary +execwiki +extwiki +fawiki +fawikibooks +fawikinews +fawikiquote +fawikisource +fawikivoyage +fawiktionary +fdcwiki +ffwiki +fiu_vrowiki +fiwiki +fiwikibooks +fiwikimedia +fiwikinews +fiwikiquote +fiwikisource +fiwikiversity +fiwiktionary +fjwiki +fjwiktionary +foundationwiki +fowiki +fowikisource +fowiktionary +frpwiki +frrwiki +frwiki +frwikibooks +frwikinews +frwikiquote +frwikisource +frwikiversity +frwikivoyage +frwiktionary +furwiki +fywiki +fywikibooks +fywiktionary +gagwiki +ganwiki +gawiki +gawikibooks +gawikiquote +gawiktionary +gdwiki +gdwiktionary +glkwiki +glwiki +glwikibooks +glwikiquote +glwikisource +glwiktionary +gnwiki +gnwikibooks +gnwiktionary +gomwiki +gotwiki +gotwikibooks +grantswiki +guwiki +guwikibooks +guwikiquote +guwikisource +guwiktionary +gvwiki +gvwiktionary +hakwiki +hawiki +hawiktionary +hawwiki +hewiki +hewikibooks +hewikinews +hewikiquote +hewikisource +hewikivoyage +hewiktionary +hifwiki +hiwiki +hiwikibooks +hiwikiquote +hiwiktionary +howiki +hrwiki +hrwikibooks +hrwikiquote +hrwikisource +hrwiktionary +hsbwiki +hsbwiktionary +htwiki +htwikisource +huwiki +huwikibooks +huwikinews +huwikiquote +huwikisource +huwiktionary +hywiki +hywikibooks +hywikiquote +hywikisource +hywiktionary +hzwiki +iawiki +iawikibooks +iawiktionary +idwiki +idwikibooks +idwikiquote +idwikisource +idwiktionary +iegcomwiki +iewiki +iewikibooks +iewiktionary +igwiki +iiwiki +ikwiki +ikwiktionary +ilowiki +ilwikimedia +incubatorwiki +internalwiki +iowiki +iowiktionary +iswiki +iswikibooks +iswikiquote +iswikisource +iswiktionary +itwiki +itwikibooks +itwikinews +itwikiquote +itwikisource +itwikiversity +itwikivoyage +itwiktionary +iuwiki +iuwiktionary +jawiki +jawikibooks +jawikinews +jawikiquote +jawikisource +jawikiversity +jawiktionary +jbowiki +jbowiktionary +jvwiki +jvwiktionary +kaawiki +kabwiki +kawiki +kawikibooks +kawikiquote +kawiktionary +kbdwiki +kgwiki +kiwiki +kjwiki +kkwiki +kkwikibooks +kkwikiquote +kkwiktionary +klwiki +klwiktionary +kmwiki +kmwikibooks +kmwiktionary +knwiki +knwikibooks +knwikiquote +knwikisource +knwiktionary +koiwiki +kowiki +kowikibooks +kowikinews +kowikiquote +kowikisource +kowikiversity +kowiktionary +krcwiki +krwiki +krwikiquote +kshwiki +kswiki +kswikibooks +kswikiquote +kswiktionary +kuwiki +kuwikibooks +kuwikiquote +kuwiktionary +kvwiki +kwwiki +kwwikiquote +kwwiktionary +kywiki +kywikibooks +kywikiquote +kywiktionary +labswiki +ladwiki +lawiki +lawikibooks +lawikiquote +lawikisource +lawiktionary +lbewiki +lbwiki +lbwikibooks +lbwikiquote +lbwiktionary +legalteamwiki +lezwiki +lgwiki +lijwiki +liwiki +liwikibooks +liwikiquote +liwikisource +liwiktionary +lmowiki +lnwiki +lnwikibooks +lnwiktionary +loginwiki +lowiki +lowiktionary +lrcwiki +ltgwiki +ltwiki +ltwikibooks +ltwikiquote +ltwikisource +ltwiktionary +lvwiki +lvwikibooks +lvwiktionary +maiwiki +map_bmswiki +mdfwiki +mediawikiwiki +metawiki +mgwiki +mgwikibooks +mgwiktionary +mhrwiki +mhwiki +mhwiktionary +minwiki +miwiki +miwikibooks +miwiktionary +mkwiki +mkwikibooks +mkwikimedia +mkwikisource +mkwiktionary +mlwiki +mlwikibooks +mlwikiquote +mlwikisource +mlwiktionary +mnwiki +mnwikibooks +mnwiktionary +movementroleswiki +mowiki +mowiktionary +mrjwiki +mrwiki +mrwikibooks +mrwikiquote +mrwikisource +mrwiktionary +mswiki +mswikibooks +mswiktionary +mtwiki +mtwiktionary +muswiki +mwlwiki +mxwikimedia +myvwiki +mywiki +mywikibooks +mywiktionary +mznwiki +nahwiki +nahwikibooks +nahwiktionary +napwiki +nawiki +nawikibooks +nawikiquote +nawiktionary +nds_nlwiki +ndswiki +ndswikibooks +ndswikiquote +ndswiktionary +newiki +newikibooks +newiktionary +newwiki +ngwiki +nlwiki +nlwikibooks +nlwikimedia +nlwikinews +nlwikiquote +nlwikisource +nlwikivoyage +nlwiktionary +nnwiki +nnwikiquote +nnwiktionary +noboard_chapterswikimedia +nostalgiawiki +novwiki +nowiki +nowikibooks +nowikimedia +nowikinews +nowikiquote +nowikisource +nowiktionary +nrmwiki +nsowiki +nvwiki +nycwikimedia +nywiki +nzwikimedia +ocwiki +ocwikibooks +ocwiktionary +officewiki +ombudsmenwiki +omwiki +omwiktionary +orwiki +orwikisource +orwiktionary +oswiki +otrs_wikiwiki +outreachwiki +pa_uswikimedia +pagwiki +pamwiki +papwiki +pawiki +pawikibooks +pawiktionary +pcdwiki +pdcwiki +pflwiki +pihwiki +piwiki +piwiktionary +plwiki +plwikibooks +plwikimedia +plwikinews +plwikiquote +plwikisource +plwikivoyage +plwiktionary +pmswiki +pnbwiki +pnbwiktionary +pntwiki +pswiki +pswikibooks +pswiktionary +ptwiki +ptwikibooks +ptwikinews +ptwikiquote +ptwikisource +ptwikiversity +ptwikivoyage +ptwiktionary +qualitywiki +quwiki +quwikibooks +quwikiquote +quwiktionary +rmwiki +rmwikibooks +rmwiktionary +rmywiki +rnwiki +rnwiktionary +roa_rupwiki +roa_rupwiktionary +roa_tarawiki +rowiki +rowikibooks +rowikinews +rowikiquote +rowikisource +rowikivoyage +rowiktionary +rswikimedia +ruewiki +ruwiki +ruwikibooks +ruwikimedia +ruwikinews +ruwikiquote +ruwikisource +ruwikiversity +ruwikivoyage +ruwiktionary +rwwiki +rwwiktionary +sahwiki +sahwikisource +sawiki +sawikibooks +sawikiquote +sawikisource +sawiktionary +scnwiki +scnwiktionary +scowiki +scwiki +scwiktionary +sdwiki +sdwikinews +sdwiktionary +searchcomwiki +sewiki +sewikibooks +sewikimedia +sgwiki +sgwiktionary +shwiki +shwiktionary +simplewiki +simplewikibooks +simplewikiquote +simplewiktionary +siwiki +siwikibooks +siwiktionary +skwiki +skwikibooks +skwikiquote +skwikisource +skwiktionary +slwiki +slwikibooks +slwikiquote +slwikisource +slwikiversity +slwiktionary +smwiki +smwiktionary +snwiki +snwiktionary +sourceswiki +sowiki +sowiktionary +spcomwiki +specieswiki +sqwiki +sqwikibooks +sqwikinews +sqwikiquote +sqwiktionary +srnwiki +srwiki +srwikibooks +srwikinews +srwikiquote +srwikisource +srwiktionary +sswiki +sswiktionary +stewardwiki +stqwiki +strategywiki +stwiki +stwiktionary +suwiki +suwikibooks +suwikiquote +suwiktionary +svwiki +svwikibooks +svwikinews +svwikiquote +svwikisource +svwikiversity +svwikivoyage +svwiktionary +swwiki +swwikibooks +swwiktionary +szlwiki +tawiki +tawikibooks +tawikinews +tawikiquote +tawikisource +tawiktionary +tenwiki +test2wiki +testwiki +testwikidatawiki +tetwiki +tewiki +tewikibooks +tewikiquote +tewikisource +tewiktionary +tgwiki +tgwikibooks +tgwiktionary +thwiki +thwikibooks +thwikinews +thwikiquote +thwikisource +thwiktionary +tiwiki +tiwiktionary +tkwiki +tkwikibooks +tkwikiquote +tkwiktionary +tlwiki +tlwikibooks +tlwiktionary +tnwiki +tnwiktionary +towiki +towiktionary +tpiwiki +tpiwiktionary +transitionteamwiki +trwiki +trwikibooks +trwikimedia +trwikinews +trwikiquote +trwikisource +trwiktionary +tswiki +tswiktionary +ttwiki +ttwikibooks +ttwikiquote +ttwiktionary +tumwiki +twwiki +twwiktionary +tyvwiki +tywiki +uawikimedia +udmwiki +ugwiki +ugwikibooks +ugwikiquote +ugwiktionary +ukwiki +ukwikibooks +ukwikimedia +ukwikinews +ukwikiquote +ukwikisource +ukwikivoyage +ukwiktionary +urwiki +urwikibooks +urwikiquote +urwiktionary +usabilitywiki +uzwiki +uzwikibooks +uzwikiquote +uzwiktionary +vecwiki +vecwikisource +vecwiktionary +vepwiki +vewiki +viwiki +viwikibooks +viwikiquote +viwikisource +viwikivoyage +viwiktionary +vlswiki +votewiki +vowiki +vowikibooks +vowikiquote +vowiktionary +warwiki +wawiki +wawikibooks +wawiktionary +wg_enwiki +wikidatawiki +wikimania2005wiki +wikimania2006wiki +wikimania2007wiki +wikimania2008wiki +wikimania2009wiki +wikimania2010wiki +wikimania2011wiki +wikimania2012wiki +wikimania2013wiki +wikimania2014wiki +wikimania2015wiki +wikimania2016wiki +wikimaniateamwiki +wowiki +wowikiquote +wowiktionary +wuuwiki +xalwiki +xhwiki +xhwikibooks +xhwiktionary +xmfwiki +yiwiki +yiwikisource +yiwiktionary +yowiki +yowikibooks +yowiktionary +zawiki +zawikibooks +zawikiquote +zawiktionary +zeawiki +zerowiki +zh_classicalwiki +zh_min_nanwiki +zh_min_nanwikibooks +zh_min_nanwikiquote +zh_min_nanwikisource +zh_min_nanwiktionary +zh_yuewiki +zhwiki +zhwikibooks +zhwikinews +zhwikiquote +zhwikisource +zhwikivoyage +zhwiktionary +zuwiki +zuwikibooks +zuwiktionary diff --git a/hostmap.json b/hostmap.json new file mode 100644 index 0000000..16ba2fd --- /dev/null +++ b/hostmap.json @@ -0,0 +1,817 @@ +{ + "aa.wikibooks": "aawikibooks", + "aa.wikipedia": "aawiki", + "aa.wiktionary": "aawiktionary", + "ab.wikipedia": "abwiki", + "ab.wiktionary": "abwiktionary", + "ace.wikipedia": "acewiki", + "af.wikibooks": "afwikibooks", + "af.wikipedia": "afwiki", + "af.wikiquote": "afwikiquote", + "af.wiktionary": "afwiktionary", + "ak.wikibooks": "akwikibooks", + "ak.wikipedia": "akwiki", + "ak.wiktionary": "akwiktionary", + "als.wikibooks": "alswikibooks", + "als.wikipedia": "alswiki", + "als.wikiquote": "alswikiquote", + "als.wiktionary": "alswiktionary", + "am.wikipedia": "amwiki", + "am.wikiquote": "amwikiquote", + "am.wiktionary": "amwiktionary", + "an.wikipedia": "anwiki", + "an.wiktionary": "anwiktionary", + "ang.wikibooks": "angwikibooks", + "ang.wikipedia": "angwiki", + "ang.wikiquote": "angwikiquote", + "ang.wikisource": "angwikisource", + "ang.wiktionary": "angwiktionary", + "ar.wikibooks": "arwikibooks", + "ar.wikinews": "arwikinews", + "ar.wikipedia": "arwiki", + "ar.wikiquote": "arwikiquote", + "ar.wikisource": "arwikisource", + "ar.wikiversity": "arwikiversity", + "ar.wiktionary": "arwiktionary", + "arc.wikipedia": "arcwiki", + "arz.wikipedia": "arzwiki", + "as.wikibooks": "aswikibooks", + "as.wikipedia": "aswiki", + "as.wikisource": "aswikisource", + "as.wiktionary": "aswiktionary", + "ast.wikibooks": "astwikibooks", + "ast.wikipedia": "astwiki", + "ast.wikiquote": "astwikiquote", + "ast.wiktionary": "astwiktionary", + "av.wikipedia": "avwiki", + "av.wiktionary": "avwiktionary", + "ay.wikibooks": "aywikibooks", + "ay.wikipedia": "aywiki", + "ay.wiktionary": "aywiktionary", + "az.wikibooks": "azwikibooks", + "az.wikipedia": "azwiki", + "az.wikiquote": "azwikiquote", + "az.wikisource": "azwikisource", + "az.wiktionary": "azwiktionary", + "azb.wikipedia": "azbwiki", + "ba.wikibooks": "bawikibooks", + "ba.wikipedia": "bawiki", + "bar.wikipedia": "barwiki", + "bat-smg.wikipedia": "bat_smgwiki", + "bcl.wikipedia": "bclwiki", + "be-tarask.wikipedia": "be_x_oldwiki", + "be.wikibooks": "bewikibooks", + "be.wikipedia": "bewiki", + "be.wikiquote": "bewikiquote", + "be.wikisource": "bewikisource", + "be.wiktionary": "bewiktionary", + "beta.wikiversity": "betawikiversity", + "bg.wikibooks": "bgwikibooks", + "bg.wikinews": "bgwikinews", + "bg.wikipedia": "bgwiki", + "bg.wikiquote": "bgwikiquote", + "bg.wikisource": "bgwikisource", + "bg.wiktionary": "bgwiktionary", + "bh.wikipedia": "bhwiki", + "bh.wiktionary": "bhwiktionary", + "bi.wikibooks": "biwikibooks", + "bi.wikipedia": "biwiki", + "bi.wiktionary": "biwiktionary", + "bjn.wikipedia": "bjnwiki", + "bm.wikibooks": "bmwikibooks", + "bm.wikipedia": "bmwiki", + "bm.wikiquote": "bmwikiquote", + "bm.wiktionary": "bmwiktionary", + "bn.wikibooks": "bnwikibooks", + "bn.wikipedia": "bnwiki", + "bn.wikisource": "bnwikisource", + "bn.wiktionary": "bnwiktionary", + "bo.wikibooks": "bowikibooks", + "bo.wikipedia": "bowiki", + "bo.wiktionary": "bowiktionary", + "bpy.wikipedia": "bpywiki", + "br.wikipedia": "brwiki", + "br.wikiquote": "brwikiquote", + "br.wikisource": "brwikisource", + "br.wiktionary": "brwiktionary", + "bs.wikibooks": "bswikibooks", + "bs.wikinews": "bswikinews", + "bs.wikipedia": "bswiki", + "bs.wikiquote": "bswikiquote", + "bs.wikisource": "bswikisource", + "bs.wiktionary": "bswiktionary", + "bug.wikipedia": "bugwiki", + "bxr.wikipedia": "bxrwiki", + "ca.wikibooks": "cawikibooks", + "ca.wikinews": "cawikinews", + "ca.wikipedia": "cawiki", + "ca.wikiquote": "cawikiquote", + "ca.wikisource": "cawikisource", + "ca.wiktionary": "cawiktionary", + "cbk-zam.wikipedia": "cbk_zamwiki", + "cdo.wikipedia": "cdowiki", + "ce.wikipedia": "cewiki", + "ceb.wikipedia": "cebwiki", + "ch.wikibooks": "chwikibooks", + "ch.wikipedia": "chwiki", + "ch.wiktionary": "chwiktionary", + "cho.wikipedia": "chowiki", + "chr.wikipedia": "chrwiki", + "chr.wiktionary": "chrwiktionary", + "chy.wikipedia": "chywiki", + "ckb.wikipedia": "ckbwiki", + "co.wikibooks": "cowikibooks", + "co.wikipedia": "cowiki", + "co.wikiquote": "cowikiquote", + "co.wiktionary": "cowiktionary", + "commons.wikimedia": "commonswiki", + "cr.wikipedia": "crwiki", + "cr.wikiquote": "crwikiquote", + "cr.wiktionary": "crwiktionary", + "crh.wikipedia": "crhwiki", + "cs.wikibooks": "cswikibooks", + "cs.wikinews": "cswikinews", + "cs.wikipedia": "cswiki", + "cs.wikiquote": "cswikiquote", + "cs.wikisource": "cswikisource", + "cs.wikiversity": "cswikiversity", + "cs.wiktionary": "cswiktionary", + "csb.wikipedia": "csbwiki", + "csb.wiktionary": "csbwiktionary", + "cu.wikipedia": "cuwiki", + "cv.wikibooks": "cvwikibooks", + "cv.wikipedia": "cvwiki", + "cy.wikibooks": "cywikibooks", + "cy.wikipedia": "cywiki", + "cy.wikiquote": "cywikiquote", + "cy.wikisource": "cywikisource", + "cy.wiktionary": "cywiktionary", + "da.wikibooks": "dawikibooks", + "da.wikipedia": "dawiki", + "da.wikiquote": "dawikiquote", + "da.wikisource": "dawikisource", + "da.wiktionary": "dawiktionary", + "de.wikibooks": "dewikibooks", + "de.wikinews": "dewikinews", + "de.wikipedia": "dewiki", + "de.wikiquote": "dewikiquote", + "de.wikisource": "dewikisource", + "de.wikiversity": "dewikiversity", + "de.wikivoyage": "dewikivoyage", + "de.wiktionary": "dewiktionary", + "diq.wikipedia": "diqwiki", + "dsb.wikipedia": "dsbwiki", + "dv.wikipedia": "dvwiki", + "dv.wiktionary": "dvwiktionary", + "dz.wikipedia": "dzwiki", + "dz.wiktionary": "dzwiktionary", + "ee.wikipedia": "eewiki", + "el.wikibooks": "elwikibooks", + "el.wikinews": "elwikinews", + "el.wikipedia": "elwiki", + "el.wikiquote": "elwikiquote", + "el.wikisource": "elwikisource", + "el.wikiversity": "elwikiversity", + "el.wikivoyage": "elwikivoyage", + "el.wiktionary": "elwiktionary", + "eml.wikipedia": "emlwiki", + "en.wikibooks": "enwikibooks", + "en.wikinews": "enwikinews", + "en.wikipedia": "enwiki", + "en.wikiquote": "enwikiquote", + "en.wikisource": "enwikisource", + "en.wikiversity": "enwikiversity", + "en.wikivoyage": "enwikivoyage", + "en.wiktionary": "enwiktionary", + "eo.wikibooks": "eowikibooks", + "eo.wikinews": "eowikinews", + "eo.wikipedia": "eowiki", + "eo.wikiquote": "eowikiquote", + "eo.wikisource": "eowikisource", + "eo.wiktionary": "eowiktionary", + "es.wikibooks": "eswikibooks", + "es.wikinews": "eswikinews", + "es.wikipedia": "eswiki", + "es.wikiquote": "eswikiquote", + "es.wikisource": "eswikisource", + "es.wikiversity": "eswikiversity", + "es.wikivoyage": "eswikivoyage", + "es.wiktionary": "eswiktionary", + "et.wikibooks": "etwikibooks", + "et.wikipedia": "etwiki", + "et.wikiquote": "etwikiquote", + "et.wikisource": "etwikisource", + "et.wiktionary": "etwiktionary", + "eu.wikibooks": "euwikibooks", + "eu.wikipedia": "euwiki", + "eu.wikiquote": "euwikiquote", + "eu.wiktionary": "euwiktionary", + "ext.wikipedia": "extwiki", + "fa.wikibooks": "fawikibooks", + "fa.wikinews": "fawikinews", + "fa.wikipedia": "fawiki", + "fa.wikiquote": "fawikiquote", + "fa.wikisource": "fawikisource", + "fa.wikivoyage": "fawikivoyage", + "fa.wiktionary": "fawiktionary", + "ff.wikipedia": "ffwiki", + "fi.wikibooks": "fiwikibooks", + "fi.wikinews": "fiwikinews", + "fi.wikipedia": "fiwiki", + "fi.wikiquote": "fiwikiquote", + "fi.wikisource": "fiwikisource", + "fi.wikiversity": "fiwikiversity", + "fi.wiktionary": "fiwiktionary", + "fiu-vro.wikipedia": "fiu_vrowiki", + "fj.wikipedia": "fjwiki", + "fj.wiktionary": "fjwiktionary", + "fo.wikipedia": "fowiki", + "fo.wikisource": "fowikisource", + "fo.wiktionary": "fowiktionary", + "fr.wikibooks": "frwikibooks", + "fr.wikinews": "frwikinews", + "fr.wikipedia": "frwiki", + "fr.wikiquote": "frwikiquote", + "fr.wikisource": "frwikisource", + "fr.wikiversity": "frwikiversity", + "fr.wikivoyage": "frwikivoyage", + "fr.wiktionary": "frwiktionary", + "frp.wikipedia": "frpwiki", + "frr.wikipedia": "frrwiki", + "fur.wikipedia": "furwiki", + "fy.wikibooks": "fywikibooks", + "fy.wikipedia": "fywiki", + "fy.wiktionary": "fywiktionary", + "ga.wikibooks": "gawikibooks", + "ga.wikipedia": "gawiki", + "ga.wikiquote": "gawikiquote", + "ga.wiktionary": "gawiktionary", + "gag.wikipedia": "gagwiki", + "gan.wikipedia": "ganwiki", + "gd.wikipedia": "gdwiki", + "gd.wiktionary": "gdwiktionary", + "gl.wikibooks": "glwikibooks", + "gl.wikipedia": "glwiki", + "gl.wikiquote": "glwikiquote", + "gl.wikisource": "glwikisource", + "gl.wiktionary": "glwiktionary", + "glk.wikipedia": "glkwiki", + "gn.wikibooks": "gnwikibooks", + "gn.wikipedia": "gnwiki", + "gn.wiktionary": "gnwiktionary", + "gom.wikipedia": "gomwiki", + "got.wikibooks": "gotwikibooks", + "got.wikipedia": "gotwiki", + "gu.wikibooks": "guwikibooks", + "gu.wikipedia": "guwiki", + "gu.wikiquote": "guwikiquote", + "gu.wikisource": "guwikisource", + "gu.wiktionary": "guwiktionary", + "gv.wikipedia": "gvwiki", + "gv.wiktionary": "gvwiktionary", + "ha.wikipedia": "hawiki", + "ha.wiktionary": "hawiktionary", + "hak.wikipedia": "hakwiki", + "haw.wikipedia": "hawwiki", + "he.wikibooks": "hewikibooks", + "he.wikinews": "hewikinews", + "he.wikipedia": "hewiki", + "he.wikiquote": "hewikiquote", + "he.wikisource": "hewikisource", + "he.wikivoyage": "hewikivoyage", + "he.wiktionary": "hewiktionary", + "hi.wikibooks": "hiwikibooks", + "hi.wikipedia": "hiwiki", + "hi.wikiquote": "hiwikiquote", + "hi.wiktionary": "hiwiktionary", + "hif.wikipedia": "hifwiki", + "ho.wikipedia": "howiki", + "hr.wikibooks": "hrwikibooks", + "hr.wikipedia": "hrwiki", + "hr.wikiquote": "hrwikiquote", + "hr.wikisource": "hrwikisource", + "hr.wiktionary": "hrwiktionary", + "hsb.wikipedia": "hsbwiki", + "hsb.wiktionary": "hsbwiktionary", + "ht.wikipedia": "htwiki", + "ht.wikisource": "htwikisource", + "hu.wikibooks": "huwikibooks", + "hu.wikinews": "huwikinews", + "hu.wikipedia": "huwiki", + "hu.wikiquote": "huwikiquote", + "hu.wikisource": "huwikisource", + "hu.wiktionary": "huwiktionary", + "hy.wikibooks": "hywikibooks", + "hy.wikipedia": "hywiki", + "hy.wikiquote": "hywikiquote", + "hy.wikisource": "hywikisource", + "hy.wiktionary": "hywiktionary", + "hz.wikipedia": "hzwiki", + "ia.wikibooks": "iawikibooks", + "ia.wikipedia": "iawiki", + "ia.wiktionary": "iawiktionary", + "id.wikibooks": "idwikibooks", + "id.wikipedia": "idwiki", + "id.wikiquote": "idwikiquote", + "id.wikisource": "idwikisource", + "id.wiktionary": "idwiktionary", + "ie.wikibooks": "iewikibooks", + "ie.wikipedia": "iewiki", + "ie.wiktionary": "iewiktionary", + "ig.wikipedia": "igwiki", + "ii.wikipedia": "iiwiki", + "ik.wikipedia": "ikwiki", + "ik.wiktionary": "ikwiktionary", + "ilo.wikipedia": "ilowiki", + "incubator.wikimedia": "incubatorwiki", + "io.wikipedia": "iowiki", + "io.wiktionary": "iowiktionary", + "is.wikibooks": "iswikibooks", + "is.wikipedia": "iswiki", + "is.wikiquote": "iswikiquote", + "is.wikisource": "iswikisource", + "is.wiktionary": "iswiktionary", + "it.wikibooks": "itwikibooks", + "it.wikinews": "itwikinews", + "it.wikipedia": "itwiki", + "it.wikiquote": "itwikiquote", + "it.wikisource": "itwikisource", + "it.wikiversity": "itwikiversity", + "it.wikivoyage": "itwikivoyage", + "it.wiktionary": "itwiktionary", + "iu.wikipedia": "iuwiki", + "iu.wiktionary": "iuwiktionary", + "ja.wikibooks": "jawikibooks", + "ja.wikinews": "jawikinews", + "ja.wikipedia": "jawiki", + "ja.wikiquote": "jawikiquote", + "ja.wikisource": "jawikisource", + "ja.wikiversity": "jawikiversity", + "ja.wiktionary": "jawiktionary", + "jbo.wikipedia": "jbowiki", + "jbo.wiktionary": "jbowiktionary", + "jv.wikipedia": "jvwiki", + "jv.wiktionary": "jvwiktionary", + "ka.wikibooks": "kawikibooks", + "ka.wikipedia": "kawiki", + "ka.wikiquote": "kawikiquote", + "ka.wiktionary": "kawiktionary", + "kaa.wikipedia": "kaawiki", + "kab.wikipedia": "kabwiki", + "kbd.wikipedia": "kbdwiki", + "kg.wikipedia": "kgwiki", + "ki.wikipedia": "kiwiki", + "kj.wikipedia": "kjwiki", + "kk.wikibooks": "kkwikibooks", + "kk.wikipedia": "kkwiki", + "kk.wikiquote": "kkwikiquote", + "kk.wiktionary": "kkwiktionary", + "kl.wikipedia": "klwiki", + "kl.wiktionary": "klwiktionary", + "km.wikibooks": "kmwikibooks", + "km.wikipedia": "kmwiki", + "km.wiktionary": "kmwiktionary", + "kn.wikibooks": "knwikibooks", + "kn.wikipedia": "knwiki", + "kn.wikiquote": "knwikiquote", + "kn.wikisource": "knwikisource", + "kn.wiktionary": "knwiktionary", + "ko.wikibooks": "kowikibooks", + "ko.wikinews": "kowikinews", + "ko.wikipedia": "kowiki", + "ko.wikiquote": "kowikiquote", + "ko.wikisource": "kowikisource", + "ko.wikiversity": "kowikiversity", + "ko.wiktionary": "kowiktionary", + "koi.wikipedia": "koiwiki", + "kr.wikipedia": "krwiki", + "kr.wikiquote": "krwikiquote", + "krc.wikipedia": "krcwiki", + "ks.wikibooks": "kswikibooks", + "ks.wikipedia": "kswiki", + "ks.wikiquote": "kswikiquote", + "ks.wiktionary": "kswiktionary", + "ksh.wikipedia": "kshwiki", + "ku.wikibooks": "kuwikibooks", + "ku.wikipedia": "kuwiki", + "ku.wikiquote": "kuwikiquote", + "ku.wiktionary": "kuwiktionary", + "kv.wikipedia": "kvwiki", + "kw.wikipedia": "kwwiki", + "kw.wikiquote": "kwwikiquote", + "kw.wiktionary": "kwwiktionary", + "ky.wikibooks": "kywikibooks", + "ky.wikipedia": "kywiki", + "ky.wikiquote": "kywikiquote", + "ky.wiktionary": "kywiktionary", + "la.wikibooks": "lawikibooks", + "la.wikipedia": "lawiki", + "la.wikiquote": "lawikiquote", + "la.wikisource": "lawikisource", + "la.wiktionary": "lawiktionary", + "lad.wikipedia": "ladwiki", + "lb.wikibooks": "lbwikibooks", + "lb.wikipedia": "lbwiki", + "lb.wikiquote": "lbwikiquote", + "lb.wiktionary": "lbwiktionary", + "lbe.wikipedia": "lbewiki", + "lez.wikipedia": "lezwiki", + "lg.wikipedia": "lgwiki", + "li.wikibooks": "liwikibooks", + "li.wikipedia": "liwiki", + "li.wikiquote": "liwikiquote", + "li.wikisource": "liwikisource", + "li.wiktionary": "liwiktionary", + "lij.wikipedia": "lijwiki", + "lmo.wikipedia": "lmowiki", + "ln.wikibooks": "lnwikibooks", + "ln.wikipedia": "lnwiki", + "ln.wiktionary": "lnwiktionary", + "lo.wikipedia": "lowiki", + "lo.wiktionary": "lowiktionary", + "lrc.wikipedia": "lrcwiki", + "lt.wikibooks": "ltwikibooks", + "lt.wikipedia": "ltwiki", + "lt.wikiquote": "ltwikiquote", + "lt.wikisource": "ltwikisource", + "lt.wiktionary": "ltwiktionary", + "ltg.wikipedia": "ltgwiki", + "lv.wikibooks": "lvwikibooks", + "lv.wikipedia": "lvwiki", + "lv.wiktionary": "lvwiktionary", + "mai.wikipedia": "maiwiki", + "map-bms.wikipedia": "map_bmswiki", + "mdf.wikipedia": "mdfwiki", + "mediawiki": "mediawikiwiki", + "meta.wikimedia": "metawiki", + "mg.wikibooks": "mgwikibooks", + "mg.wikipedia": "mgwiki", + "mg.wiktionary": "mgwiktionary", + "mh.wikipedia": "mhwiki", + "mh.wiktionary": "mhwiktionary", + "mhr.wikipedia": "mhrwiki", + "mi.wikibooks": "miwikibooks", + "mi.wikipedia": "miwiki", + "mi.wiktionary": "miwiktionary", + "min.wikipedia": "minwiki", + "mk.wikibooks": "mkwikibooks", + "mk.wikipedia": "mkwiki", + "mk.wikisource": "mkwikisource", + "mk.wiktionary": "mkwiktionary", + "ml.wikibooks": "mlwikibooks", + "ml.wikipedia": "mlwiki", + "ml.wikiquote": "mlwikiquote", + "ml.wikisource": "mlwikisource", + "ml.wiktionary": "mlwiktionary", + "mn.wikibooks": "mnwikibooks", + "mn.wikipedia": "mnwiki", + "mn.wiktionary": "mnwiktionary", + "mo.wikipedia": "mowiki", + "mo.wiktionary": "mowiktionary", + "mr.wikibooks": "mrwikibooks", + "mr.wikipedia": "mrwiki", + "mr.wikiquote": "mrwikiquote", + "mr.wikisource": "mrwikisource", + "mr.wiktionary": "mrwiktionary", + "mrj.wikipedia": "mrjwiki", + "ms.wikibooks": "mswikibooks", + "ms.wikipedia": "mswiki", + "ms.wiktionary": "mswiktionary", + "mt.wikipedia": "mtwiki", + "mt.wiktionary": "mtwiktionary", + "mus.wikipedia": "muswiki", + "mwl.wikipedia": "mwlwiki", + "my.wikibooks": "mywikibooks", + "my.wikipedia": "mywiki", + "my.wiktionary": "mywiktionary", + "myv.wikipedia": "myvwiki", + "mzn.wikipedia": "mznwiki", + "na.wikibooks": "nawikibooks", + "na.wikipedia": "nawiki", + "na.wikiquote": "nawikiquote", + "na.wiktionary": "nawiktionary", + "nah.wikibooks": "nahwikibooks", + "nah.wikipedia": "nahwiki", + "nah.wiktionary": "nahwiktionary", + "nap.wikipedia": "napwiki", + "nds-nl.wikipedia": "nds_nlwiki", + "nds.wikibooks": "ndswikibooks", + "nds.wikipedia": "ndswiki", + "nds.wikiquote": "ndswikiquote", + "nds.wiktionary": "ndswiktionary", + "ne.wikibooks": "newikibooks", + "ne.wikipedia": "newiki", + "ne.wiktionary": "newiktionary", + "new.wikipedia": "newwiki", + "ng.wikipedia": "ngwiki", + "nl.wikibooks": "nlwikibooks", + "nl.wikinews": "nlwikinews", + "nl.wikipedia": "nlwiki", + "nl.wikiquote": "nlwikiquote", + "nl.wikisource": "nlwikisource", + "nl.wikivoyage": "nlwikivoyage", + "nl.wiktionary": "nlwiktionary", + "nn.wikipedia": "nnwiki", + "nn.wikiquote": "nnwikiquote", + "nn.wiktionary": "nnwiktionary", + "no.wikibooks": "nowikibooks", + "no.wikinews": "nowikinews", + "no.wikipedia": "nowiki", + "no.wikiquote": "nowikiquote", + "no.wikisource": "nowikisource", + "no.wiktionary": "nowiktionary", + "nostalgia.wikipedia": "nostalgiawiki", + "nov.wikipedia": "novwiki", + "nrm.wikipedia": "nrmwiki", + "nso.wikipedia": "nsowiki", + "nv.wikipedia": "nvwiki", + "ny.wikipedia": "nywiki", + "oc.wikibooks": "ocwikibooks", + "oc.wikipedia": "ocwiki", + "oc.wiktionary": "ocwiktionary", + "om.wikipedia": "omwiki", + "om.wiktionary": "omwiktionary", + "or.wikipedia": "orwiki", + "or.wikisource": "orwikisource", + "or.wiktionary": "orwiktionary", + "os.wikipedia": "oswiki", + "pa.wikibooks": "pawikibooks", + "pa.wikipedia": "pawiki", + "pa.wiktionary": "pawiktionary", + "pag.wikipedia": "pagwiki", + "pam.wikipedia": "pamwiki", + "pap.wikipedia": "papwiki", + "pcd.wikipedia": "pcdwiki", + "pdc.wikipedia": "pdcwiki", + "pfl.wikipedia": "pflwiki", + "pi.wikipedia": "piwiki", + "pi.wiktionary": "piwiktionary", + "pih.wikipedia": "pihwiki", + "pl.wikibooks": "plwikibooks", + "pl.wikinews": "plwikinews", + "pl.wikipedia": "plwiki", + "pl.wikiquote": "plwikiquote", + "pl.wikisource": "plwikisource", + "pl.wikivoyage": "plwikivoyage", + "pl.wiktionary": "plwiktionary", + "pms.wikipedia": "pmswiki", + "pnb.wikipedia": "pnbwiki", + "pnb.wiktionary": "pnbwiktionary", + "pnt.wikipedia": "pntwiki", + "ps.wikibooks": "pswikibooks", + "ps.wikipedia": "pswiki", + "ps.wiktionary": "pswiktionary", + "pt.wikibooks": "ptwikibooks", + "pt.wikinews": "ptwikinews", + "pt.wikipedia": "ptwiki", + "pt.wikiquote": "ptwikiquote", + "pt.wikisource": "ptwikisource", + "pt.wikiversity": "ptwikiversity", + "pt.wikivoyage": "ptwikivoyage", + "pt.wiktionary": "ptwiktionary", + "qu.wikibooks": "quwikibooks", + "qu.wikipedia": "quwiki", + "qu.wikiquote": "quwikiquote", + "qu.wiktionary": "quwiktionary", + "rm.wikibooks": "rmwikibooks", + "rm.wikipedia": "rmwiki", + "rm.wiktionary": "rmwiktionary", + "rmy.wikipedia": "rmywiki", + "rn.wikipedia": "rnwiki", + "rn.wiktionary": "rnwiktionary", + "ro.wikibooks": "rowikibooks", + "ro.wikinews": "rowikinews", + "ro.wikipedia": "rowiki", + "ro.wikiquote": "rowikiquote", + "ro.wikisource": "rowikisource", + "ro.wikivoyage": "rowikivoyage", + "ro.wiktionary": "rowiktionary", + "roa-rup.wikipedia": "roa_rupwiki", + "roa-rup.wiktionary": "roa_rupwiktionary", + "roa-tara.wikipedia": "roa_tarawiki", + "ru.wikibooks": "ruwikibooks", + "ru.wikinews": "ruwikinews", + "ru.wikipedia": "ruwiki", + "ru.wikiquote": "ruwikiquote", + "ru.wikisource": "ruwikisource", + "ru.wikiversity": "ruwikiversity", + "ru.wikivoyage": "ruwikivoyage", + "ru.wiktionary": "ruwiktionary", + "rue.wikipedia": "ruewiki", + "rw.wikipedia": "rwwiki", + "rw.wiktionary": "rwwiktionary", + "sa.wikibooks": "sawikibooks", + "sa.wikipedia": "sawiki", + "sa.wikiquote": "sawikiquote", + "sa.wikisource": "sawikisource", + "sa.wiktionary": "sawiktionary", + "sah.wikipedia": "sahwiki", + "sah.wikisource": "sahwikisource", + "sc.wikipedia": "scwiki", + "sc.wiktionary": "scwiktionary", + "scn.wikipedia": "scnwiki", + "scn.wiktionary": "scnwiktionary", + "sco.wikipedia": "scowiki", + "sd.wikinews": "sdwikinews", + "sd.wikipedia": "sdwiki", + "sd.wiktionary": "sdwiktionary", + "se.wikibooks": "sewikibooks", + "se.wikipedia": "sewiki", + "sg.wikipedia": "sgwiki", + "sg.wiktionary": "sgwiktionary", + "sh.wikipedia": "shwiki", + "sh.wiktionary": "shwiktionary", + "si.wikibooks": "siwikibooks", + "si.wikipedia": "siwiki", + "si.wiktionary": "siwiktionary", + "simple.wikibooks": "simplewikibooks", + "simple.wikipedia": "simplewiki", + "simple.wikiquote": "simplewikiquote", + "simple.wiktionary": "simplewiktionary", + "sk.wikibooks": "skwikibooks", + "sk.wikipedia": "skwiki", + "sk.wikiquote": "skwikiquote", + "sk.wikisource": "skwikisource", + "sk.wiktionary": "skwiktionary", + "sl.wikibooks": "slwikibooks", + "sl.wikipedia": "slwiki", + "sl.wikiquote": "slwikiquote", + "sl.wikisource": "slwikisource", + "sl.wikiversity": "slwikiversity", + "sl.wiktionary": "slwiktionary", + "sm.wikipedia": "smwiki", + "sm.wiktionary": "smwiktionary", + "sn.wikipedia": "snwiki", + "sn.wiktionary": "snwiktionary", + "so.wikipedia": "sowiki", + "so.wiktionary": "sowiktionary", + "species.wikimedia": "specieswiki", + "sq.wikibooks": "sqwikibooks", + "sq.wikinews": "sqwikinews", + "sq.wikipedia": "sqwiki", + "sq.wikiquote": "sqwikiquote", + "sq.wiktionary": "sqwiktionary", + "sr.wikibooks": "srwikibooks", + "sr.wikinews": "srwikinews", + "sr.wikipedia": "srwiki", + "sr.wikiquote": "srwikiquote", + "sr.wikisource": "srwikisource", + "sr.wiktionary": "srwiktionary", + "srn.wikipedia": "srnwiki", + "ss.wikipedia": "sswiki", + "ss.wiktionary": "sswiktionary", + "st.wikipedia": "stwiki", + "st.wiktionary": "stwiktionary", + "stq.wikipedia": "stqwiki", + "su.wikibooks": "suwikibooks", + "su.wikipedia": "suwiki", + "su.wikiquote": "suwikiquote", + "su.wiktionary": "suwiktionary", + "sv.wikibooks": "svwikibooks", + "sv.wikinews": "svwikinews", + "sv.wikipedia": "svwiki", + "sv.wikiquote": "svwikiquote", + "sv.wikisource": "svwikisource", + "sv.wikiversity": "svwikiversity", + "sv.wikivoyage": "svwikivoyage", + "sv.wiktionary": "svwiktionary", + "sw.wikibooks": "swwikibooks", + "sw.wikipedia": "swwiki", + "sw.wiktionary": "swwiktionary", + "szl.wikipedia": "szlwiki", + "ta.wikibooks": "tawikibooks", + "ta.wikinews": "tawikinews", + "ta.wikipedia": "tawiki", + "ta.wikiquote": "tawikiquote", + "ta.wikisource": "tawikisource", + "ta.wiktionary": "tawiktionary", + "te.wikibooks": "tewikibooks", + "te.wikipedia": "tewiki", + "te.wikiquote": "tewikiquote", + "te.wikisource": "tewikisource", + "te.wiktionary": "tewiktionary", + "ten.wikipedia": "tenwiki", + "tet.wikipedia": "tetwiki", + "tg.wikibooks": "tgwikibooks", + "tg.wikipedia": "tgwiki", + "tg.wiktionary": "tgwiktionary", + "th.wikibooks": "thwikibooks", + "th.wikinews": "thwikinews", + "th.wikipedia": "thwiki", + "th.wikiquote": "thwikiquote", + "th.wikisource": "thwikisource", + "th.wiktionary": "thwiktionary", + "ti.wikipedia": "tiwiki", + "ti.wiktionary": "tiwiktionary", + "tk.wikibooks": "tkwikibooks", + "tk.wikipedia": "tkwiki", + "tk.wikiquote": "tkwikiquote", + "tk.wiktionary": "tkwiktionary", + "tl.wikibooks": "tlwikibooks", + "tl.wikipedia": "tlwiki", + "tl.wiktionary": "tlwiktionary", + "tn.wikipedia": "tnwiki", + "tn.wiktionary": "tnwiktionary", + "to.wikipedia": "towiki", + "to.wiktionary": "towiktionary", + "tpi.wikipedia": "tpiwiki", + "tpi.wiktionary": "tpiwiktionary", + "tr.wikibooks": "trwikibooks", + "tr.wikinews": "trwikinews", + "tr.wikipedia": "trwiki", + "tr.wikiquote": "trwikiquote", + "tr.wikisource": "trwikisource", + "tr.wiktionary": "trwiktionary", + "ts.wikipedia": "tswiki", + "ts.wiktionary": "tswiktionary", + "tt.wikibooks": "ttwikibooks", + "tt.wikipedia": "ttwiki", + "tt.wikiquote": "ttwikiquote", + "tt.wiktionary": "ttwiktionary", + "tum.wikipedia": "tumwiki", + "tw.wikipedia": "twwiki", + "tw.wiktionary": "twwiktionary", + "ty.wikipedia": "tywiki", + "tyv.wikipedia": "tyvwiki", + "udm.wikipedia": "udmwiki", + "ug.wikibooks": "ugwikibooks", + "ug.wikipedia": "ugwiki", + "ug.wikiquote": "ugwikiquote", + "ug.wiktionary": "ugwiktionary", + "uk.wikibooks": "ukwikibooks", + "uk.wikinews": "ukwikinews", + "uk.wikipedia": "ukwiki", + "uk.wikiquote": "ukwikiquote", + "uk.wikisource": "ukwikisource", + "uk.wikivoyage": "ukwikivoyage", + "uk.wiktionary": "ukwiktionary", + "ur.wikibooks": "urwikibooks", + "ur.wikipedia": "urwiki", + "ur.wikiquote": "urwikiquote", + "ur.wiktionary": "urwiktionary", + "uz.wikibooks": "uzwikibooks", + "uz.wikipedia": "uzwiki", + "uz.wikiquote": "uzwikiquote", + "uz.wiktionary": "uzwiktionary", + "ve.wikipedia": "vewiki", + "vec.wikipedia": "vecwiki", + "vec.wikisource": "vecwikisource", + "vec.wiktionary": "vecwiktionary", + "vep.wikipedia": "vepwiki", + "vi.wikibooks": "viwikibooks", + "vi.wikipedia": "viwiki", + "vi.wikiquote": "viwikiquote", + "vi.wikisource": "viwikisource", + "vi.wikivoyage": "viwikivoyage", + "vi.wiktionary": "viwiktionary", + "vls.wikipedia": "vlswiki", + "vo.wikibooks": "vowikibooks", + "vo.wikipedia": "vowiki", + "vo.wikiquote": "vowikiquote", + "vo.wiktionary": "vowiktionary", + "wa.wikibooks": "wawikibooks", + "wa.wikipedia": "wawiki", + "wa.wiktionary": "wawiktionary", + "war.wikipedia": "warwiki", + "wg-en.wikipedia": "wg_enwiki", + "wikidata": "wikidatawiki", + "wikimediafoundation": "foundationwiki", + "wikisource": "sourceswiki", + "wo.wikipedia": "wowiki", + "wo.wikiquote": "wowikiquote", + "wo.wiktionary": "wowiktionary", + "wuu.wikipedia": "wuuwiki", + "xal.wikipedia": "xalwiki", + "xh.wikibooks": "xhwikibooks", + "xh.wikipedia": "xhwiki", + "xh.wiktionary": "xhwiktionary", + "xmf.wikipedia": "xmfwiki", + "yi.wikipedia": "yiwiki", + "yi.wikisource": "yiwikisource", + "yi.wiktionary": "yiwiktionary", + "yo.wikibooks": "yowikibooks", + "yo.wikipedia": "yowiki", + "yo.wiktionary": "yowiktionary", + "za.wikibooks": "zawikibooks", + "za.wikipedia": "zawiki", + "za.wikiquote": "zawikiquote", + "za.wiktionary": "zawiktionary", + "zea.wikipedia": "zeawiki", + "zh-classical.wikipedia": "zh_classicalwiki", + "zh-min-nan.wikibooks": "zh_min_nanwikibooks", + "zh-min-nan.wikipedia": "zh_min_nanwiki", + "zh-min-nan.wikiquote": "zh_min_nanwikiquote", + "zh-min-nan.wikisource": "zh_min_nanwikisource", + "zh-min-nan.wiktionary": "zh_min_nanwiktionary", + "zh-yue.wikipedia": "zh_yuewiki", + "zh.wikibooks": "zhwikibooks", + "zh.wikinews": "zhwikinews", + "zh.wikipedia": "zhwiki", + "zh.wikiquote": "zhwikiquote", + "zh.wikisource": "zhwikisource", + "zh.wikivoyage": "zhwikivoyage", + "zh.wiktionary": "zhwiktionary", + "zu.wikibooks": "zuwikibooks", + "zu.wikipedia": "zuwiki", + "zu.wiktionary": "zuwiktionary" +} diff --git a/makeHostnames.py b/makeHostnames.py new file mode 100644 index 0000000..c54772a --- /dev/null +++ b/makeHostnames.py @@ -0,0 +1,63 @@ +from __future__ import print_function +import subprocess +import re +import json +import sys +import datetime + +# This script produces the JSON map from hostnames - as stored in hive - to wiki dbnames + +# Get the list of hostnames +now = datetime.datetime.now() +mon = now.month - 1 +year = now.year +if mon == 0: + mon = 12 + year -= 1 +# This uses last months' data, since this month may be just beginning and not have good data yet +hostnames = subprocess.check_output(["hive", "-S", "-e", + 'select distinct project from wmf.discovery_popularity_score \ + where year=%d AND month=%d;' % (year, mon)]).split("\n") +names = {} +# The source file should be updated from: +# https://raw.githubusercontent.com/wikimedia/operations-mediawiki-config/master/dblists/all.dblist +dblist = set(open("all.dblist").read().split()) +# The following abomination comes from: +# https://github.com/wikimedia/operations-mediawiki-config/blob/master/multiversion/MWMultiVersion.php#L134 +# And should be updated when that changes. +# No, I have no idea how to ensure it's up to date. That's why one shouldn't hardcode such things. +staticMap = { + 'wikimediafoundation': 'foundation', + 'mediawiki': 'mediawiki', + 'wikidata': 'wikidata', + 'wikisource': 'sources', + 'be-tarask.wikipedia': 'be_x_old', +} +chapters = set(['ar', 'bd', 'be', 'br', 'ca', 'cn', 'co', 'dk', 'et', 'fi', 'il', 'mk', 'mx', 'nl', + 'noboard-chapters', 'no', 'nyc', 'nz', 'pa-us', 'pl', 'rs', 'ru', 'se', 'tr', 'ua', 'uk', 've']) +hostmatch = re.compile('^(.*)\.([a-z]+)$') +for hostname in hostnames: + if hostname == 'project' or len(hostname) == 0: + # skip this hive artifact + continue + site = "wikipedia" + if hostname in staticMap: + lang = staticMap[hostname] + else: + m = hostmatch.match(hostname) + if not m: + print("BAD HOSTNAME: " + hostname, file=sys.stderr) + continue + lang = m.group(1) + if m.group(2) != 'wikimedia' or lang in chapters: + site = m.group(2) + if site == 'wikipedia': + site = 'wiki' + + dbname = (lang + site).replace("-", "_") + if dbname not in dblist: + print("UNKNOWN DBNAME: " + dbname, file=sys.stderr) + continue + names[hostname] = dbname + +print(json.dumps(names, sort_keys=True, indent=1)) diff --git a/setup.cfg b/setup.cfg index df07bdd..b7b70a3 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,4 +1,5 @@ # configuration for flake8 [flake8] # Raise the default 79 limit -max-line-length = 100 +max-line-length = 120 +ignore = E128 diff --git a/transferToES.py b/transferToES.py new file mode 100644 index 0000000..89218e0 --- /dev/null +++ b/transferToES.py @@ -0,0 +1,133 @@ +# A very primitive script to transfer from hive data files +# to ElasticSearch HTTP endpoint +from pyspark import SparkContext +from pyspark.sql import SQLContext +from optparse import OptionParser +import requests +import json +import logging + +oparser = OptionParser() +oparser.add_option("-s", "--source", dest="source", help="source for the data", metavar="SOURCE") +oparser.add_option("-u", "--url", dest="url", help="URL to send the data to", metavar="URL") +oparser.add_option("-m", "--hostmap", dest="hostmap", help="Hostnames map in JSON", + metavar="FILE", default="hostmap.json") +oparser.add_option("-b", "--batch", dest="batch", help="Items per batch to load into ES", metavar="NUM", default="10") + +(options, args) = oparser.parse_args() + +ITEMS_PER_BATCH = int(options.batch) +SOURCE = options.source +TARGET = options.url +hostMap = json.load(open(options.hostmap)) + +print "Transferring from %s to %s" % (SOURCE, TARGET) + +if __name__ == "__main__": + sc = SparkContext(appName="Send To ES") + sqlContext = SQLContext(sc) + broardcastMap = sc.broadcast(hostMap) + documentCounter = sc.accumulator(0) + updateCounter = sc.accumulator(0) + errorCounter = sc.accumulator(0) + failedDocumentCounter = sc.accumulator(0) + + def documentData(document): + """ + Create textual representation of the document data for one document + """ + updateData = {"update": {"_id": document.page_id}} + updateDoc = {"doc": {"score": document.score}} + return json.dumps(updateData) + "\n" + json.dumps(updateDoc) + "\n" + + def getTargetURL(wikihost): + """ + Get ES URL from wiki hostname + """ + if wikihost in broardcastMap.value: + wiki = broardcastMap.value[wikihost] + return TARGET + "/" + wiki + "_content" + "/page/_bulk" + return None + + def sendDataToES(data, url): + """ + Send data to ES server + """ + if len(data) < 1: + return + try: + r = requests.put(url, data=data) + except requests.exceptions.RequestException, e: + errorCounter.add(1) + logging.error("Failed to send update: " + str(e)) + return False + if r.status_code != 200: + errorCounter.add(1) + r.close() + return False + parseResponse(r) + updateCounter.add(1) + return True + + def parseResponse(resp): + respData = resp.json() + for item in respData.get('items', default={}): + if 'update' not in item: + continue + if 'status' not in item['update']: + continue + if item['update']['status'] != 200: + if 'error' in item['update'] and item['update']['error'][0:24] == 'DocumentMissingException': + continue + failedDocumentCounter.add(1) + + def sendDocumentsToES(documents): + """ + Send a set of documents to ES + """ + if len(documents) < 1: + return + url = getTargetURL(documents[0].project) + if not url: + return + data = "" + for document in documents: + data += documentData(document) + documentCounter.add(len(documents)) + if not sendDataToES(data, url): + failedDocumentCounter.add(len(documents)) + + def addToList(listNow, element): + """ + Add element to list, will send the data out once batch is full + """ + if len(listNow) < ITEMS_PER_BATCH: + return listNow + [element] + # Treshold reached, send the list out + sendDocumentsToES(listNow) + return [element] + + def mergeLists(listOne, listTwo): + """ + Merge two lists, will send the data out once batch is full + """ + newList = listOne + listTwo + if len(newList) < ITEMS_PER_BATCH: + return newList + sendDocumentsToES(newList) + return [] + + def sendCombined(data): + """ + Send data for the key (hostname) to ES + """ + sendDocumentsToES(data[1]) + + data = sqlContext.load(SOURCE) + # print "Count: %d\n" % data.count() + # Here's what is going on here: we combine the data by project, + # and when the list of projects reaches ITEMS_PER_BATCH we send them out + # The foreach() part will send out the ones that remained + data.map(lambda x: (x.project, x)).combineByKey(lambda x: [x], addToList, mergeLists).foreach(sendCombined) + print "%d documents processed, %d failed." % (documentCounter.value, failedDocumentCounter.value,) + print "%d requests successful, %d requests failed." % (updateCounter.value, errorCounter.value) -- To view, visit https://gerrit.wikimedia.org/r/248564 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Id4df5bffca445b396c875329bce005327110ddab Gerrit-PatchSet: 16 Gerrit-Project: wikimedia/discovery/analytics Gerrit-Branch: master Gerrit-Owner: Smalyshev <[email protected]> Gerrit-Reviewer: DCausse <[email protected]> Gerrit-Reviewer: EBernhardson <[email protected]> Gerrit-Reviewer: Smalyshev <[email protected]> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
