1. 程式人生 > >【異常帖】--- 大資料出現的所有異常,錯誤,和注意事項整理---持續更新.....

【異常帖】--- 大資料出現的所有異常,錯誤,和注意事項整理---持續更新.....

一、Ubuntu --> 修改主機名稱之後,要特別主要修改主機和ip的對映(否則會造成java.net.UnknownHostException: 主機名: 主機名的異常,mkdir: Call From java.net.UnknownHostException: s100: s100: unknown error to localhost:8020 failed on connection exception)
    解決辦法:
    修改/etc/hosts檔案
    127.0.0.1 主機名 localhost.localdomain localhost
    或是再新增一條
    127.0.0.1 主機名
    主機名是新加的,原來沒有,儲存,問題解決。

二、ubuntu--> 解決sudo 不在命令當中的問題
    a. $> su root
    b. $> nano /etc/sudoers
    c. 修改檔案,新增一行文字
     # User privilege specification
    root    ALL=(ALL:ALL) ALL
    ubuntu    ALL=(ALL:ALL) ALL          //新增的文字內容

三、ubuntu--> 修改使用者的描述符
    a. $> nano /etc/passwd
    b. 修改你的使用者名稱描述符
    ubuntu:x:1000:1000:ubuntu,,,:/home/ubuntu:/bin/bash
    下劃線的ubuntu就是你的使用者名稱描述符

四、ubuntu--> gedit在root使用者下不好用
    a.使用sudo gedit 命令

五、ubuntu--> vmware Vnet8虛擬網絡卡丟失的找回問題
   1.開啟VMware Workstation,點選Edit --> Virtual Network Edit --> 開啟Virtual Network Edit框
   2.點選最下面的的Restore Default 按鈕,恢復預設設定,這會在網路連線那塊可以看到丟失的VMware Network Adapter VMnet8 又回來
   3.或者 在Virtual Network Edit框 找到一個Add Network... 的按鈕 彈出來一個框 然後在select a network to add 中選擇VMnet8,單擊OK 就可以啦

六、hadoop --> Call From master/192.168.128.135 to master:8485 failed on connection exception: java.net.ConnectException: Connection refused
解決方案:
    1.  修改core-site.xml中的ipc引數
    <!--修改core-site.xml中的ipc引數,防止出現連線journalnode服務ConnectException-->
    <property>
        <name>ipc.client.connect.max.retries</name>
        <value>100</value>
        <description>Indicates the number of retries a client will make to establish a server connection.</description>
    </property>
    <property>
        <name>ipc.client.connect.retry.interval</name>
        <value>10000</value>
        <description>Indicates the number of milliseconds a client will wait for before retrying to establish a server connection.</description>
    </property>
    2注意:
       1) 僅對於這種由於服務沒有啟動完成造成連線超時的問題,都可以調整core-site.xml中的ipc引數來解決。如果目標服務本身沒有啟動成功,這邊調整ipc引數是無效的。
       2) 該配置使namenode連線journalnode最大時間增加至1000s(maxRetries=100, sleepTime=10000),假如叢集節點數過多,或者網路情況不穩定,造成連線時間超過1000s,仍會導致namenode掛掉。


七、Ubuntu -->  在ubuntu中配置靜態IP後無法正常上網
    解決:
    1、在終端執行 vim /etc/network/interfaces   在檔案中加入如下內容,閘道器要寫上,我開始一直無法上網就是因為沒有配置閘道器
        auto lo
            iface lo inet loopback
            #iface eth0 inet static
            iface eth0 inet static
            address 192.168.43.131    //你挑選的靜態ip
            netmask 255.255.255.0        //子網掩碼
            gateway 192.168.43.2         //閘道器
            dns-nameservers 180.76.76.76   //DNS閘道器,使用百度的,有時候不能上網,是因為dns
            auto eth0

    2、執行 vim /etc/NetworkManager/NetworkManager.conf     將managed=false 改成true
    3、執行vim /etc/resolvconf/resolv.conf.d/base 然後加入 nameserver 你的DNS伺服器IP
    4、重啟機器。應該就可以上網了。


八、Ubuntu --> 對於eclipse native-lzo library not available (找不到hadoop native lib等 ) 錯誤
   解決:在usr/lib下,建立hadoop 的本地庫的快捷方式
    $> sudo ln -s /soft/hadoop/lib/native/libhadoop.so.1.0.0 /usr/lib/libhadoop.so


九、Winfows--> 異常:
    java.lang.NullPointerException at java.lang.ProcessBuilder.start(Unknown Source) at org.apache.hadoop.util.Shell.runCommand(Shell.java:482)
    Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
    解決:
    解決方法是下載https://github.com/srccodes/hadoop-common-2.2.0-bin(本地也有壓縮包)檔案然後將其中的hadoop.dll檔案放到hadoop安裝路徑的bin資料夾下(配置好HADOOP_HOME的環境變數),然後重啟電腦,這樣問題就能得到解決了!
        如果還是不行,請檢查本地的java安裝目錄是否有空格,比如progeam files ...,如果有,請嘗試將jdk安裝到無空格目錄或者採用下面的方法
            找到windows hadoop安裝目錄,E:\hadoop-2.7.3\etc\hadoop\hadoop-env.cmd,修改其中的JAVA_HOME(目錄是C:\Program Files\Java\jdk1.8.0_121,因為Program Files中存在空格,所以出現錯誤)只需要用
        PROGRA~1代替Program Files即可


十、hadoop--> eclipse 中執行hadoop mr作業的時候,./hadoop jar報錯classnotfound,hadoop執行的時候拋 class not found 異常
    解決方案:
    1.請檢查是否已經設定好 入口jar類,map類和reduce類
    job.setJarByClass(MaxTemperature.class)
    //設定MapClass
    job.setMapperClass(MyMapper.class);
    //設定ReduceClass
    job.setReducerClass(MyReducer.class);

    2.如果已經有,還是不行,那麼就將app入口類和map類,reduce類,打成jar包,放入eclipse src目錄下,並且構建到classpath,完美解決


十一、hadoop--> eclipse 中執行hadoop mr作業的時候,mr作業一直卡在Running Job狀態,檢視日誌發現是一直連線伺服器失敗,顯示Connection 0.0.0.0:XXXX Failure
018-08-26 11:22:11,872 INFO [main] org.apache.hadoop.yarn.client.RMProxy: Connecting to ResourceManager at /0.0.0.0:803
    解決方案:
    在yarn-site.xml中,配置好namenode的ip (master ip),新增如下配置。即可完美解決。當然,也可以在src目錄下,建立新的yarn-site.xml檔案,這樣就避免了修改系統配置檔案了。
    <property>
         <name>yarn.resourcemanager.scheduler.address</name>
         <value>s100:8030</value>
    </property>
    <property>
            <name>yarn.resourcemanager.resource-tracker.address</name>
            <value>s100:8031</value>
    </property>
     <property>
            <name>yarn.resourcemanager.address</name>
            <value>s100:8032</value>
      </property>


十二、eclipse --> 解決在eclipse/plusins目錄下繼承外掛之後,重新開啟eclipse,不顯示外掛的問題
    解決方案:
    把eclipse安裝目錄下的configuration/org.eclipse.update和runtime的目錄整個刪除,重啟eclipse。(org.eclipse.update 資料夾下記錄了外掛的歷史更新情況,它只記憶了以前的外掛更新情況,而新安裝的外掛它並不記錄,所以刪除掉這個資料夾就可以解決這個問題了,不過刪除掉這個資料夾後, eclipse 會重新掃描所有的外掛,此時再重新啟動 eclipse 時可能會比剛才稍微慢點)


十三、hadoop --> 當hadoop mr作業連線MySql資料庫的時候,提示:Caused by: java.lang.RuntimeException: java.sql.SQLException: Access denied for user 'mysql'@'192.168.0.104' ((using password: YES)
    解決方案:
    1.首先檢查mysql服務是否啟動,若已啟動則先將其停止服務,可在開始選單的執行,使用命令:net stop mysql
    2.開啟一個cmd視窗,切換到mysql的bin目錄,執行命令:mysqld --defaults-file="C:\Program Files\MySQL\MySQL Server 5.5\my.ini" --console --skip-grant-tables   該命令通過跳過許可權安全檢查,開啟mysql服務,這樣連線mysql時,可以不用輸入使用者密碼。
    3.驗證一下,是不是不需要密碼就可以登入mysql了,如果是,問題解決


十四、hadoop --> 關於ssh報錯:Agent admitted failure to sign using the key.
    解決方案:
    看了書上使用ssh時可以免密碼來進行遠端連線,詳細見:http://blog.csdn.net/it_dream_er/article/details/50752326
    SSH生成id_rsa, id_rsa.pub後,連線伺服器卻報:
    Agent admitted failure to sign using the key.錯誤。
    解決方法:
    在當前使用者下執行命令:
    ssh-add
    即可解決


十五、hive --> 啟用hive時報以下錯誤:
Cannot find hadoop installation: $HADOOP_HOME or $HADOOP_PREFIX must be set or hadoop must be in the path

    解決方案(一):
    1.$ cd ~/hive/conf/
    2.$ cp hive-env.sh.template hive-env.sh
    3.在hive-env.sh檔案里加下面的內容
    4.export HADOOP_HOME=/home/soft/hadoop

    解決方案(二):
    1.在/etc/environment 中配置環境變數 HADOOP_HOME=/soft/hadoop


十六、Hadoop --> Exception in thread "main" java.lang.RuntimeException: org.xml.sax.SAXParseException; systemId: file:/soft/apache-hive-2.1.1-bin/conf/hive-site.xml; lineNumber: 23; columnNumber: 5; Invalid byte 2 of 2-byte UTF-8 sequence.hive執行報錯
    解決方案:
    檢查配置檔案hive-site.xml中是否有中文,有的話去掉中文就OK了


十七、Hadoop --> 格式化叢集之後,datanode無法啟動的問題
    解決方案:因為格式化叢集之後,會重新生成Version,從而與datanode的Version檔案內容不一致,導致無法啟動。刪除~/hadoop/dfs資料夾或者找到其中的Version檔案,更改其版本為Namenode的版本就行了


十八、Hive --> This command is not allowed on an ACID table mydata.tx with a non-ACID transaction manager.
    問題出在:當設定成TBLPROPERTIES(“transactional”=”true”),hive中需要在配置檔案中設定:需要更改配置檔案,但是會更改全域性配置
    Client Side
    hive.support.concurrency – true
    hive.enforce.bucketing – true (Not required as of Hive 2.0)
    hive.exec.dynamic.partition.mode – nonstrict
    hive.txn.manager – org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
    Server Side (Metastore)
    hive.compactor.initiator.on – true (See table below for more details)
    hive.compactor.worker.threads – a positive number on at least one instance of the Thrift metastore service


    也可以使用簡單的方法,設定成本次有效。即:set屬性
    SET hive.support.concurrency = true;
    SET hive.enforce.bucketing = true;
    SET hive.exec.dynamic.partition.mode = nonstrict;
    SET hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
    SET hive.compactor.initiator.on = true;
    SET hive.compactor.worker.threads = 1;


十九、Hbase --> 解決hbase master有時候會啟動不起來,找不到hdfs的問題
    解決方案:
    1.新增hadoop的配置檔案目錄到HBASE_CLASSPATH的環境變數中,並分發到所有的節點
        [/soft/hbase/conf/hbase-env.sh]
        export HBASE_CLASSPATH=$HBASE_CLASSPATH:/soft/hadoop/etc/hadoop

    2.在hbase/conf目錄下,建立到hadoop的hdfs-site.xml的符號連結,每個節點都要弄
        $>ln -s /soft/hadoop/etc/hadoop/hdfs-site.xml /soft/hbase/conf/hdfs-site.xml

    3.修改hbase-site.xml檔案中hbase.rootdir的目錄值。並分發到所有節點
        [/soft/hbase/conf/hbase-site.xml]
          <property>
              <name>hbase.rootdir</name>
              <value>hdfs://mycluster/hbase</value>
          </property>


二十、mybatis --> org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### The error may exist in org/mybatis/example/BlogMapper.xml
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration.
Cause: java.io.IOException: Could not find resource org/mybatis/example/BlogMapper.xml

    解決方案:
    方案1.將報告缺失的mapper對映檔案放到resouces目錄下
    方案2.在maven的pom.xml中配置以下內容
    <build>
       <resources>
           <resource>
               <directory>src/main/java</directory>
               <includes>
                   <include>**/*.xml</include>
               </includes>
           </resource>
       </resources>
    </build>


二十一、在使用spring c3p0資料來源的時候 java.sql.SQLException: Access denied for user ''@'localhost' (using password: NO)

    解決方案:
    出錯:<!-- 配置c3p0池化資料來源bean -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mybatis"/>
        <property name="user" value="mysql"/>
        <property name="password" value="mysql"/>
        <property name="maxPoolSize" value="10"/>
        <property name="minPoolSize" value="2"/>
        <property name="initialPoolSize" value="3"/>
        <property name="acquireIncrement" value="2"/>
    </bean>

    解決:更改上述的jdbcurl 屬性:<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mybatis?user=mysql&amp;password=mysql"/>


二十二、Idea 新增完專案以後自動生成的web.xml報錯 'org.springframework.web.servlet.DispatcherServlet' is not assignable to 'javax.servlet.Servlet
    解決方案
    Project Structure - Modules - 你的專案  - Dependencies --> +
    新增Tomcat library


二十三、使用Jstl異常:The absolute uri: http://java.sun.com/jsp/jstl/core cannot&nbs
    錯誤提示是:
           org.apache.jasper.JasperException: This absolute uri http://java.sun.com/jsp/jstl/core) cannot be resolved in either web.xml or the jar files deployed with this application
    解決方案:web專案出現如上問題,據查是版本問題:
        JSTL 1.0 的宣告是:
        <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core " %>

        JSTL1.1以後 的宣告是:
        <%@ taglib prefix="c" uri=http://java.sun.com/jsp/jstl/core %>

          專案中,已經是 jstl 1.2 版本了,頁面中也全部是用<%@ taglib prefix="c"uri=http://java.sun.com/jsp/jstl/core %>這種方式。javaee5之後就只有 jstl.jar 這一個jar包了,沒有standard.jar包,tld檔案也打包到jstl.jar裡面去了,網上有一種說法是在web.xml檔案裡配置jsp-config的解決方式是沒有用的。
          最終查到問題的解決方法是: jstl.jar 包在ide專案中有,但在tomcat釋出的應用WEB-INF/lib下沒有,這是工具釋出專案的問題,複製一個jstl.jar包到WEB-INF/lib下問題就解決了。
    如果是idea或者ide出現了這個錯誤,找到jar包,構建到類路徑下就可以了


二十四、at org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient.<init>(SessionHiveMetaStoreClient.java:74):spark整合hive,將hive-site.xml配置檔案拷貝到spark/conf下之後,啟動spark-shell,就報錯。
    解決方案:

    比較簡單的解決方案是修改hive-site.xml裡的配置去掉驗證。
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>


    再次啟動spark-shell不在報此錯誤,但是又多了另一個錯誤:

    原因是我的Spark主節點上有一個hive的主節點,hive的主節點上的hive-site.xml並沒有配置類似連結主節點的配置,Spark中的hive-site.xml新增上如下配置就好了
    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://192.168.194.131:9083</value>
        <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
    </property>



二十五、******error: Unable to find encoder for type stored in a Dataset. Primitive types (Int, String, etc) and Product types (case classes) are supported by importing spark.implicits._ Support for serializing other types will be added in future releases. resDf_upd.map(row => {******
    解決方案:
    (1)針對這個問題,網上所得獲取的資料還真不多。不過想著肯定是dataset統一了datframe與rdd之後就出現了新的要求。
    經過檢視spark官方文件,對spark有了一條這樣的描述。
    Dataset is Spark SQL’s strongly-typed API for working with structured data, i.e. records with a known schema.
    Datasets are lazy and structured query expressions are only triggered when an action is invoked. Internally, aDataset represents a logical plan that describes the computation query required to produce the data (for a givenSpark SQL session)

    A Dataset is a result of executing a query expression against data storage like files, Hive tables or JDBC databases. The structured query expression can be described by a SQL query, a Column-based SQL expression or a Scala/Java lambda function. And that is why Dataset operations are available in three variants.

    從這可以看出,要想對dataset進行操作,需要進行相應的encode操作。特別是官網給的例子

    // No pre-defined encoders for Dataset[Map[K,V]], define explicitly
    implicit val mapEncoder = org.apache.spark.sql.Encoders.kryo[Map[String, Any]]
    // Primitive types and case classes can be also defined as
    // implicit val stringIntMapEncoder: Encoder[Map[String, Any]] = ExpressionEncoder()

    // row.getValuesMap[T] retrieves multiple columns at once into a Map[String, T]
    teenagersDF.map(teenager => teenager.getValuesMap[Any](List("name", "age"))).collect()
    // Array(Map("name" -> "Justin", "age" -> 19))

    從這看出,要進行map操作,要先定義一個Encoder。。
    這就增加了系統升級繁重的工作量了。為了更簡單一些,幸運的dataset也提供了轉化RDD的操作。因此只需要將之前dataframe.map

    (2)如果無法使用(1),請參照(2)
    檢視scala程式碼內部類:將case class 定義到main函式之外,並且在main函式內部import spark.implicits._ 試驗一下


二十六、spark-shell執行時報‘“E:Program”’'不是內部或外部命令,也不是可執行的程式

    安裝完成後直接在CMD中執行spark-shell報錯
    ‘“E:Program”’'不是內部或外部命令,也不是可執行的程式
    一般出現這個問題就是,Path路徑中存在空格,但是我得SPARK_HOME環境變數中不存空格,找了好久,發現在spark的安裝目錄下的bin目錄下的spark-class2.cmd檔案中(spark1.x的版本中,直接是spark-class.cmd檔案),在執行啟動過程中,會執行這個檔案,這個檔案中會呼叫JAVA_HOME環境變數,而我的JAVA_HOME環境變數是在E:\Program Files目錄下,所以在執行這裡報錯了。
    然後,我把jdk解除安裝了,然後重新安裝的jdk,這次安裝時不放在Program Files目錄下,而是放在沒有空格的路徑下。
    如此這般後,就OK 了


二十七、lambda expressions are not supported at language level '5'
    解決方案:
    剛把Eclipse中新建的練習專案匯入idea的時候想使用lambda表示式發現一直報如下錯誤:
    lambda expressions are not supported at language level '5'
    將專案預設sdk替換成jdk8仍然不起作用,最後發現需要修改Source中的languagelevel為8,找到stackoverflow上一個回答不錯,copy如下供大家參考:
    I had to do a few things to get rid of this problem.
    File > Project Structure > Project > Project SDK: Change it to Java 1.8.XX
    File > Project Structure > Project > Language Level: SDK 8 (in my case SDK default was already 8)
    File > Project Structure > Modules > Sources > SDK 8 (in my case SDK default was already 8)
    File > Settings > Build, Execution, Deployment > Compiler > Java Compiler > Project bytecode version > 1.8
    File > Settings > Build, Execution, Deployment > Compiler > Java Compiler > Per-module bytecode version > Target bytecode version > 1.8
    That should do the trick.

二十八、Information:java: javacTask: 源發行版 1.8 需要目標發行版 1.8
    解決方案:
    1,Project Structure裡確認兩個地方:Project sdk以及project language level
    2,Project Structure->Modules裡Sources裡的Language level
    3,Preferences->java Compiler->Per-module bytecode Version
    這三個地方需要一致。