草庐IT

【Neo4j权威指南】SpringBoot 集成 Neo4j 教程SDN

lytao123 2023-06-08 原文

【Neo4j权威指南】SpringBoot 集成 Neo4j 教程SDN

一、Neo4j 介绍

Neo4j 采用 JAVA 语言开发,是一个高性能的图形数据库,NOSQL 中的一种,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎。

二、Neo4j 安装

单机版的 Neo4j 安装简单,从官网下载安装包,在 conf 目录下找到 neo4j.conf 配置修改如下配置信息,将注释去掉即可:

dbms.default_listen_address=0.0.0.0
dbms.connector.bolt.enabled=true
dbms.connector.bolt.listen_address=:7687
dbms.connector.http.enabled=true
dbms.connector.http.listen_address=:7474

运行命令启动服务:

./bin/neo4j start    # 启动
./bin/neo4j stop     # 停止服务
./bin/neo4j restart  # 重启服务
./bin/neo4j status   # 查看状态

三、SpringBoot 整合

  1. 引入关键的 Neo4j Maven 坐标
<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-neo4j</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>neo4j-java-driver</artifactId>
            <groupId>org.neo4j.driver</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.neo4j.driver</groupId>
    <artifactId>neo4j-java-driver</artifactId>
    <version>4.4.5</version>
</dependency>
  1. 编写实体和关系类

这里主要用到注解 @Node@Relationship@Property@RelationshipProperties@Id@TargetNode,分别对应的含义是,定义节点、定义关系、定义节点或关系属性、定义关系属性集合、定义SDN的主键、定义关系的另一端节点对象。如下所示:

/**
 * 电影实体类
 * @author ouyangrongtao
 * @since 2022-05-04 12:17
 */
@Data
@NoArgsConstructor
@Node("Movie")
public class MovieEntity {
    @Id
    private String title;

    @Property("description")
    private String description;

    @Relationship(type = "ACTED_IN", direction = Relationship.Direction.OUTGOING)
    private List<Roles> roles;

    @Relationship(type = "DIRECTED", direction = Relationship.Direction.INCOMING)
    private List<PersonEntity> directors;

    public MovieEntity(String title, String description) {
        this.title = title;
        this.description = description;
    }
}

/**
 * 人员实体类
 * @author ouyangrongtao
 * @since 2022-05-04 12:17
 */
@Data
@NoArgsConstructor
@Node("Person")
public class PersonEntity {
    @Id
    private String name;

    @Property("born")
    private Integer born;

    public PersonEntity(Integer born, String name) {
        this.born = born;
        this.name = name;
    }
}

/**
 * 电影-人员关系类
 * @author ouyangrongtao
 * @since 2022-05-04 12:13
 */
@Data
@NoArgsConstructor
@RelationshipProperties
public class Roles {
    @Property("id")
    private Long id;

    @Property("roles")
    private List<String> roleList;

    @TargetNode
    private PersonEntity person;

    public Roles(Long id, PersonEntity person, List<String> roleList) {
        this.id = id;
        this.person = person;
        this.roleList = roleList;
    }
}
  1. 编写repository
    repository 优点类似 jpa,就是继承的类不同。
/**
 * @author ouyangrongtao
 * @since 2022-05-04 12:30
 */
@Repository
public interface MovieRepository extends Neo4jRepository<MovieEntity, String> {

}
  1. 使用 repository 进行操作

/**
 * @author ouyangrongtao
 * @since 2022-05-04 12:50
 */
public interface MovieService {
    void add();
    
    MovieEntity findMovie();
    
    MovieEntity testNeo4jTemplate();
    
    Long count();
}
/**
 * @autho
 * r ouyangrongtao
 * @since 2022-05-04 12:51
 */
@Service
public class MovieServiceImpl implements MovieService {

    private final MovieRepository movieRepository;

    private final Neo4jTemplate neo4jTemplate;

    @Autowired
    public MovieServiceImpl(MovieRepository movieRepository, Neo4jTemplate neo4jTemplate) {
        this.movieRepository = movieRepository;
        this.neo4jTemplate = neo4jTemplate;
    }


    @Override
    public void add() {
        MovieEntity movie = new MovieEntity("我爱我的祖国", "该片讲述了新中国成立70年间普通百姓与共和国息息相关的故事");

        List<Roles> rolesList = new ArrayList<>(8);
        rolesList.add(new Roles(1L, new PersonEntity(1974, "黄渤"), List.of("林治远")));
        rolesList.add(new Roles(2L, new PersonEntity(1978, "张译"), List.of("高远")));
        rolesList.add(new Roles(3L, new PersonEntity(1974, "吴京"), List.of("陈冬冬")));
        rolesList.add(new Roles(4L, new PersonEntity(1985, "杜江"), List.of("朱涛")));
        rolesList.add(new Roles(5L, new PersonEntity(1957, "葛优"), List.of("张北京")));
        rolesList.add(new Roles(6L, new PersonEntity(1997, "刘昊然"), List.of("沃德乐")));

        movie.setRoles(rolesList);
        movie.setDirectors(Collections.singletonList(new PersonEntity(1952, "陈凯歌")));

        movieRepository.save(movie);
    }

    @Override
    public MovieEntity findMovie() {
        return movieRepository.findById("我爱我的祖国").orElse(null);
    }

    @Override
    public MovieEntity testNeo4jTemplate() {
        return neo4jTemplate.findById("我爱我的祖国", MovieEntity.class).orElse(null);
    }

    @Override
    public Long count() {
        return movieRepository.count();
    }
}

四、整合测试

  1. 使用接口进行测试
@GetMapping("/addMovie")
public void addMovie() {
    movieService.add();
}
  1. 单元测试
@SpringBootTest
class MovieServiceImplTest {

    @Autowired
    private MovieService movieService;

    @Test
    void add() {
        movieService.add();
    }

    @Test
    void count() {
        Long count = movieService.count();
        Assertions.assertTrue(count > 0);
    }

    @Test
    void findMovie() {
        MovieEntity movie = movieService.findMovie();
        Assertions.assertNotNull(movie);
    }

    @Test
    void testNeo4jTemplate() {
        MovieEntity movie = movieService.testNeo4jTemplate();
        Assertions.assertNotNull(movie);
    }
}

五、结果验证

  1. 查看 neo4j 数据库结果如下,从图可以看出插入正常;测试用例执行正常表示断言正确,查询返回的内容是期望的。

六、过程中遇到的问题记录

org.neo4j.driver.exceptions.DatabaseException: Index traversal aborted due to being stuck in infinite loop. This is most likely caused by an inconsistency in the index. Loop occurred when restarting search from root from page 5. | GB+Tree[file:/mnt/d/tmp/neo4j-community-4.4.6/data/databases/neo4j/neostore.labelscanstore.db, layout:TokenScanLayout[version:0.1, identifier:21483684112629824, fixedSize:true], generation:22/23]
	at org.neo4j.driver.internal.util.Futures.blockingGet(Futures.java:143)
	at org.neo4j.driver.internal.InternalResult.blockingGet(InternalResult.java:128)
	at org.neo4j.driver.internal.InternalResult.hasNext(InternalResult.java:64)
	at org.springframework.data.neo4j.core.DefaultNeo4jClient$DefaultRecordFetchSpec.one(DefaultNeo4jClient.java:329)
	... 98 more
	Suppressed: org.neo4j.driver.internal.util.ErrorUtil$InternalExceptionCause
		at org.neo4j.driver.internal.util.ErrorUtil.newNeo4jError(ErrorUtil.java:85)
		at org.neo4j.driver.internal.async.inbound.InboundMessageDispatcher.handleFailureMessage(InboundMessageDispatcher.java:105)
		at org.neo4j.driver.internal.messaging.common.CommonMessageReader.unpackFailureMessage(CommonMessageReader.java:83)
		at org.neo4j.driver.internal.messaging.common.CommonMessageReader.read(CommonMessageReader.java:59)
		at org.neo4j.driver.internal.async.inbound.InboundMessageHandler.channelRead0(InboundMessageHandler.java:83)
		at org.neo4j.driver.internal.async.inbound.InboundMessageHandler.channelRead0(InboundMessageHandler.java:35)
		at org.neo4j.driver.internal.shaded.io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
		at org.neo4j.driver.internal.shaded.io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
		at org.neo4j.driver.internal.shaded.io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)
		at org.neo4j.driver.internal.async.inbound.MessageDecoder.channelRead(MessageDecoder.java:47)
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
		at org.neo4j.driver.internal.shaded.io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
		at org.neo4j.driver.internal.shaded.io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
		at org.neo4j.driver.internal.shaded.io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
		at org.neo4j.driver.internal.shaded.io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
		at org.neo4j.driver.internal.shaded.io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
		at org.neo4j.driver.internal.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
		at org.neo4j.driver.internal.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
		at org.neo4j.driver.internal.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
		at org.neo4j.driver.internal.shaded.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
		at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
		at org.neo4j.driver.internal.shaded.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
		at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
		at java.base/java.lang.Thread.run(Thread.java:834)
org.neo4j.driver.exceptions.ServiceUnavailableException: Connection to the database terminated. Please ensure that your database is listening on the correct host and port and that you have compatible encryption settings both on Neo4j server and driver. Note that the default encryption setting has changed in Neo4j 4.0.
		at org.neo4j.driver.internal.util.ErrorUtil.newConnectionTerminatedError(ErrorUtil.java:56) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.util.ErrorUtil.newConnectionTerminatedError(ErrorUtil.java:49) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.async.inbound.ChannelErrorHandler.channelInactive(ChannelErrorHandler.java:74) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:262) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:248) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:241) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:389) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:354) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:262) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:248) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:241) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:389) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:354) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:262) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:248) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:241) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPipeline.java:1405) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:262) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:248) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:901) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannel$AbstractUnsafe$8.run(AbstractChannel.java:831) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:469) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:497) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[neo4j-java-driver-4.4.0.jar:4.4.0-a44346cddc3aac335fd3d98cf18e489b3790ebee]
		... 1 common frames omitted

在集成的过程中遇到如上的报错信息,特别是org.neo4j.driver.exceptions.DatabaseException: Index traversal aborted due to being stuck in infinite loop. This is most likely caused by an inconsistency in the index 异常,在查询问题所在时发现大家遇到这个问题的人几乎没有,也没有解决方案,但实际是因为neo4j驱动 neo4j-java-driver 的版本与数据库的版本不兼容导致;在遇到第二个问题的时候,也是因为驱动版本的原因,但需要注意配置 spring.neo4j.security.encrypted 需要等于 false

有关【Neo4j权威指南】SpringBoot 集成 Neo4j 教程SDN的更多相关文章

  1. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  2. ruby-on-rails - 我如何将 Hoptoad 与 DelayedJob 和 DaemonSpawn 集成? - 2

    我一直很高兴地使用DelayedJob习惯用法:foo.send_later(:bar)这会调用DelayedJob进程中对象foo的方法bar。我一直在使用DaemonSpawn在我的服务器上启动DelayedJob进程。但是...如果foo抛出异常,Hoptoad不会捕获它。这是任何这些包中的错误...还是我需要更改某些配置...或者我是否需要在DS或DJ中插入一些异常处理来调用Hoptoad通知程序?回应下面的第一条评论。classDelayedJobWorker 最佳答案 尝试monkeypatchingDelayed::W

  3. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  4. jenkins部署1--jenkins+gitee持续集成 - 2

    前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon

  5. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  6. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  7. ruby - 在 RUBY 上的 PADRINO 框架上使用 RSPEC 进行测试的教程 - 2

    我是Ruby新手,并被要求在我们的新项目中使用它。我们还被要求使用Padrino(Sinatra)作为后端/框架。我们被要求使用Rspec进行测试。我一直在寻找可以指导在Padrino上使用RspecforRuby的教程。我得到的主要是引用RoR。但是,我需要RubyonPadrino。请在任何入门/指南/引用/讨论等方面指导我。如有不妥之处请指正。可能是我没有针对我的问题搜索正确的词/短语组合。我正在使用Ruby1.9.3和Padrinov.0.10.6。注意:我还提到了SOquestion,但它没有帮助。 最佳答案 我没用过Pa

  8. Ruby 和指南针路径与 yeoman 项目 - 2

    我安装了ruby​​、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom

  9. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  10. 三分钟集成 TapTap 防沉迷 SDK(Unity 版) - 2

    三分钟集成Tap防沉迷SDK(Unity版)一、SDK介绍基于国家对上线所有游戏必须增加防沉迷功能的政策下,TapTap推出防沉迷SDK,供游戏开发者进行接入;允许未成年用户在周五、六、日以及法定节假日晚上8:00-9:00进行游戏,防沉谜时间段进入游戏会弹窗进行提示!开发环境要求:Unity2019.4或更高版本iOS10或更高版本Android5.0(APIlevel21)或更高版本🔗Unity集成Demo参考链接🔗UnityTapSDK功能体验APK下载链接二、集成前准备1.创建应用进入开发者后台,按照提示开始创建应用;2.开通服务在使用TDS实名认证和防沉迷服务之前,需要在上面创建的应

随机推荐