2017-02-22 45 views
3

我試圖在OSX(El Capitan)上運行Docker容器中的Neo4j 3.1實例(通過Docker-Compose)。一切都很好,除非我嘗試增加超過默認512MB的Neo可用的最大堆空間。Docker中的Neo4j - 最大堆大小導致硬崩潰137

根據the docs,可以通過添加環境變量NEO4J_dbms_memory_heap_maxSize來實現,該環境變量然後導致服務器包裝腳本相應地更新neo4j.conf文件。我已經檢查過,並且正在按照預期進行更新。

的問題是,當我運行docker-compose up旋轉起來的容器中,Neo4j的實例崩潰了與137狀態碼。有一項研究告訴我這是一個基於堆大小最大限制的linux hard-crash

$ docker-compose up 
Starting elasticsearch 
Recreating neo4j31 
Attaching to elasticsearch, neo4j31 
neo4j31   | Starting Neo4j. 
neo4j31 exited with code 137 

我的問題:

  1. 這是由於碼頭工人或OSX的限制?
  2. 有沒有辦法可以修改這些限制?如果我將請求的限制放到1GB,它會旋轉起來,但是一旦我運行我的沉重查詢(這是造成對增加的堆空間需求的原因)仍然崩潰。
  3. 我正在運行的查詢是對包含全文屬性的大量節點(> 150k)進行大規模更新,以便它們可以使用插件同步到ElasticSearch。有沒有一種方法可以讓Neo一次完成500個節點,只使用密碼(我寧願避免寫一個腳本,對此感覺有點骯髒)。

我的碼頭工人,compose.yml如下:

--- 
version: '2' 
services: 
# ---<SNIP> 

    neo4j: 
    image: neo4j:3.1 
    container_name: neo4j31 
    volumes: 
     - ./docker/neo4j/conf:/var/lib/neo4j/conf 
     - ./docker/neo4j/mnt:/var/lib/neo4j/import 
     - ./docker/neo4j/plugins:/plugins 
     - ./docker/neo4j/data:/data 
     - ./docker/neo4j/logs:/var/lib/neo4j/logs 
    ports: 
     - "7474:7474" 
     - "7687:7687" 
    environment: 
     - NEO4J_dbms_memory_heap_maxSize=4G 

# ---<SNIP> 

回答

7
  1. 這是由於碼頭工人或OSX的限制?

    增加Docker可用RAM的數量來解決此問題。

  2. 有沒有辦法可以修改這些限制?如果我將請求的 限制放到1GB,它會旋轉起來,但是一旦我運行我的沉重 查詢(這是造成需要增加堆空間 無論如何)仍然崩潰。

    Docker Memory Settings

  3. 我正在運行的查詢是遇到了很多含全文屬性 節點(> 150K)的大規模更新,以便他們可以使用被 syncronised到ElasticSearch插入。有沒有一種方法讓我可以讓Neo一次完成500個節點,僅使用 密碼(我寧願避免寫一個腳本,如果可以的話,感覺有點 髒)。

    N/A這是一個NEO4J的具體問題。從上面列出的Docker問題中分離出來可能會更好。

+0

謝謝,這是現貨。我確信我錯過了一些至關重要的事情(我對Docker相當陌生!)。我正在尋找docker-compose命令中的一些東西,但這樣做更有意義! – n00dle

+0

不用擔心!當你剛開始的時候很容易忽視這些小事情!對不起,我無法回答你的neo4js問題。 –

2

3.查詢我跑橫跨含全文屬性很多節點(> 150K)大規模更新,以便他們可以使用插件來syncronised到ElasticSearch 。有沒有一種方法可以讓Neo一次完成500個節點,只使用密碼(我寧願避免寫一個腳本,對此感覺有點骯髒)。

您可以Neo4j的 與apoc插件的幫助下做到這一點,更具體apoc.periodic.iterateapoc.periodic.commit

,如果你會使用apoc.periodic.commit第一場比賽應該是具體的像例子中你標記哪些節點您已經同步,因爲它有時會在循環:

call apoc.periodic.commit(" 
match (user:User) WHERE user.synced = false 
with user limit {limit} 
MERGE (city:City {name:user.city}) 
MERGE (user)-[:LIVES_IN]->(city) 
SET user.synced =true 
RETURN count(*) 
",{limit:10000}) 

如果使用apoc.periodic.iterate可以運行它在並行模式:

CALL apoc.periodic.iterate(
"MATCH (o:Order) WHERE o.date > '2016-10-13' RETURN o", 
"with {o} as o MATCH (o)-[:HAS_ITEM]->(i) WITH o, sum(i.value) as value 
CALL apoc.es.post(host-or-port,index-or-null,type-or-null, 
query-or-null,payload-or-null) yield value return *", {batchSize:100, parallel:true}) 

注意,沒有必要對第二場比賽的條款和apoc.es.post是APOC,可以發送POST請求彈性的搜索功能。 更多信息請參閱documentation

+0

謝謝你,看起來非常有用! – n00dle