【问题标题】:TargetNotAMemberException while executing a task using distributed executor service - hazelcast使用分布式执行器服务执行任务时出现 TargetNotAMemberException - hazelcast
【发布时间】:2013-12-16 21:24:28
【问题描述】:

我正在尝试使用 hazelcast 3.1 的分布式执行器服务,发现我无法使用 submitToMember(task,member)。在下面的示例中,10.69.108.60 是我的本地机器,170.194.100.111 是我的远程机器。当 member 是我的本地计算机时,我可以在未来获得返回值,但如果 member 是远程计算机,则会给我一个 TargetNotAMemberException。 下面是代码

public class DistExecutionTest {

    public static void main(String args[]){
        DistributedExecutor dex = new DistributedExecutor();

        try {
            Member member = new MemberImpl(new Address("170.194.100.111",5701), false );

            String msg;
                msg = dex.echoOnTheMember("Hey youuuu!", member);

            System.out.println(msg);
        } catch (UnknownHostException e1) {
            e1.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }catch (Exception e) {
            e.printStackTrace();
        }


    }
}

public class DistributedExecutor {
        Config config;
        NetworkConfig network;
        JoinConfig join;

    DistributedExecutor(){
        config = new Config();
        network = config.getNetworkConfig();
//      network.setPort(5701);
        join = network.getJoin();
        join.getMulticastConfig().setEnabled(false);

        join.getTcpIpConfig().addMember("170.194.100.111").addMember("10.69.108.60").setEnabled(true);
        network.getInterfaces().setEnabled(true).addInterface("170.194.100.*").addInterface("10.69.108.*");
    }

    public String echoOnTheMember(String input, Member member) throws Exception {
        Callable<String> task = new DistObject(input);
        HazelcastInstance hz = Hazelcast.newHazelcastInstance(config);
        IExecutorService executorService = hz.getExecutorService("default");
        Future<String> future = executorService.submitToMember(task, member);
        String distObjectResult = future.get();
        return distObjectResult;
    }
}

public class Echo implements Callable<String>, Serializable, HazelcastInstanceAware {

    private static final long serialVersionUID = -3164053990811643392L;

    String message = null;
    transient HazelcastInstance localInstance;
    public Echo(String msg){
        message = msg;
    }

    @Override
    public String call() throws Exception {
        return localInstance.toString() + message;
    }

    @Override
    public void setHazelcastInstance(HazelcastInstance hazelcastInstance) {
        this.localInstance = hazelcastInstance;
    }

}

这是本地机器上的日志

Dec 17, 2013 1:03:20 PM com.hazelcast.instance.DefaultAddressPicker
INFO: Interfaces is enabled, trying to pick one address matching to one of: [162.124.194.*, 10.38.148.*]
Dec 17, 2013 1:03:20 PM com.hazelcast.instance.DefaultAddressPicker
INFO: Prefer IPv4 stack is true.
Dec 17, 2013 1:03:20 PM com.hazelcast.instance.DefaultAddressPicker
INFO: Picked Address[10.69.108.60]:5701, using socket ServerSocket[addr=/0:0:0:0:0:0:0:0,localport=5701], bind any local is true
Dec 17, 2013 1:03:21 PM com.hazelcast.system
INFO: [10.69.108.60]:5701 [dev] Hazelcast Community Edition 3.1 (20131011) starting at Address[10.69.108.60]:5701
Dec 17, 2013 1:03:21 PM com.hazelcast.system
INFO: [10.69.108.60]:5701 [dev] Copyright (C) 2008-2013 Hazelcast.com
Dec 17, 2013 1:03:21 PM com.hazelcast.instance.Node
INFO: [10.69.108.60]:5701 [dev] Creating TcpIpJoiner
Dec 17, 2013 1:03:21 PM com.hazelcast.core.LifecycleService
INFO: [10.69.108.60]:5701 [dev] Address[10.69.108.60]:5701 is STARTING
Dec 17, 2013 1:03:21 PM com.hazelcast.cluster.TcpIpJoiner
INFO: [10.69.108.60]:5701 [dev] Connecting to possible member: Address[10.69.108.60]:5703
Dec 17, 2013 1:03:21 PM com.hazelcast.cluster.TcpIpJoiner
INFO: [10.69.108.60]:5701 [dev] Connecting to possible member: Address[10.69.108.60]:5702
Dec 17, 2013 1:03:21 PM com.hazelcast.nio.SocketConnector
INFO: [10.69.108.60]:5701 [dev] Connecting to /10.69.108.60:5703, timeout: 0, bind-any: true
Dec 17, 2013 1:03:21 PM com.hazelcast.nio.SocketConnector
INFO: [10.69.108.60]:5701 [dev] Connecting to /10.69.108.60:5702, timeout: 0, bind-any: true
Dec 17, 2013 1:03:21 PM com.hazelcast.cluster.TcpIpJoiner
INFO: [10.69.108.60]:5701 [dev] Connecting to possible member: Address[170.194.100.111]:5703
Dec 17, 2013 1:03:21 PM com.hazelcast.cluster.TcpIpJoiner
INFO: [10.69.108.60]:5701 [dev] Connecting to possible member: Address[170.194.100.111]:5702
Dec 17, 2013 1:03:21 PM com.hazelcast.nio.SocketConnector
INFO: [10.69.108.60]:5701 [dev] Connecting to /170.194.100.111:5703, timeout: 0, bind-any: true
Dec 17, 2013 1:03:21 PM com.hazelcast.nio.SocketConnector
INFO: [10.69.108.60]:5701 [dev] Connecting to /170.194.100.111:5702, timeout: 0, bind-any: true
Dec 17, 2013 1:03:21 PM com.hazelcast.cluster.TcpIpJoiner
INFO: [10.69.108.60]:5701 [dev] Connecting to possible member: Address[170.194.100.111]:5701
Dec 17, 2013 1:03:21 PM com.hazelcast.nio.SocketConnector
INFO: [10.69.108.60]:5701 [dev] Connecting to /170.194.100.111:5701, timeout: 0, bind-any: true
Dec 17, 2013 1:03:22 PM com.hazelcast.nio.SocketConnector
INFO: [10.69.108.60]:5701 [dev] Could not connect to: /10.69.108.60:5703. Reason: SocketException[Connection refused: connect to address /10.69.108.60:5703]
Dec 17, 2013 1:03:22 PM com.hazelcast.nio.SocketConnector
INFO: [10.69.108.60]:5701 [dev] Could not connect to: /10.69.108.60:5702. Reason: SocketException[Connection refused: connect to address /10.69.108.60:5702]
Dec 17, 2013 1:03:22 PM com.hazelcast.nio.SocketConnector
INFO: [10.69.108.60]:5701 [dev] Could not connect to: /170.194.100.111:5703. Reason: SocketException[Connection refused: connect to address /170.194.100.111:5703]
Dec 17, 2013 1:03:22 PM com.hazelcast.nio.SocketConnector
INFO: [10.69.108.60]:5701 [dev] Could not connect to: /170.194.100.111:5702. Reason: SocketException[Connection refused: connect to address /170.194.100.111:5702]
Dec 17, 2013 1:03:22 PM com.hazelcast.nio.SocketConnector
INFO: [10.69.108.60]:5701 [dev] Could not connect to: /170.194.100.111:5701. Reason: SocketException[Connection refused: connect to address /170.194.100.111:5701]
Dec 17, 2013 1:03:23 PM com.hazelcast.cluster.TcpIpJoiner
INFO: [10.69.108.60]:5701 [dev] 


Members [1] {
    Member [10.69.108.60]:5701 this
}

Dec 17, 2013 1:03:23 PM com.hazelcast.core.LifecycleService
INFO: [10.69.108.60]:5701 [dev] Address[10.69.108.60]:5701 is STARTED
HazelcastInstance{name='_hzInstance_1_dev', node=Address[10.69.108.60]:5701}Hey youuuu!

远程机器上的日志记录在这些行上。无法粘贴所有日志记录。管理以获取重要部分。

   INFO: [10.69.108.60]:5701 [dev] Connecting to possible member: Address[10.38.148.60]:5703
    Dec 17, 2013 1:03:21 PM com.hazelcast.cluster.TcpIpJoiner
    INFO: [10.69.108.60]:5701 [dev] Connecting to possible member: Address[10.38.148.60]:5702
    Dec 17, 2013 1:03:21 PM com.hazelcast.cluster.TcpIpJoiner
    INFO: [10.69.108.60]:5701 [dev] Connecting to possible member: Address[10.38.148.60]:5701
    Dec 17, 2013 1:03:21 PM com.hazelcast.cluster.TcpIpJoiner
INFO: [10.69.108.60]:5701 [dev] Connecting to possible member: Address[170.194.100.111]:5703
    Dec 17, 2013 1:03:21 PM com.hazelcast.cluster.TcpIpJoiner
    INFO: [10.69.108.60]:5701 [dev] Connecting to possible member: Address[170.194.100.111]:5702
    Dec 17, 2013 1:03:21 PM com.hazelcast.nio.SocketConnector

    Members [2] {
        Member [10.69.108.60]:5701 this
        Member [170.194.100.111]:5701
    }

【问题讨论】:

  • 看来你的集群正在形成。您是否在其他控制台中也看到了 Members[2] {....}?

标签: hazelcast


【解决方案1】:

您是否可以使用 hz.getCluster().getMembers() 方法获取成员实例并选择要发送到的成员实例,而不是直接创建成员实例?我想看看是不是你创建那个成员的方式造成的。

【讨论】:

  • hz.getCluster().getMembers() 只在返回的 Set 中提供我的本地机器。它没有远程机器。我想知道为什么他们甚至没有形成一个集群.这就是我继续自己创建 Member 对象的原因。
  • 这就是异常的原因:) 因为您无法向未连接的机器发送消息。然而,最大的问题是为什么您的集群没有形成。您可以在原始问题中发布您的配置+一些日志记录吗?
  • 在我原来的问题中发布了异常消息。我没有使用 xml 文件进行配置。我正在使用我在代码中配置的 TcpIpConfig。这还不足以形成集群吗?如果我错了,请纠正我。我尝试在 10.69.108.60:5702 上执行代码,正如我从日志中看到的集群中的另一个成员。它可以工作。但是我如何使远程机器成为我集群的一部分?
  • 我想我什至在我在远程机器上启动相同进程之前就期望远程机器成为集群的一部分..我这样做了 1) 在远程机器上启动分布式执行测试.. 2) 开始在本地机器上进行分布式执行测试.. 3)然后我看到远程机器加入了本地机器的集群,然后能够在 hz.getCluster().getMembers() 中找到它。你认为我配置成员的方式有什么问题吗?
  • 我不认为这是一个小故障。可能是您在远程计算机加入集群之前将消息发送到远程计算机吗?您能否尝试从 hazelcastInstance.getCluster().getMembers 方法中获取正确的成员?我不确定您是否可以像以前那样创建会员。
【解决方案2】:

我无法在 cmets 中格式化文本,所以我会提出另一个答案。

所以你遇到的问题是为什么你的成员没有形成一个集群。

您应该会看到如下日志记录:

Members [2] {
    Member [192.168.1.104]:5701 this
    Member [192.168.1.104]:5702
}

这就是为什么我需要更多的日志记录,而不仅仅是你的堆栈跟踪,但目前没有提供更多价值。我需要看看 Hazelcast 关于加入其他集群的说法。

我需要看到这样的东西:

Dec 17, 2013 7:24:13 PM com.hazelcast.config.XmlConfigBuilder
INFO: Looking for hazelcast.xml config file in classpath.
Dec 17, 2013 7:24:13 PM com.hazelcast.config.XmlConfigBuilder
WARNING: Could not find hazelcast.xml in classpath.
Hazelcast will use hazelcast-default.xml config file in jar.
Dec 17, 2013 7:24:13 PM com.hazelcast.config.XmlConfigBuilder
INFO: Using configuration file     /java/projects/Hazelcast/hazelcast/hazelcast/target/classes/hazelcast-default.xml in the classpath.
Dec 17, 2013 7:24:13 PM com.hazelcast.instance.DefaultAddressPicker
INFO: Prefer IPv4 stack is true.
Dec 17, 2013 7:24:13 PM com.hazelcast.instance.DefaultAddressPicker
INFO: Picked Address[192.168.1.102]:5701, using socket         ServerSocket[addr=/0:0:0:0:0:0:0:0,localport=5701], bind any local is true
Dec 17, 2013 7:24:13 PM com.hazelcast.system
INFO: [192.168.1.102]:5701 [dev] [3.2-SNAPSHOT] Hazelcast Community Edition 3.2-SNAPSHOT (20131217) starting at Address[192.168.1.102]:5701
Dec 17, 2013 7:24:13 PM com.hazelcast.system
INFO: [192.168.1.102]:5701 [dev] [3.2-SNAPSHOT] Copyright (C) 2008-2013 Hazelcast.com
Dec 17, 2013 7:24:13 PM com.hazelcast.instance.Node
INFO: [192.168.1.102]:5701 [dev] [3.2-SNAPSHOT] Creating MulticastJoiner
Dec 17, 2013 7:24:13 PM com.hazelcast.core.LifecycleService
INFO: [192.168.1.102]:5701 [dev] [3.2-SNAPSHOT] Address[192.168.1.102]:5701 is STARTING
Dec 17, 2013 7:24:15 PM com.hazelcast.cluster.MulticastJoiner
INFO: [192.168.1.102]:5701 [dev] [3.2-SNAPSHOT] 


Members [1] {
Member [192.168.1.102]:5701 this
}

Dec 17, 2013 7:24:16 PM com.hazelcast.core.LifecycleService
INFO: [192.168.1.102]:5701 [dev] [3.2-SNAPSHOT] Address[192.168.1.102]:5701 is STARTED
Dec 17, 2013 7:24:16 PM com.hazelcast.partition.PartitionService
INFO: [192.168.1.102]:5701 [dev] [3.2-SNAPSHOT] Initializing cluster partition table first arrangement...

【讨论】:

  • 谢谢。我从中得到了一些有用的信息。可以看到无法连接【连接被拒绝:连接地址/170.194.100.111:5703】。可能是您启动并运行了防火墙吗?能不能也贴一下另一台机器的日志?
  • 由于某些假设,我显然忽略了连接拒绝消息。当本地机器的jvm仍然启动时,你是否想要远程机器的日志记录(然后你可以看到本地机器与远程集群)..或者你想要只有远程机器jvm启动和本地机器jvm关闭的日志?设置防火墙的可能性相同,但我不确定如何确认。在这种情况下配置是否不同?
  • 在一台机器上调用'iperf -s -p 5701',在另一台机器上调用'iperf -c 1.2.3.4 -d -p 5701'设置正确的ip。在此之前杀死你 hazelcast 实例。这将测试是否可以进行通信。
  • 说找不到命令。忘了说我的本地机器是 windows,远程机器是 linux 机器(没有 root 权限)。我应该寻找替代品可能是
  • 我不知道另一个结合windows的命令;很多年没用过了。我的建议是查看您的 Windows 机器的防火墙设置(或在测试连接问题时禁用它),并与 Linux 机器的系统管理员联系以查看是否有任何被阻止的内容。无论如何,这是您需要解决的问题。
【解决方案3】:

我也遇到了同样的错误。 这是由于echoonthemember函数中的这一行

HazelcastInstance hz = Hazelcast.newHazelcastInstance(config);

它创建默认或 cfg 配置的新 hazelcast 实例。在 hazelcast 的这个实例中搜索该成员,该实例实际上并不存在于其中。因此错误消息显示为 TargetNotAMemberException.

要让它正常工作,只需在echoonthemember 函数中传递创建的实例。 例如,通过使其成为类 DistributedExecutor 中的成员变量并由构造函数设置它。 那么如果你的实际实例是'abcdef',那么 用作

IExecutorService executorService = abcdef.getExecutorService("default");

不要创建新的Hazelcast 实例。

【讨论】:

    猜你喜欢
    • 2013-11-09
    • 2020-10-22
    • 2017-01-12
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    相关资源
    最近更新 更多