1

Hadoop-Vertica Connector を使用して大きなファイルを Vertica にインポートしています。リデューサーなしでそれを行うためにhadoopを使用しようとしていました。ただし、マッピング手順中に vertica 出力テーブルを初期化できないようで、常にエラーが発生します。

ドキュメントを確認したところ、Mapping 中に Vertica に書き込めるとは書かれていませんでした。

ありがとうございました!

編集

これはHadoop Vertica Connectorのドキュメントです。

エラー:

java.io.IOException: Cannot set record by name if names not initialized
at com.vertica.hadoop.VerticaRecord.set(VerticaRecord.java:270)
at com.vertica.hadoop.VerticaWordCount$TokenizerMapper.map(VerticaWordCount.java:92)
at com.vertica.hadoop.VerticaWordCount$TokenizerMapper.map(VerticaWordCount.java:60)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:763)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:339)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:162)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doA

VerticaWordCount.java のソース コードを確認すると、出力テーブルの名前リストがまったく初期化されていないことがわかりました。

run() での私の構成は次のとおりです。

  Job job = new Job(conf, "vertica hadoop");
  conf = job.getConfiguration();
  conf.set("mapreduce.job.tracker", "local");

  //job.setInputFormatClass(VerticaInputFormat.class);
  //You have to set the MapOutputKeyClass and MapOutputValueClass, 
  //since by default it will be the same as the class of Reducer's
  //Output Key and Value
  job.setMapOutputKeyClass(Text.class);
  job.setMapOutputValueClass(VerticaRecord.class);

  /*************Settings for Vertica output************************/
  //Set the output format of Reduce class. 
  //I will output VerticaRecords that will be stored in the database
  job.setOutputKeyClass(Text.class);
  job.setOutputValueClass(VerticaRecord.class);

  //Tell Hadoop to send its output to the Vertica
  job.setOutputFormatClass(VerticaOutputFormat.class);
  /****************************************************************/

  job.setJarByClass(VerticaWordCount.class);
  job.setMapperClass(TokenizerMapper.class);
  FileInputFormat.addInputPath(job, new Path("/user/tmp/input"));

  /******************************************************************/
  //Defining the output table
  //VerticaOutputFormat.setOutput(jobObject, tableName, [truncate, ["columnName1 dataType1" [,"columnNamen dataTypen" ...]] );
  VerticaOutputFormat.setOutput(job, "target", true, "a int", "b varchar", "c varchar");
4

0 に答える 0