Solr Dataimporthandler 匯入MySQL 記憶體溢出。

來源:互聯網
上載者:User

標籤:

  最近準備把一千九百多萬資料匯入Solr中,在以前測試資料只有一兩百萬,全量匯入沒有任務問題。但是,換成一千九百萬資料時,solr報記憶體異常,整個tomcat無法使用。我發現,我給tomcat最大堆記憶體512M。我覺得,可能是記憶體過小,於是,我把記憶體改大些,1024M(set JAVA_OPTS=-server -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256M )。結果,還是記憶體溢出。我想已經不是tomcat記憶體的問題(當然,如果你的記憶體足夠大,也是可行的)。問題,應該出在solr的dataimporthandler取資料那塊。solr除了記憶體溢出錯誤,還有其他異常:

  

Full Import failed:java.lang.RuntimeException: java.lang.RuntimeException: org.apache.solr.handler.dataimport.DataImportHandlerException: Unable to execute query: select * from POI Processing Document # 1at org.apache.solr.handler.dataimport.DocBuilder.execute(DocBuilder.java:278)at org.apache.solr.handler.dataimport.DataImporter.doFullImport(DataImporter.java:411)at org.apache.solr.handler.dataimport.DataImporter.runCmd(DataImporter.java:483)at org.apache.solr.handler.dataimport.DataImporter$1.run(DataImporter.java:464)Caused by: java.lang.RuntimeException: org.apache.solr.handler.dataimport.DataImportHandlerException: Unable to execute query: select * from POI Processing Document # 1at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:418)at org.apache.solr.handler.dataimport.DocBuilder.doFullDump(DocBuilder.java:331)at org.apache.solr.handler.dataimport.DocBuilder.execute(DocBuilder.java:239)... 3 moreCaused by: org.apache.solr.handler.dataimport.DataImportHandlerException: Unable to execute query: select * from POI Processing Document # 1at org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow(DataImportHandlerException.java:71)at org.apache.solr.handler.dataimport.JdbcDataSource$ResultSetIterator.<init>(JdbcDataSource.java:281)at org.apache.solr.handler.dataimport.JdbcDataSource.getData(JdbcDataSource.java:238)at org.apache.solr.handler.dataimport.JdbcDataSource.getData(JdbcDataSource.java:42)at org.apache.solr.handler.dataimport.SqlEntityProcessor.initQuery(SqlEntityProcessor.java:59)at org.apache.solr.handler.dataimport.SqlEntityProcessor.nextRow(SqlEntityProcessor.java:73)at org.apache.solr.handler.dataimport.EntityProcessorWrapper.nextRow(EntityProcessorWrapper.java:243)at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:477)at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:416)... 5 moreCaused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failureThe last packet successfully received from the server was 395,021 milliseconds ago.  The last packet sent successfully to the server was 395,021 milliseconds ago.at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:526)at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)at com.mysql.jdbc.MysqlIO.nextRowFast(MysqlIO.java:1653)at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1409)at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:2883)at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:476)at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:2576)at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1757)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2167)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2637)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2566)at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:782)at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:625)at org.apache.solr.handler.dataimport.JdbcDataSource$ResultSetIterator.<init>(JdbcDataSource.java:274)... 12 moreCaused by: java.io.EOFException: Can not read response from server. Expected to read 39 bytes, read 30 bytes before connection was unexpectedly lost.at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2497)at com.mysql.jdbc.MysqlIO.nextRowFast(MysqlIO.java:1634)... 23 more

  我搜尋了一下Solr的wiki,瞭解到solr jdbc取資料時,setBatchSize的問題。預設,會把很多資料放到記憶體中,這也是導致我的記憶體居高不下,後來導致記憶體溢出的原因。於是,我修改dataimporthandler設定檔:batchSize="-1" 解決記憶體溢出  

  設定檔修改如下:

      <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/world" user="root" password="root" batchSize="-1" />

  重啟一個solr的core,重新匯入,問題解決。

  

  

Solr Dataimporthandler 匯入MySQL 記憶體溢出。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.