2017-02-22 120 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