інтэграцыйнае тэставанне працоўных месцаў вулляў

Я спрабую напісаць нетрывіяльную улую працу, выкарыстоўваючы інтэрфейсы Hive беражлівасці і JDBC, і ў мяне стварэнне тэсту прыстойнага JUnit праблема. Да нетрывіяльнай, я маю на ўвазе, што вынікі працы па меншай меры адной стадыі MapReduce, у адрозненне справу толькі з metastore.

Тэст павінен запусціць вулей сервер, загрузіць некаторыя дадзеныя ў табліцу, выканаць некаторыя нетрывіяльныя запыт на гэтую табліцу, і праверыць вынікі.

Я падлучаны да кантэксту Spring ў адпаведнасці з Вясна спасылка . Тым не менш, праца трывае няўдачу на этапе MapReduce, скардзячыся, што няма Hadoop двайковага не існуе:

<�Р> java.io.IOException: Не атрымоўваецца запусціць праграму "/ USR/бен/Hadoop" (у   каталог "/ Users/Йоні/Оповер/працоўная прастора/intellij_project_root"):   Памылка = 2, Няма такога файла ці каталога

Праблема заключаецца ў тым, што вулей сервер працуе ў памяці, але належыць на лакальную ўстаноўку вуллі для запуску. Для майго праекта, каб быць самадастатковым, мне патрэбныя паслугі Hive ўбудоўваць, уключаючы HDFS і кластары MapReduce. Я паспрабаваў запускаючы вулей сервер, выкарыстоўваючы той жа метад Spring і накіроўваючы яго ў MiniDFSCluster і MiniMRCluster , аналагічны шаблоне, якім карыстаецца ў вуллі QTestUtil крыніца і ў HBaseTestUtility . Тым не менш, я не быў у стане атрымаць, каб працаваць.

Пасля трох дзён спробаў спрачацца інтэграцыйным тэставаннем вулей, я думаў, што звярнуцца да супольнасці:

  1. Як вы рекомендуете I інтэграцыі заданняў тэста Hive?
  2. У вас ёсць працоўны прыклад JUnit для тэставання інтэграцыі працоўных месцаў Hive выкарыстання ў памяці HDFS, асобнікі MR, і вуллі?

Дадатковыя рэсурсы я паглядзеў на:

змяніць: Я цалкам усведамляю, што працуе супраць кластара Hadoop - дазваляе запускаць тэсты інтэграцыі супраць поўнага стэка, напрыклад вулей - будзь лакальным або выдаленым. Праблема, як ужо гаварылася, з'яўляецца тое, што гэта не з'яўляецца жыццяздольнай рашэннем для эфектыўнага тэставання Hive рабочых працэсаў.

70
Я з адкрытым зыходным кодам нашага тэсту JUnit правілы для гэтага, як толькі змагу.
дададзена аўтар oby1, крыніца
@yoni Ці можаце вы апублікаваць поўнае рашэнне, якое вы скончылі з тут, калі ласка? Я знаходжуся ў дакладна такой жа сітуацыі, як вы, і ў той час як у мяне ёсць вулей JDBC-кліент працуе, і код MiniDFSCluster знізу працы, калі я спрабую запусціць абодва разам (з дапамогай «JDBC: hive2: ///» URL) для А «CREATE TABLE ...» запыт, я атрымліваю гэта: java.sql.SQLException: памылка пры апрацоўцы заяву: FAILED: памылка выканання, код звароту 1 з org.apache.hadoop.hive.ql.exec.DDLTask
дададзена аўтар Nishant Kelkar, крыніца
дададзена аўтар Nishant Kelkar, крыніца
Паколькі ён шукае ўстаноўкі, чаму б не стварыць RAM дыск, які вы можаце паказаць яго? Акрамя таго, вы павінны пачаць вывучэнне крыніцы, каб убачыць, як ён выкарыстоўвае канфігурацыю вы дае яго. Пасля гэтага вы можаце напісаць свой уласны клей, каб абыйсці канфігурацыі і запуск функцыі непасрэдна.
дададзена аўтар WeaponsGrade, крыніца
@ Oby1 павінны мець патч, дадае падтрымку, але ў мяне няма доступу да яго.
дададзена аўтар yoni, крыніца
Прывітанне Nishant. Шкадуем, што ў Вас паўсталі праблемы з гэтым. У мяне няма доступу да поўнага вырашэння, але, магчыма @ oby1 does.In любым выпадку, я б рэкамендаваў дадаць поўны прыклад - магчыма, у асобным перапаўненнем стэка пытанне - з дакладнай налады і поўнай трасіроўкі стэка.
дададзена аўтар yoni, крыніца
Не маглі б вы падзяліцца прыклад канчатковага рашэння?
дададзена аўтар Gustavo Matias, крыніца

6 адказы

У ідэале можна было б быць у стане праверыць вулей запыты з LocalJobRunner , а не звяртаючыся да тэставання міні-кластара. Аднак з-за вулля 3816 працуе вулей з mapred.job.tracker = мясцовы вынікі ў выкліку CLI улого выкананы, устаноўленыя ў сістэме (як апісана ў вашым пытанні).

Да Вулей-3816 не будзе вырашана, тэставанне міні-кластар з'яўляецца адзіным варыянтам. Ніжэй прыводзіцца мінімальная ўстаноўка міні-кластар для вулляў тэстаў, якія я выпрабаваў супраць CDH 4.4.

Configuration conf = new Configuration();

/* Build MiniDFSCluster */
MiniDFSCluster miniDFS = new MiniDFSCluster.Builder(conf).build();

/* Build MiniMR Cluster */
System.setProperty("hadoop.log.dir", "/path/to/hadoop/log/dir");//MAPREDUCE-2785
int numTaskTrackers = 1;
int numTaskTrackerDirectories = 1;
String[] racks = null;
String[] hosts = null;
miniMR = new MiniMRCluster(numTaskTrackers, miniDFS.getFileSystem().getUri().toString(),
                           numTaskTrackerDirectories, racks, hosts, new JobConf(conf));

/* Set JobTracker URI */
System.setProperty("mapred.job.tracker", miniMR.createJobConf(new JobConf(conf)).get("mapred.job.tracker"));

There is no need to run a separate hiveserver or hiveserver2 process for testing. You can test with an embedded hiveserver2 process by setting your jdbc connection URL to jdbc:hive2:///

12
дададзена
Спекуляцыя на прыняты адказ: На Улой 1.2.0 існуе альтэрнатыўны абыходны шлях: stackoverflow.com/a/40115876/973963
дададзена аўтар Walmart_Hobo, крыніца
Маглі б вы даць больш поўны прыклад? я маю на ўвазе, у тым ліку той частцы, дзе створаны і выканаць некалькі запытаў з дапамогай HiveInterface можа быць? вялікі дзякуй
дададзена аўтар Gustavo Matias, крыніца

Я прыйшоў, каб знайсці адзін вельмі добры інструмент: HiveRunner . Гэта аснова на вяршыні JUnit для тэставання улех сцэнарыяў. Пад капотам у яго пачынаецца адна падстаўка HiveServer з у памяці HSQL як metastore.

5
дададзена
Вельмі цікавы праект. Падобна на тое, ёсць некаторыя абмежаванні на Hive версіі, але я абавязкова глядзець на гэта для майго наступнага праекта. На дадзены момант, я з'язджаю адказ @ oby1 як лепшы стаўку, але калі людзі працягваюць паведамляць поспех HiveRunner, я буду ісці наперад і пераключыць.
дададзена аўтар yoni, крыніца

Я ўпэўнены ў тым, што змянілася з тых часоў прынята адказваць у лютым 2014 года, але, як вулей 1.2.0, наступных работ вакол праблемы, апісанай OP:

System.setProperty(HiveConf.ConfVars.SUBMITLOCALTASKVIACHILD.varname, "false");

Памятаеце пра папярэджанне, паказаным у дакументацыі канфігурацыі:

<�Р> Вызначае, ці будзе лакальныя задачы (як правіла, mapjoin пакалення хэша   фаза) выконваецца ў асобнай віртуальнай машыне Java (праўда рэкамендуецца) ці не. ухіляецца ад   накладныя выдаткі спараджаючы новы JVM, але можа прывесці да праблем з-з-памяці.

Гэта працуе вакол праблемы, таму што ў MapredLocalTask.java :

  @Override
  public int execute(DriverContext driverContext) {
    if (conf.getBoolVar(HiveConf.ConfVars.SUBMITLOCALTASKVIACHILD)) {
     //send task off to another jvm
      return executeInChildVM(driverContext);
    } else {
     //execute in process
      return executeInProcess(driverContext);
    }
  }

Значэнне па змаўчанні канфігурацыі прыводзіць да таго, executeInChildVM() метад можна назваць, які літаральна выклікае Hadoop банку . Іншы код шлях да гэтага часу працаваў у маім тэставанні. Патэнцыйныя праблемы з памяццю, верагодна, могуць быць вырашаны шляхам налады Java кучы конфігу (XMX, XMS, і г.д.).

1
дададзена

Hive падтрымлівае ўбудаваны рэжым толькі ў тым сэнсе, што RDBMS, які захоўвае метаінформаціі для табліц Hive можа працаваць лакальна або на аўтаномным сэрвэры (гл https://cwiki.apache.org/confluence/display/Hive/HiveClient для больш падрабязнай інфармацыі). Акрамя таго, вулей з яго суправаджае базы дадзеных з'яўляецца толькі оркестратором для радкі заданняў MapReduce, якая патрабуе рамкі Hadoop, каб працаваць, як добра.

Я рэкамендую выкарыстоўваць гэтую віртуальную машыну, якая мае папярэдне наладжаны Hadoop стэк http://hortonworks.com/products/ Hortonworks-пясочніца/. Hortonworks з'яўляецца адным з 2-х вядучых пастаўшчыкоў размеркавальных Hadoop, так што добра падтрымліваецца.

1
дададзена
Ваша пытанне вісіць без адказу з мая, я мяркую, што няма ніякага рашэння вы запытваеце (прынамсі, у адкрытым доступе). Ва ўсякім выпадку, downvoting за спробу дапамагчы (і прапаноўваючы рашэнне, якое існуе і павінна працаваць) не з'яўляецца станоўчым.
дададзена аўтар Dmitriusan, крыніца
Дзякуй, Dmitriusan. Я ведаю, што вы можаце ўсталяваць і запусціць лакальны кластар Hadoop для працы супраць, але я шукаў нешта крыху па-іншаму. Ўстойлівае рашэнне адзін, які не патрабуе нічога па-за кантролем інтэграцыйнага тэсту. Гэта існуе для HBase, што таксама патрабуе HDFS і MapReduce паслугі быць, але да гэтага часу не было належным чынам распрацавана для вулля. Кавалкі ўсе там, яны проста павінны быць падлучаныя (і ў мяне няма часу, каб зрабіць злучальны). Няхай гэта будзе Hortonworks, CDH, або любы іншы водар Hadoop не павінна мець ніякага значэння.
дададзена аўтар yoni, крыніца
Гоча. Ўніз галасаванне, таму што ваш адказ не з'яўляецца рашэннем праблемы. Але калі гэта не з'яўляецца падставай для паніжальнага галасавання, то я мяркую, мой SO этыкет, магчыма, быў выключаны на што, так што дзякуй за выпраўленне мяне.
дададзена аўтар yoni, крыніца

Я рэалізаваў HiveRunner.

https://github.com/klarna/HiveRunner

Мы пратэставалі яго на Mac і меў некаторыя праблемы з Windows, аднак з некалькі змен, пералічаных ніжэй Util служыў добра.

Для вокнаў тут некаторыя змены, якія былі зроблены для таго, каб мець HiveRunner працы ў асяроддзі Windows. Пасля гэтых змяненняў модульнае тэставанне магчыма для ўсіх Hive запытаў.

1.Clone праекта на https://github.com/steveloughran/winutils ў любое месца на вашым кампутары , Дадаць новую зменную асяроддзі, HADOOP_HOME, які паказвае на каталог/бен гэтай тэчкі. ня больш ня касая рыса або прабелы дапускаюцца. 2.Clone праект па https://github.com/sakserv/hadoop-mini-clusters </а> у любое месца на вашым кампутары. Дадаць новую зменную асяроддзі HADOOP_WINDOWS_LIBS, паказваючы на ​​/ Lib каталога гэтай тэчкі. Зноў жа, не болей ня касая рыса або прабелы дапускаюцца. 3.Я таксама ўстаноўлены Cygwin, мяркуючы severla выйграць Utils для Linux могуць быць даступныя праз.

This pull on gitbub helped with making it work on windows,

https://github.com/klarna/HiveRunner/pull/63

1
дададзена

Another Hive JUnit runner is at https://github.com/edwardcapriolo/hive_test

0
дададзена