我的家園

          我的家園

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

          Posted on 2012-04-15 16:37 zljpp 閱讀(238) 評論(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可以解決這個問題

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


          網站導航:
           
          主站蜘蛛池模板: 肥东县| 三都| 锦屏县| 桂东县| 延津县| 伊宁市| 凌海市| 汶川县| 永胜县| 若羌县| 桃园市| 图们市| 漠河县| 汕头市| 许昌县| 余江县| 扬州市| 库伦旗| 平泉县| 临沧市| 华宁县| 固始县| 嘉善县| 霸州市| 南川市| 亳州市| 军事| 平顶山市| 临武县| 凤台县| 威远县| 南澳县| 河东区| 华宁县| 平阳县| 石台县| 温州市| 红桥区| 夏津县| 三台县| 遵义市|