diff --git a/pom.xml b/pom.xml
index 3fbbcdfa..08d75d2e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -166,7 +166,7 @@
1.0.5
1.7.2
5.0.2
- 0.8.0
+ 0.10.2.0
3.4.5
4.11
3.2
@@ -812,7 +812,26 @@
org.apache.kafka
- kafka_2.10
+ kafka_2.11
+ ${kafka.version}
+
+
+ org.slf4j
+ slf4j-simple
+
+
+ com.sun.jdmk
+ jmxtools
+
+
+ com.sun.jmx
+ jmxri
+
+
+
+
+ org.apache.kafka
+ kafka-clients
${kafka.version}
@@ -1027,6 +1046,13 @@
${commons-compress.version}
test
+
+
+ org.slf4j
+ slf4j-log4j12
+ 1.7.25
+ test
+
diff --git a/twill-api/src/main/java/org/apache/twill/api/Configs.java b/twill-api/src/main/java/org/apache/twill/api/Configs.java
index 9a214892..909ac627 100644
--- a/twill-api/src/main/java/org/apache/twill/api/Configs.java
+++ b/twill-api/src/main/java/org/apache/twill/api/Configs.java
@@ -83,6 +83,11 @@ public static final class Keys {
*/
public static final String LOG_COLLECTION_ENABLED = "twill.log.collection.enabled";
+ /**
+ * Setting for kafka 'bootstrap.servers' for log collection
+ */
+ public static final String LOG_COLLECTION_KAFKA_BOOTSTRAP = "twill.log.collection.kafka.bootstrap";
+
/**
* The maximum number of FileContext object cached by the FileContextLocationFactory.
*/
@@ -132,6 +137,11 @@ public static final class Defaults {
*/
public static final boolean LOG_COLLECTION_ENABLED = true;
+ /**
+ * Default is empty
+ */
+ public static final String LOG_COLLECTION_KAFKA_BOOTSTRAP_EMPTY = "";
+
/**
* Default size of the file context cache.
*/
diff --git a/twill-api/src/main/java/org/apache/twill/api/TwillPreparer.java b/twill-api/src/main/java/org/apache/twill/api/TwillPreparer.java
index 1f509724..dad242c1 100644
--- a/twill-api/src/main/java/org/apache/twill/api/TwillPreparer.java
+++ b/twill-api/src/main/java/org/apache/twill/api/TwillPreparer.java
@@ -45,6 +45,13 @@ public interface TwillPreparer {
*/
TwillPreparer addLogHandler(LogHandler handler);
+ /**
+ * Configures bootstrap servers for kafka log aggregation client
+ * @param kafkaBootstrapServers kafka bootstrap.servers config for log aggregation client
+ * @return This {@link TwillPreparer}
+ */
+ TwillPreparer withKafkaBootstrapServers(String kafkaBootstrapServers);
+
/**
* Sets the user name that runs the application. Default value is get from {@code "user.name"} by calling
* {@link System#getProperty(String)}.
diff --git a/twill-core/pom.xml b/twill-core/pom.xml
index 7e24154f..b4d8dd20 100644
--- a/twill-core/pom.xml
+++ b/twill-core/pom.xml
@@ -79,7 +79,11 @@
org.apache.kafka
- kafka_2.10
+ kafka_2.11
+
+
+ org.apache.kafka
+ kafka-clients
@@ -98,5 +102,9 @@
org.apache.commons
commons-compress
+
+ org.slf4j
+ slf4j-log4j12
+
diff --git a/twill-core/src/main/java/org/apache/twill/internal/AbstractTwillController.java b/twill-core/src/main/java/org/apache/twill/internal/AbstractTwillController.java
index e49a2ad0..c0a2c70c 100644
--- a/twill-core/src/main/java/org/apache/twill/internal/AbstractTwillController.java
+++ b/twill-core/src/main/java/org/apache/twill/internal/AbstractTwillController.java
@@ -43,14 +43,13 @@
import org.apache.twill.internal.json.LogEntryDecoder;
import org.apache.twill.internal.json.LogThrowableCodec;
import org.apache.twill.internal.json.StackTraceElementCodec;
-import org.apache.twill.internal.kafka.client.ZKKafkaClientService;
+import org.apache.twill.internal.kafka.client.BootstrapedKafkaClientService;
import org.apache.twill.internal.state.Message;
import org.apache.twill.internal.state.SystemMessages;
import org.apache.twill.kafka.client.FetchedMessage;
import org.apache.twill.kafka.client.KafkaClientService;
import org.apache.twill.kafka.client.KafkaConsumer;
import org.apache.twill.zookeeper.ZKClient;
-import org.apache.twill.zookeeper.ZKClients;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -79,7 +78,7 @@ public abstract class AbstractTwillController extends AbstractZKServiceControlle
private Cancellable logCancellable;
public AbstractTwillController(String appName, RunId runId, ZKClient zkClient, boolean logCollectionEnabled,
- Iterable logHandlers) {
+ String kafkaBootstrap, Iterable logHandlers) {
super(runId, zkClient);
this.appName = appName;
this.runId = runId;
@@ -88,7 +87,7 @@ public AbstractTwillController(String appName, RunId runId, ZKClient zkClient, b
// When addressing TWILL-147, need to check if the given ZKClient is
// actually used by the Kafka used for log collection
if (logCollectionEnabled) {
- this.kafkaClient = new ZKKafkaClientService(ZKClients.namespace(zkClient, "/" + runId.getId() + "/kafka"));
+ this.kafkaClient = new BootstrapedKafkaClientService(kafkaBootstrap);
Iterables.addAll(this.logHandlers, logHandlers);
} else {
this.kafkaClient = null;
diff --git a/twill-core/src/main/java/org/apache/twill/internal/TwillRuntimeSpecification.java b/twill-core/src/main/java/org/apache/twill/internal/TwillRuntimeSpecification.java
index 831c8318..9e27c317 100644
--- a/twill-core/src/main/java/org/apache/twill/internal/TwillRuntimeSpecification.java
+++ b/twill-core/src/main/java/org/apache/twill/internal/TwillRuntimeSpecification.java
@@ -43,12 +43,15 @@ public class TwillRuntimeSpecification {
private final Map maxRetries;
private final double minHeapRatio;
private final boolean logCollectionEnabled;
+ private final boolean embeddedKafkaEnabled;
+ private String kafkaBootstrap;
public TwillRuntimeSpecification(TwillSpecification twillSpecification, String fsUser, URI twillAppDir,
String zkConnectStr, RunId twillRunId, String twillAppName,
int reservedMemory, @Nullable String rmSchedulerAddr,
Map> logLevels, Map maxRetries,
- double minHeapRatio, boolean logCollectionEnabled) {
+ double minHeapRatio, boolean logCollectionEnabled, String kafkaBootstrap,
+ boolean embeddedKafkaEnabled) {
this.twillSpecification = twillSpecification;
this.fsUser = fsUser;
this.twillAppDir = twillAppDir;
@@ -61,6 +64,8 @@ public TwillRuntimeSpecification(TwillSpecification twillSpecification, String f
this.maxRetries = maxRetries;
this.minHeapRatio = minHeapRatio;
this.logCollectionEnabled = logCollectionEnabled;
+ this.kafkaBootstrap = kafkaBootstrap;
+ this.embeddedKafkaEnabled = embeddedKafkaEnabled;
}
public TwillSpecification getTwillSpecification() {
@@ -116,15 +121,18 @@ public Map getMaxRetries() {
}
/**
- * Returns the ZK connection string for the Kafka used for log collections,
+ * Returns the bootstrap connection string for the Kafka used for log collections,
* or {@code null} if log collection is disabled.
*/
- @Nullable
- public String getKafkaZKConnect() {
- if (!isLogCollectionEnabled()) {
- return null;
- }
- // When addressing TWILL-147, a field can be introduced to carry this value.
- return String.format("%s/%s/%s/kafka", getZkConnectStr(), getTwillAppName(), getTwillAppRunId());
+ public String getKafkaBootstrap() {
+ return kafkaBootstrap;
+ }
+
+ public void setKafkaBootstrap(String kafkaBootstrap) {
+ this.kafkaBootstrap = kafkaBootstrap;
+ }
+
+ public boolean isEmbeddedKafkaEnabled() {
+ return embeddedKafkaEnabled;
}
}
diff --git a/twill-core/src/main/java/org/apache/twill/internal/json/TwillRuntimeSpecificationCodec.java b/twill-core/src/main/java/org/apache/twill/internal/json/TwillRuntimeSpecificationCodec.java
index 5ff05e8a..93866a2e 100644
--- a/twill-core/src/main/java/org/apache/twill/internal/json/TwillRuntimeSpecificationCodec.java
+++ b/twill-core/src/main/java/org/apache/twill/internal/json/TwillRuntimeSpecificationCodec.java
@@ -51,6 +51,8 @@ final class TwillRuntimeSpecificationCodec implements JsonSerializer() { }.getType());
Map> logLevels =
context.deserialize(jsonObj.get(LOG_LEVELS), new TypeToken