日曜日, 10月 31, 2010

cygwinでHadoop(v0.21.0)+HIVEを動かす

FileのAppendもできるようになったとのこともあり、Hadoopがv0.21.0な状態でHIVEを使いたかったのだが、やってみると結構苦労したのでメモ。cygwinをまじめに使うのも初めてで、、これも意外に大変。。

HIVE-1612に掲示されたパッチを対応するtrunkソースに当てる。

よしもふさんのページを参考にql/exec/Utilities.javaのgetMapRedWorkメソッドを修正(多少本体側も変更されているので以下参考)。

 public static MapredWork getMapRedWork (Configuration job) {
   MapredWork gWork = null;
   try {
     synchronized(gWorkMap) {
       gWork = gWorkMap.get(getHiveJobID(job));
     }
     if(gWork == null) {
       synchronized (Utilities.class) {
         if(gWork != null)
           return (gWork);
  Path planPath = new Path(HiveConf.getVar(job, HiveConf.ConfVars.PLAN));
  FileSystem fs = planPath.getFileSystem(job);
  InputStream in = fs.open(planPath);
         MapredWork ret = deserializeMapRedWork(in, job);
         gWork = ret;
         gWork.initialize();
         gWorkMap.put(getHiveJobID(job), gWork);
       }
     }
     return (gWork);
   } catch (Exception e) {
     e.printStackTrace();
     throw new RuntimeException (e);
   }
 }


③ql/Context.javaのgetLocalScratchDirメソッドを修正(以下ひどい修正なので参考までに)。

  public String getLocalScratchDir(boolean mkdir) {
    try {
      FileSystem fs = FileSystem.getLocal(conf);
      URI uri = fs.getUri();
return "/tmp";
/*
      return getScratchDir(uri.getScheme(), uri.getAuthority(),
                           mkdir, localScratchDir);
*/
    } catch (IOException e) {
      throw new RuntimeException (e);
    }
  }