web-dev-qa-db-ja.com

Kafkaクイックスタート:どのような依存関係が必要ですか?

私はkafkaクイックスタート:

http://kafka.Apache.org/07/quickstart.html

および基本的な消費者グループの例:

https://cwiki.Apache.org/confluence/display/KAFKA/Consumer+Group+Example

上記のようにConsumerとConsumerThreadPoolをコーディングしました。

import kafka.consumer.KafkaStream;
import kafka.consumer.ConsumerIterator;

public class Consumer implements Runnable {

    private KafkaStream m_stream;
    private Integer m_threadNumber;

    public Consumer(KafkaStream a_stream, Integer a_threadNumber) {
        m_threadNumber = a_threadNumber;
        m_stream = a_stream;
    }

    public void run() {
        ConsumerIterator<byte[], byte[]> it = m_stream.iterator();
        while (it.hasNext()) {
            System.out.println("Thread " + m_threadNumber + ": " + new String(it.next().message()));

        }
        System.out.println("Shutting down Thread: " + m_threadNumber);
    }
}

他のいくつかの側面:私は飼育係を管理するために春を使用しています:

import javax.inject.Named;
import Java.util.Properties;
import kafka.consumer.ConsumerConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.truecar.inventory.worker.core")
public class AppConfig {

    @Bean
    @Named("consumerConfig")
    private static ConsumerConfig createConsumerConfig() {
        String zookeeperAddress = "127.0.0.1:2181";
        String groupId = "inventory";
        Properties props = new Properties();
        props.put("zookeeper.connect", zookeeperAddress);
        props.put("group.id", groupId);
        props.put("zookeeper.session.timeout.ms", "400");
        props.put("zookeeper.sync.time.ms", "200");
        props.put("auto.commit.interval.ms", "1000");
        return new ConsumerConfig(props);
    }
}

そして、私はMavenとOneJarMavenプラグインを使用してコンパイルしています。ただし、コンパイルしてから結果の1つのjarを実行すると、次のエラーが発生します。

Aug 26, 2013 6:15:41 PM org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider registerDefaultFilters
INFO: JSR-330 'javax.inject.Named' annotation found and supported for component scanning
Exception in thread "main" Java.lang.reflect.InvocationTargetException
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:606)
at com.simontuffs.onejar.Boot.run(Boot.Java:340)
at com.simontuffs.onejar.Boot.main(Boot.Java:166)
Caused by: Java.lang.NoClassDefFoundError: scala/ScalaObject
at Java.lang.ClassLoader.defineClass1(Native Method)
at Java.lang.ClassLoader.defineClass(ClassLoader.Java:792)
at com.simontuffs.onejar.JarClassLoader.defineClass(JarClassLoader.Java:803)
at com.simontuffs.onejar.JarClassLoader.findClass(JarClassLoader.Java:710)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:424)
at com.simontuffs.onejar.JarClassLoader.loadClass(JarClassLoader.Java:630)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:357)
at Java.lang.Class.getDeclaredMethods0(Native Method)
at Java.lang.Class.privateGetDeclaredMethods(Class.Java:2521)
at Java.lang.Class.getDeclaredMethods(Class.Java:1845)
at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.Java:180)
at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.Java:222)
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.Java:165)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.Java:140)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.Java:282)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.Java:223)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.Java:630)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:461)
at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.Java:73)
at com.truecar.inventory.worker.core.consumer.ConsumerThreadPool.<clinit>(ConsumerThreadPool.Java:31)
at com.truecar.inventory.worker.core.application.Starter.main(Starter.Java:20)
... 6 more
Caused by: Java.lang.ClassNotFoundException: scala.ScalaObject
at com.simontuffs.onejar.JarClassLoader.findClass(JarClassLoader.Java:713)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:424)
at com.simontuffs.onejar.JarClassLoader.loadClass(JarClassLoader.Java:630)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:357)
... 27 more

今、私はKafkaについてほとんど知らず、Scalaについても何も知りません。これを修正するにはどうすればよいですか?次に何を試すべきですか?これは既知の問題ですか?他の依存関係が必要ですか?これが私のpom.xmlのkafkaバージョンです:

<dependency>
    <groupId>org.Apache.kafka</groupId>
    <artifactId>kafka_2.9.2</artifactId>
    <version>0.8.0-beta1</version>
</dependency> 

更新:Kafka devメーリングリストに連絡したところ、scala依存関係の特定のバージョン要件がわかりました。ただし、文書化されていないlog4jもあります。依存関係。これにより、コンパイル時ではなく、別のランタイム例外が発生します。

Exception in thread "main" Java.lang.reflect.InvocationTargetException
Caused by: Java.lang.NoSuchMethodError: ch.qos.logback.classic.Logger.filterAndLog(Ljava/lang/String;Lorg/slf4j/Marker;Lch/qos/logback/classic/Level;Ljava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V
at org.Apache.log4j.Category.log(Category.Java:333)
at org.Apache.commons.logging.impl.Log4JLogger.debug(Log4JLogger.Java:177)

別の更新:

正しいlog4j依存関係が見つかりました:

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

しかし今、私はさらに不可解なランタイム例外に遭遇しました:

Exception in thread "main" Java.lang.reflect.InvocationTargetException
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:606)
at com.simontuffs.onejar.Boot.run(Boot.Java:340)
at com.simontuffs.onejar.Boot.main(Boot.Java:166)
Caused by: Java.lang.NoClassDefFoundError: org/I0Itec/zkclient/IZkStateListener
at kafka.javaapi.consumer.ZookeeperConsumerConnector.<init>(ZookeeperConsumerConnector.scala:64)
at kafka.javaapi.consumer.ZookeeperConsumerConnector.<init>(ZookeeperConsumerConnector.scala:66)
at kafka.consumer.Consumer$.createJavaConsumerConnector(ConsumerConnector.scala:100)
at kafka.consumer.Consumer.createJavaConsumerConnector(ConsumerConnector.scala)

この時点で、私はWTFのような感覚を得ました。そこで、別の依存関係を追加しました。

    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.3</version>
    </dependency>

しかし、これにより、さらに別のランタイム例外が発生しました。

Exception in thread "main" Java.lang.reflect.InvocationTargetException
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:606)
at com.simontuffs.onejar.Boot.run(Boot.Java:340)
at com.simontuffs.onejar.Boot.main(Boot.Java:166)
Caused by: Java.lang.NoClassDefFoundError: com/yammer/metrics/core/Gauge
at kafka.consumer.ZookeeperConsumerConnector.createFetcher(ZookeeperConsumerConnector.scala:146)
at kafka.consumer.ZookeeperConsumerConnector.<init>(ZookeeperConsumerConnector.scala:113)
at kafka.javaapi.consumer.ZookeeperConsumerConnector.<init>(ZookeeperConsumerConnector.scala:64)
at kafka.javaapi.consumer.ZookeeperConsumerConnector.<init>(ZookeeperConsumerConnector.scala:66)
at kafka.consumer.Consumer$.createJavaConsumerConnector(ConsumerConnector.scala:100)
at kafka.consumer.Consumer.createJavaConsumerConnector(ConsumerConnector.scala)

この赤ちゃんの例を稼働させることができることを望んでいますが、おそらくこれはベータ製品を使用するために支払う代償ですか?たぶん、Apache ActiveMQに切り替える必要があります。しかし、それはあまり面白くありません。私は何かが足りないのですか?

8
David Williams

問題は kafkaベータはjarで生成されたpomが無効であり、mavenがそれを認識して正しく解析できない方法で構築された 、したがって推移的な依存関係をフェッチすることです。そのpom(scala、zkなど)からのすべての依存関係をpom定義に含めることで、この問題を軽減することができました。問題が修正されるkafkaの次のベータビルドを待っています。

完全な依存関係のリストは以下のとおりです。 scalaアーティファクトの接尾辞に応じて、kafkaバージョンの依存関係を変更する必要があることに注意してください。

<dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.15</version>
            <exclusions>
                <exclusion>
                    <groupId>com.Sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.Sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.jms</groupId>
                    <artifactId>jms</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>net.sf.jopt-simple</groupId>
            <artifactId>jopt-simple</artifactId>
            <version>3.2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.6.4</version>
        </dependency>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-compiler</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.3</version>
        </dependency>
        <dependency>
            <groupId>com.yammer.metrics</groupId>
            <artifactId>metrics-core</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.yammer.metrics</groupId>
            <artifactId>metrics-annotation</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
            <version>3.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.scalatest</groupId>
            <artifactId>scalatest</artifactId>
            <version>1.2</version>
            <scope>test</scope>
        </dependency>

たぶん、Apache ActiveMQに切り替える必要があります。しかし、それはあまり面白くありません。私は何かが足りないのですか?

さて、これがbetaリリースであることを忘れないでください。確かに、いくつかの悪いことが起こっていますが、現在、kafka 0.7何の努力もせずに実行しています。

9
om-nom-nom

この依存関係の構成が機能していることがわかりました。

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>3.2.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>3.2.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.Apache.kafka</groupId>
        <artifactId>kafka_2.9.2</artifactId>
        <version>0.8.0-beta1</version>
    </dependency>
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>2.9.2</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.3</version>
    </dependency>
    <dependency>
        <groupId>com.yammer.metrics</groupId>
        <artifactId>metrics-core</artifactId>
        <version>2.2.0</version>
    </dependency>
</dependencies>
3
David Williams

これはうまくいくようです:

$ git clone https://github.com/buildlackey/cep
$ cd cep/kafka-0.8.x
$ mvn package
$ mvn exec:Java -Dexec.mainClass=TestKafkaProducer

(経由 kafkaのMavenリポジトリはどこにありますか?

0
alex