Hadoop 在ZooKeeper中使用协议Zab进行广播

Hadoop 在ZooKeeper中使用协议Zab进行广播,hadoop,mapreduce,apache-zookeeper,Hadoop,Mapreduce,Apache Zookeeper,早上好 我是ZooKeeper及其协议的新手,我对其广播协议Zab感兴趣 你能给我提供一个使用Zookeeper的Zab协议的简单java代码吗?我一直在搜索,但没有找到显示如何使用Zab的代码 事实上,我需要的很简单,我有一个MapReduce代码,我希望所有的映射程序在成功找到更好的X值(即更大的值)时更新一个变量(比如X)。在这种情况下,领导者必须比较旧值和新值,然后向所有映射者广播实际的最佳值。我如何用Java做这样的事情 提前感谢,, 关于您不需要使用Zab协议。相反,您可以按照以下步

早上好

我是ZooKeeper及其协议的新手,我对其广播协议Zab感兴趣

你能给我提供一个使用Zookeeper的Zab协议的简单java代码吗?我一直在搜索,但没有找到显示如何使用Zab的代码

事实上,我需要的很简单,我有一个MapReduce代码,我希望所有的映射程序在成功找到更好的X值(即更大的值)时更新一个变量(比如X)。在这种情况下,领导者必须比较旧值和新值,然后向所有映射者广播实际的最佳值。我如何用Java做这样的事情

提前感谢,,
关于

您不需要使用Zab协议。相反,您可以按照以下步骤操作:

你在Zookeeper上有一个Znode say/bigvalue。启动时,所有映射程序都会读取其中存储的值。他们还对Znode上的数据变化进行了监视。每当映射器获得更好的值时,它就会用更好的值更新Znode。所有映射者都将收到数据更改事件的通知,他们读取新的最佳值,并再次建立数据更改监视。这样,它们就与最新的最佳值同步,并且可以在有更好的值时更新最新的最佳值

实际上,zkclient是一个非常好的库,可以与Zookeeper一起使用,它隐藏了很多复杂性()。下面的示例演示了如何查看Znode“/bigvalue”中的任何数据更改

package geet.org;

import java.io.UnsupportedEncodingException;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.exception.ZkMarshallingError;
import org.I0Itec.zkclient.exception.ZkNodeExistsException;
import org.I0Itec.zkclient.serialize.ZkSerializer;
import org.apache.zookeeper.data.Stat;

public class ZkExample implements IZkDataListener, ZkSerializer {
    public static void main(String[] args) {
        String znode = "/bigvalue";
        ZkExample ins = new ZkExample();
        ZkClient cl = new ZkClient("127.0.0.1", 30000, 30000,
                ins);
        try {
            cl.createPersistent(znode);
        } catch (ZkNodeExistsException e) {
            System.out.println(e.getMessage());
        }
        // Change the data for fun
        Stat stat = new Stat();
        String data =  cl.readData(znode, stat);
        System.out.println("Current data " + data + "version = " + stat.getVersion());
        cl.writeData(znode, "My new data ", stat.getVersion());

        cl.subscribeDataChanges(znode, ins);
        try {
            Thread.sleep(36000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void handleDataChange(String dataPath, Object data) throws Exception {
        System.out.println("Detected data change");
        System.out.println("New data for " + dataPath + " " + (String)data);
    }

    @Override
    public void handleDataDeleted(String dataPath) throws Exception {
        System.out.println("Data deleted " + dataPath);
    }

    @Override
    public byte[] serialize(Object data) throws ZkMarshallingError {
        if (data instanceof String){
            try {
                return ((String) data).getBytes("UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    public Object deserialize(byte[] bytes) throws ZkMarshallingError {
        try {
            return new String(bytes, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

感谢您的快速回答,这是否意味着映射程序将自动获得数据更改事件的通知?我所要做的就是读取值并在Znode上监视数据的变化?另一个问题:由于我是ZooKeeper的初学者,在创建Znode/bigvalue时,它将保存在哪里?所有地图绘制者如何访问它?它像HDFS吗?很抱歉问了这么多问题。他们会自动收到通知。好的,谢谢。对于ZooKeeper的安装,我需要在所有Hadoop集群的机器上安装它吗?在你的建议中,我需要的只是一个Znode!!动物园管理员在哪里保存这些动物?我仍然很难理解这一点!Znode是指Zookeeper数据树中的节点,而不是机器。如果高可用性很重要,您可能希望拥有Zookeeper节点的集合。确定。因此Znode=数据树中的一个节点,ZooKeeper节点=机器。非常感谢你的回答。