文档章节

hdp-storm的kafka kerberos认证

 如风达
发布于 2017/09/05 17:10
字数 1024
阅读 74
收藏 0

1、使用Apache Storm-Kafka的插件包

一直使用apache storm-kafka的工具包去消费kafka,索性直接配置好对应的zookeeper集群的host、port,kafka集群的host、port。

直接放到HDP-storm的环境上提交。果然直接报错查看异常发现拿不到kafka leader所在机器host、port信息。查看apache storm-kafka源码发现它是从zk的/brokers/ids/0下获得的.

//自己维护和构建所有topic的partition对应的host与port信息,因kafka管理集群都是通过将topic、分区、副本信息写入zk
//中监听更新或删除的。所以在zk中可以读取到kafka所有的状态信息
public List<GlobalPartitionInformation> getBrokerInfo() throws SocketTimeoutException {
      List<String> topics =  getTopics();//获得所有的topic从zk的/brokers/topics下获得
      List<GlobalPartitionInformation> partitions =  new ArrayList<GlobalPartitionInformation>();

      for (String topic : topics) {
          GlobalPartitionInformation globalPartitionInformation = new GlobalPartitionInformation(topic, this._isWildcardTopic);
          try {
         //获得当前topic中有几个partition从zk的/brokers/topics/distributedTopic/partitions/下获得.
              int numPartitionsForTopic = getNumPartitions(topic);
              String brokerInfoPath = brokerPath();//一个broker路径默认是/brokers/ids
              //找到每个partition的leader对应的host和port为后面创建consumer做准备
              for (int partition = 0; partition < numPartitionsForTopic; partition++) {
                //获得partition的leader在zk中保存的路径,默认0、1、2....可在hdp中1001、1002、1003....
                  int leader = getLeaderFor(topic,partition);
                  String path = brokerInfoPath + "/" + leader;// /brokers/ids/1001
                  try {
                      //获得/brokers/ids/1001 znode的信息
                      byte[] brokerData = _curator.getData().forPath(path);
                      Broker hp = getBrokerHost(brokerData);//拿到host与port
                      //构建partition与broker对应关系简单说就是partition所在的host机器和port
                      globalPartitionInformation.addPartition(partition, hp);
                  } catch (org.apache.zookeeper.KeeperException.NoNodeException e) {
                      LOG.error("Node {} does not exist ", path);
                  }
              }
          } catch (SocketTimeoutException e) {
              throw e;
          } catch (Exception e) {
              throw new RuntimeException(e);
          }
          LOG.info("Read partition info from zookeeper: " + globalPartitionInformation);
          partitions.add(globalPartitionInformation);
      }
        return partitions;
    }
/**
     * [zk: localhost:2181(CONNECTED) 56] get /brokers/ids/0
     * { "host":"localhost", "jmx_port":9999, "port":9092, "version":1 }
     *
     * @param contents
     * @return
     */
    private Broker getBrokerHost(byte[] contents) {
        try {
            Map<Object, Object> value = (Map<Object, Object>) JSONValue.parseWithException(new String(contents, "UTF-8"));
            String host = (String) value.get("host");
            Integer port = ((Long) value.get("port")).intValue();
            return new Broker(host, port);
        } catch (RuntimeException e) {
            throw e;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

可是上HDP-zookeeper中查看发现/brokers/ids/1001下面的host:null、port:-1.

找到获取partition映射host与port,发现无非就是在对应zk的znode上获取到他的JSONValue值拿到host与port,虽然这个/brokers/ids/1001的znode下面host:null,port:-1.不知道出于什么原因HDP的kafka要将host与port变成null与-1,但是我发现这个endpoints中一样可以拿到很显然host : woker11-cs.zuhu2.com , port : 6667.

修改后使用maven打包.结果测试发现host与port确实拿到了,可是还是无法消费.

google发现apache storm-kafka安全认证的API,只有hdp二次开发storm-kafka才有

    public SimpleConsumer register(Broker host, String topic, int partition) {
        if (!this._connections.containsKey(host)) {
            this._connections.put(host, new DynamicPartitionConnections.ConnectionInfo(
new SimpleConsumer(host.host, host.port, this._config.socketTimeoutMs,
 this._config.bufferSizeBytes, this._config.clientId, this._config.securityProtocol)));
        }

        DynamicPartitionConnections.ConnectionInfo info = (DynamicPartitionConnections.ConnectionInfo)this._connections.get(host);
        info.partitions.add(this.getHashKey(topic, partition));
        return info.consumer;
    }

调用register获取SompleConsumer,hdp版本的比apache storm-kafka的多一个securityProtocol变量.这个值默认是"PLAINTEXT".

hdp的kafka_2.10中的SimpleConsumer默认它是开启认证的所以你在创建时只给host、port、soTimeout、bufferSize、clientId,一样会默认给securityProtocol赋值为“PLAINTEXT”

apache的kafka_2.10中的SimpleConsumer

最根本的还是storm创建new SimpleConsumer使用的kafka_2.10 API也二次开发了.它提供了安全认证的API.如下apache kafka_2.10没有提供认证API

最后发现自己修改apache storm-kafka是不行了.kafka_2.10和kafka-clients都是经过二次开发了的.

由于网络原因这些包都下载不了.我去

http://repo.hortonworks.com/content/repositories/releases/

官网去下载

并手动的install到本地maven库中.

mvn install:install-file -Dfile=F:\sougoDownload\storm-kafka-1.0.1.2.5.3.0-37.jar -DgroupId=org.apache.storm -DartifactId=storm-kafka -Dversion=1.0.1.2.5.3.0-37 -Dpackaging=jar

最后打包观察可以消费并发送数据到kafka.

注意下载的hdp版本的包必须和环境中的版本一直.hdp各个版本存在差异并不像java向后兼容.最开始我下的最新版本storm-kafka 1.1.0.3.0.1.3-1,KafkaBolt继承的BaseTickTupleAwareRichBolt但是环境的storm-core是1.0.1.2.5.3.0-37中根本没有BaseTickTupleAwareRichBolt这个类.

storm-kafka 1.0.1.2.5.3.0-37版本的KafkaBolt继承的是BaseRichBolt

© 著作权归作者所有

共有 人打赏支持
粉丝 7
博文 255
码字总数 22313
作品 0
深圳
storm集群 + kafka单机性能测试

storm与kafka单机功能整合很顺利,但是到了storm集群环境和数据处理性能时则出现了一些问题,现将测试过程和问题简单记录如下: 性能指标:每分钟处理至少100万的信息(csv格式,100bytes左右...

GoldenRoc
2014/09/26
0
2
Kafka实战-Storm Cluster

1.概述   在《Kafka实战-实时日志统计流程》一文中,谈到了Storm的相关问题,在完成实时日志统计时,我们需要用到Storm去消费Kafka Cluster中的数据,所以,这里我单独给大家分享一篇Sto...

smartloli
2015/06/18
0
0
storm kafka 编程指南

一、原理及关键步骤介绍 storm中的storm-kafka组件提供了storm与kafka交互的所需的所有功能,请参考其官方文档:https://github.com/apache/storm/tree/master/external/storm-kafka#broker...

大数据之路
2012/06/27
0
0
Flume+Kafka+Storm+Redis构建大数据实时处理系统

一、大数据处理的常用方法 之前在《采集→清洗→处理:基于MapReduce的离线数据分析》中已经有提及到,这里依然给出下面的图示: 前面给出的那篇文章是基于MapReduce的离线数据分析案例,其通...

技术小能手
07/09
0
0
业务系统-kafka-Storm【日志本地化】 - 1 将日志文件打印到local

阅读前提: 1 : 您可能需要对 logback 日志系统有所了解 2 :您可能需要对于 kafka 有初步的了解 3:请代码查看之前,请您仔细参考系统的业务图解 由于kafka本身自带了和『Hadoop』的接口,...

止静
2014/09/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

区块链教程以太坊源码分析core-state源码分析(一)

兄弟连区块链教程以太坊源码分析core-state源码分析,core/state 包主要为以太坊的state trie提供了一层缓存层(cache) database主要提供了trie树的抽象,提供trie树的缓存和合约代码长度的缓...

兄弟连区块链入门教程
16分钟前
0
0
使用putty上传文件

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: 使用putty上传文件 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::linux 用户名 set linux_us......

shzwork
17分钟前
1
0
摹客首家发布Adobe XD插件

10月19日,摹客iDoc发布了支持Adobe XD的插件,这是中国国内首款基于Adobe XD 正式API的插件。 设计师在Adobe XD 中安装并使用此插件,可以将设计稿上传到摹客iDoc,并使用iDoc的全部协作设计...

mo311
18分钟前
0
0
MetInfo最新网站漏洞如何修复以及网站安全防护

metinfo漏洞于2018年10月20号被爆出存在sql注入漏洞,可以直接拿到网站管理员的权限,网站漏洞影响范围较广,包括目前最新的metinfo版本都会受到该漏洞的攻击,该metinfo漏洞产生的主要原因是...

网站安全
18分钟前
0
0
git统计代码行数

$ npm install -g cloc$ cloc . 2193 text files. 1533 unique files. 760 files ignored.github.com/AlDanial/cloc v 1.78 ......

moon888
18分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部