我的家園

          我的家園

          Hadoop使用常見問題以及解決方法7

          Posted on 2012-04-15 16:37 zljpp 閱讀(236) 評論(0)  編輯  收藏
          Windows eclispe調試hive報does not have a scheme錯誤可能原因
          1、Hive配置文件中的“hive.metastore.local”配置項值為false,需要將它修改為true,因為是單機版
          2、沒有設置HIVE_HOME環境變量,或設置錯誤
          3、“does not have a scheme”很可能是因為找不到“hive-default.xml”。使用Eclipse調試Hive時,遇到找不到hive-default.xml的解決方法:http://bbs.hadoopor.com/thread-292-1-1.html
           
          1、中文問題
              從url中解析出中文,但hadoop中打印出來仍是亂碼?我們曾經以為hadoop是不支持中文的,后來經過查看源代碼,發現hadoop僅僅是不支持以gbk格式輸出中文而己。

              這是TextOutputFormat.class中的代碼,hadoop默認的輸出都是繼承自FileOutputFormat來的,FileOutputFormat的兩個子類一個是基于二進制流的輸出,一個就是基于文本的輸出TextOutputFormat。

              public class TextOutputFormat<K, V> extends FileOutputFormat<K, V> {
            protected static class LineRecordWriter<K, V>
              implements RecordWriter<K, V> {
              private static final String utf8 = “UTF-8″;//這里被寫死成了utf-8
              private static final byte[] newline;
              static {
                try {
                  newline = “/n”.getBytes(utf8);
                } catch (UnsupportedEncodingException uee) {
                  throw new IllegalArgumentException(”can’t find ” + utf8 + ” encoding”);
                }
              }

              public LineRecordWriter(DataOutputStream out, String keyValueSeparator) {
                this.out = out;
                try {
                  this.keyValueSeparator = keyValueSeparator.getBytes(utf8);
                } catch (UnsupportedEncodingException uee) {
                  throw new IllegalArgumentException(”can’t find ” + utf8 + ” encoding”);
                }
              }

              private void writeObject(Object o) throws IOException {
                if (o instanceof Text) {
                  Text to = (Text) o;
                  out.write(to.getBytes(), 0, to.getLength());//這里也需要修改
                } else {
                  out.write(o.toString().getBytes(utf8));
                }
              }

          }
              可以看出hadoop默認的輸出寫死為utf-8,因此如果decode中文正確,那么將Linux客戶端的character設為utf-8是可以看到中文的。因為hadoop用utf-8的格式輸出了中文。
              因為大多數數據庫是用gbk來定義字段的,如果想讓hadoop用gbk格式輸出中文以兼容數據庫怎么辦?
              我們可以定義一個新的類:
              public class GbkOutputFormat<K, V> extends FileOutputFormat<K, V> {
            protected static class LineRecordWriter<K, V>
              implements RecordWriter<K, V> {
          //寫成gbk即可
              private static final String gbk = “gbk”;
              private static final byte[] newline;
              static {
                try {
                  newline = “/n”.getBytes(gbk);
                } catch (UnsupportedEncodingException uee) {
                  throw new IllegalArgumentException(”can’t find ” + gbk + ” encoding”);
                }
              }

              public LineRecordWriter(DataOutputStream out, String keyValueSeparator) {
                this.out = out;
                try {
                  this.keyValueSeparator = keyValueSeparator.getBytes(gbk);
                } catch (UnsupportedEncodingException uee) {
                  throw new IllegalArgumentException(”can’t find ” + gbk + ” encoding”);
                }
              }

              private void writeObject(Object o) throws IOException {
                if (o instanceof Text) {
          //        Text to = (Text) o;
          //        out.write(to.getBytes(), 0, to.getLength());
          //      } else {
                  out.write(o.toString().getBytes(gbk));
                }
              }

          }
              然后在mapreduce代碼中加入conf1.setOutputFormat(GbkOutputFormat.class)
              即可以gbk格式輸出中文。

          2、某次正常運行mapreduce實例時,拋出錯誤

          java.io.IOException: All datanodes xxx.xxx.xxx.xxx:xxx are bad. Aborting…

          at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.processDatanodeError(DFSClient.java:2158)

          at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.access$1400(DFSClient.java:1735)

          at org.apache.hadoop.dfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:1889)

          java.io.IOException: Could not get block locations. Aborting…

          at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.processDatanodeError(DFSClient.java:2143)

          at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.access$1400(DFSClient.java:1735)

          at org.apache.hadoop.dfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:1889)

          經查明,問題原因是linux機器打開了過多的文件導致。用命令ulimit -n可以發現linux默認的文件打開數目為1024,修改/ect/security/limit.conf,增加hadoop soft 65535

          再重新運行程序(最好所有的datanode都修改),問題解決

          3、運行一段時間后hadoop不能stop-all.sh的問題,顯示報錯

          no tasktracker to stop ,no datanode to stop

          問題的原因是hadoop在stop的時候依據的是datanode上的mapred和dfs進程號。而默認的進程號保存在/tmp下,linux默認會每隔一段時間(一般是一個月或者7天左右)去刪除這個目錄下的文件。因此刪掉hadoop-hadoop-jobtracker.pid和hadoop-hadoop-namenode.pid兩個文件后,namenode自然就找不到datanode上的這兩個進程了。

          在配置文件中的export HADOOP_PID_DIR可以解決這個問題

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 门源| 庆云县| 汾阳市| 仁寿县| 宁强县| 会泽县| 利津县| 西藏| 沈丘县| 于田县| 敦化市| 资中县| 高清| 华容县| 萨嘎县| 阿拉善右旗| 儋州市| 渝北区| 江口县| 潮安县| 定陶县| 东乡县| 高要市| 乳山市| 博爱县| 闽清县| 游戏| 屏山县| 恩施市| 凌海市| 株洲市| 遵化市| 炉霍县| 珲春市| 临清市| 凌云县| 南皮县| 饶平县| 郁南县| 凤山县| 宜都市|