【異常帖】--- 大資料出現的所有異常,錯誤,和注意事項整理---持續更新.....
阿新 • • 發佈:2018-11-17
一、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&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 這三個地方需要一致。