私たちは、カフカの定義のために、過去に配信されていることを知って、サービスによって提出されたバックアップ機構付ログのパーティション。それは、これが彼の最も一般的な用法である、分散型のメッセージ・キューです。しかし、カフカは、そこに停止し、最新の公式サイトを開きません。
私たちは、カフカの最新の定義は以下を参照してくださいApacheのKafka®はIS 分散ストリーミングプラットフォーム
分散ストリーム処理プラットフォーム。
カフカとのパイプリアルタイムデータストリーミングアプリケーションを構築するために使用される:カフカの特性の明確な説明もあります。それは、スケーラビリティ、フォールトトレランス、速いのレベルを持っており、数千の企業に生産に入ります。
だから今カフカは、分散メッセージキューを持っているだけでなく、それはストリーム処理プラットフォームです。これは、0.9.0.0及び0.10.0.0で導入されたカフカストリーミングを持つ2つの新しいコンポーネントカフカ接続に由来します。
カフカ接続プロファイル
私たちは、メッセージキューが下流のシステム、メッセージ搬出上に存在しなければならないことを知っています。そのようなログ書き込みカフカ水路、嵐によってリアルタイムでダウンストリームデータ処理を読み取ることによって、古典的なログ分析システムとして。
カフカの接続の役割は、データ転送が仕事のこの部分は、カフカの接続によって行うことができる可能、代替水路です。カフカ接続は、Apacheカフカのための他のシステムとの間でデータの確実かつ信頼性の高い伝送のためのツールです。それはすぐにとカフカの外に大量のデータを設定することができます。
カフカ接続入ってくる仕事はカフカに、アプリケーションサーバからのデータのデータベースまたはコレクションをインポートすることができ、エクスポートジョブデータは、カフカシステムにクエリに渡すことができ、それは、オフライン分析のためのバッチシステムに転送することができます。
カフカConnect機能は次のとおりです。
- カフカに接続された共通フレーム -カフカConnectは、開発、展開、および管理する他のデータシステムカフカ簡略コネクタと一体化正規化
- 分散型およびスタンドアロンモード -大規模な分散管理サービスのサポート、また小規模生産環境の展開をサポート
- RESTインターフェース -カフカの接続REST APIの利用と管理を通じて提出
- 自動管理をオフセット -開発者は、コネクタコネクタの開発を心配する必要はありませんので、ちょうど、カフカの接続が自動的にオフセット提出プロセスを管理することができ、コネクタからいくつかの情報を取得するのこの部分を開発提出オフセット
- デフォルトでは、配布され、スケーラブル -カフカの接続は、既存のグループ管理プロトコルに基づいています。あなたは、拡張クラスタを追加することができます
- ストリーミング/バッチの統合 -既存のカフカ、カフカConnectはストリーミングデータとバッチシステムソリューションの上に架設されています
ファイル名を指定して実行カフカ接続
独立したクラスター:カフカの接続は、現在、2つの動作モードをサポートしています。
スタンドアローンモード
スタンドアロンモードでは、唯一のプロセス、セットアップと使用が容易です。しかし、ノーフォールトトレランス。
起動します。
> bin/connect-standalone.sh config/connect-standalone.properties connector1.properties [connector2.properties ...]
独立モードの設定
最初のパラメータの設定は、/いくつかの基本的な設定をconnect-standalone.properties:
これらは、スタンドアロンおよびクラスタモードに設定する必要があります。
#bootstrap.servers kafka集群列表
bootstrap.servers=localhost:9092
#key.converter key的序列化转换器 比如json的 key.converter=org.apache.kafka.connect.json.JsonConverter
#value.converter value的序列化转换器
value.converter=org.apache.kafka.connect.json.JsonConverter
#独立模式特有的配置:
#offset.storage.file.filename 用于存储偏移量的文件
offset.storage.file.filename =/home/kafka/connect.offsets
独立モードの接続設定(プロファイル)
パラメータ後ろConnector1.properties [connector2.properties ...]複数のコンテンツコネクタ構成であってもよいです
ここでは、コンフィギュレーション・ファイルからのデータと保存されたカフカの設定をお読みください。
connect-file-sink.properties
name
- コネクタの一意の名前。再度、同じ名前の登録が失敗します使用してみてください。connector.class
- 完全な名前またはエイリアスクラスのJavaクラスこのコネクタコネクタ。ここでは、FileStreamSinkを選択しますtasks.max
- タスクの最大数は、このコネクタのために作成する必要があります。コネクタは、並列処理のこのレベルを達成できない場合、それは少数のタスクを作成することがあります。key.converter
- (オプション)デフォルト設定のキーコンバータの労働者を優先します。value.converter
- (オプション)コンバータワーカーのデフォルト設定を上書きします。次の2つを設定する必要があります。
topics
- トピックのカンマ区切りのリストで、このコネクタは、入力として使用されますtopics.regex
- Javaの正規表現のこのコネクタ入力のためのテーマとして使用
name=local-file-sink
connector.class=FileStreamSink
tasks.max=1
file=test.sink.txt
topics=connect-test
あなたは、コネクタ変換装置内に配置することができます
あなたは、パラメータを指定する必要があります。
transforms
- エイリアス変換のリストには、変換されたアプリケーションでの順序を指定します。transforms.$alias.type
- 完全修飾クラス名の変換。transforms.$alias.$transformationSpecificConfig
構成プロパティの変換
たとえば、私たちは、フィールドのコンテンツファイルコンバータを追加します
まず、セットconnect-standalone.properties
key.converter.schemas.enable = false
value.converter.schemas.enable = false
connect-file-source.propertiesを設定します。
name=local-file-source
connector.class=FileStreamSource
tasks.max=1
file=test.txt
topic=connect-test
transforms=MakeMap, InsertSource
transforms.MakeMap.type=org.apache.kafka.connect.transforms.HoistField$Value
transforms.MakeMap.field=line
transforms.InsertSource.type=org.apache.kafka.connect.transforms.InsertField$Value
transforms.InsertSource.static.field=data_source
transforms.InsertSource.static.value=test-file-source
変換前の結果はありません。
"foo"
"bar"
"hello world"
変換後:
{"line":"foo","data_source":"test-file-source"}
{"line":"bar","data_source":"test-file-source"}
{"line":"hello world","data_source":"test-file-source"}
変換の一般的なタイプ:
- InsertField - 静的なデータやメタデータレコードのフィールドの使用を追加します
- ReplaceField - 濾過または名前を変更するフィールド
- MaskField - 有効ヌル型のフィールド(0、空の文字列など)を交換してください
- ValueToKey値は、キーを変換しました
- HoistField - 単一のフィールド内のパッケージまたはマップ構造体のような全イベント
- ExtractField - 構造体の特定のフィールドや地図から抽出し、その結果にのみフィールドが含まれています
- SetSchemaMetadata - スキーマ名やバージョンを変更します。
- TimestampRouter - 元のテーマとテーマのタイムスタンプに基づいてレコードを変更
- RegexRouter - エントリの件名を変更するために元のテーマ、置換文字列と正規表現に基づいて
クラスタモード
クラスタモードでは、フォールトトレランスを拡張することができます。
起動します。
> bin/connect-distributed.sh config/connect-distributed.properties
クラスタモードでは、カフカカフカ接続は、トピック、タスクの設定およびステータスに記憶されたオフセット。
クラスタモードの設定
connect-distributed.properties
#也需要基本的配置
bootstrap.servers=localhost:9092
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
#还有一些配置要注意
#group.id(默认connect-cluster) - Connect的组id 请注意,这不得与使用者的组id 冲突
group.id=connect-cluster
#用于存储偏移的主题; 此主题应具有许多分区
offset.storage.topic=connect-offsets
offset.storage.replication.factor=1
#用于存储连接器和任务配置的主题 只能一个分区
config.storage.topic=connect-configs
config.storage.replication.factor=1
#用于存储状态的主题; 此主题可以有多个分区
status.storage.topic=connect-status
status.storage.replication.factor=1
クラスタモードでは、コンフィギュレーションは、コマンドラインに渡しますが、作成、変更およびコネクタを破壊するためにREST APIを必要としません。
クラスタコネクタの設定モード(REST API)
REST APIサーバーは、HTTPとHTTPSの両方をサポートするように設定することができます
listeners=http://localhost:8080,https://localhost:8443
いない場合、デフォルトでは、listeners
指定された、サーバーはポート8083で実行されているREST HTTPプロトコルを使用しています。
以下は、現在サポートされているRESTのAPIです:
GET /connectors
- アクティブな接続のリストを返します。POST /connectors
-新しいコネクタを作成します。リクエストは、文字列のボディ含まれている必要がありますname
含むJSONオブジェクトフィールドconfig
オブジェクトフィールドコネクタの設定パラメータをGET /connectors/{name}
- 特定のコネクタについての情報を取得します。GET /connectors/{name}/config
- 特定のコネクタの設定パラメータを取得します。PUT /connectors/{name}/config
- 特定のコネクタ構成パラメーターを更新GET /connectors/{name}/status
- (それが失敗した場合)のスタッフ、エラーメッセージに割り当てられているなど、一時停止、失敗し、それが実行されているかどうかを含め、コネクタの現在の状態を取得し、すべてのタスクのステータスGET /connectors/{name}/tasks
- 現在のコネクタの実行中のタスクのリストを取得します。GET /connectors/{name}/tasks/{taskid}/status
- スタッフに割り当てられているなど、一時停止、失敗し、それが実行されているかどうかを含め、タスクの現在の状態を取得し、エラーメッセージが失敗しましたPUT /connectors/{name}/pause
- 接続が復元されるまで一時停止コネクタとその使命は、それがメッセージの処理を停止しますPUT /connectors/{name}/resume
- (コネクタが中断されていない場合は何もしない、)履歴書には、コネクタを一時停止しましたPOST /connectors/{name}/restart
- (それが失敗した通常ので)コネクタを再起動しますPOST /connectors/{name}/tasks/{taskId}/restart
- (故障などの理由で、通常は)個々のタスクを再起動しますDELETE /connectors/{name}
- コネクタを削除し、そのすべての構成タスクの停止を削除
コネクター開発ガイド
kakfaは、開発者が独自の一方のコネクタを開発することができます。
コアの概念
カフカと他のシステム間でデータをコピーするには、ユーザーがコネクタを作成する必要があります
コネクタは、2つの形式があります。
SourceConnectors
別のシステムからデータをインポートし、例えば、JDBCSourceConnector
カフカにリレーショナルデータベース
SinkConnectors
エクスポートデータは、例えば、HDFSSinkConnector
カフカのテーマの内容は、HDFSファイルにエクスポート
そして、対応するタスク:
SourceTask
とSinkTask
タスクは、オフセットの問題点に留意すべき開発タスクを入力し、出力ストリームを形成します。
各フローは、キー一連のレコードでなければなりません。定期的なデータのオフセットを提出することが義務付けられている障害が発生した場合には、プロセスがコミット最後のオフセットから回収することができるように、処理されました。コネクタはまた、任意の変更がある場合は、外部システムを監視するためにも、ダイナミック、実装が原因であることが必要です。
シンプルなコネクタを開発
開発コネクタは、すなわち、2つのインターフェイスのみを実装する必要がConnector
あり、Task
。
ここでは、簡単なFileStreamConnectorを開発します。
このコネクタは、スタンドアロンモードで使用され、SourceConnector /
SourceTask 读取文件的每一行,
SinkConnector /
SinkTaskは、各レコードのファイルに書き込ま。
コネクタの例:
継承SourceConnector、フィールドの追加(名前を、あなたが対象に読み込まれるファイルデータを送信したいです)
public class FileStreamSourceConnector extends SourceConnector {
private String filename;
private String topic;
実際の読み出しデータクラスを定義
@Override
public Class<? extends Task> taskClass() {
return FileStreamSourceTask.class;
}
ではFileStreamSourceTask
、クラスの次の定義。次に、我々は、いくつかの標準的なライフサイクル・アプローチを追加start()
し、stop()
@Override
public void start(Map<String, String> props) {
// The complete version includes error handling as well.
filename = props.get(FILE_CONFIG);
topic = props.get(TOPIC_CONFIG);
}
@Override
public void stop() {
// Nothing to do since no background monitoring is required.
}
最後に、コアの実装は本当ですtaskConfigs()
@Override
public List<Map<String, String>> taskConfigs(int maxTasks) {
ArrayList<Map<String, String>> configs = new ArrayList<>();
// Only one input stream makes sense.
Map<String, String> config = new HashMap<>();
if (filename != null)
config.put(FILE_CONFIG, filename);
config.put(TOPIC_CONFIG, topic);
configs.add(config);
return configs;
}
例:
ソース・タスク
実現SourceTask
FileStreamSourceTaskの継承を作成SourceTask
public class FileStreamSourceTask extends SourceTask {
String filename;
InputStream stream;
String topic;
@Override
public void start(Map<String, String> props) {
filename = props.get(FileStreamSourceConnector.FILE_CONFIG);
stream = openOrThrowError(filename);
topic = props.get(FileStreamSourceConnector.TOPIC_CONFIG);
}
@Override
public synchronized void stop() {
stream.close();
}
次に、私たちの使命の主な機能は、すなわち、達成するためにpoll()
システムからの入力イベントを取得すると、次のメソッドを返しますList
:
@Override
public List<SourceRecord> poll() throws InterruptedException {
try {
ArrayList<SourceRecord> records = new ArrayList<>();
while (streamValid(stream) && records.isEmpty()) {
LineAndOffset line = readToNextLine(stream);
if (line != null) {
Map<String, Object> sourcePartition = Collections.singletonMap("filename", filename);
Map<String, Object> sourceOffset = Collections.singletonMap("position", streamOffset);
records.add(new SourceRecord(sourcePartition, sourceOffset, topic, Schema.STRING_SCHEMA, line));
} else {
Thread.sleep(1);
}
}
return records;
} catch (IOException e) {
// Underlying stream was killed, probably as a result of calling stop. Allow to return
// null, and driving thread will handle any shutdown if necessary.
}
return null;
}
仕事を受けます
異なりSourceConnector
そしてSinkConnector
、SourceTask
そしてSinkTask
ように、非常に異なるインターフェースを有するSourceTask
インターフェースで使用されるが引っ張られるとSinkTask
インタフェースをプッシュするために使用されます。一般的なライフサイクル・アプローチを共有するが、どちらもSinkTask
完全に異なります。
public abstract class SinkTask implements Task {
public void initialize(SinkTaskContext context) {
this.context = context;
}
public abstract void put(Collection<SinkRecord> records);
public void flush(Map<TopicPartition, OffsetAndMetadata> currentOffsets) {
}
各行の文字列だけ-これは、単純なデータ構造を有し、簡単な例です。ほとんどすべての実用的なモードコネクタは、より複雑なデータ形式を持っている必要があります。より複雑なデータを作成するには、接続カフカが住んで使用する必要がある data
APIを。
Schema schema = SchemaBuilder.struct().name(NAME)
.field("name", Schema.STRING_SCHEMA)
.field("age", Schema.INT_SCHEMA)
.field("admin", new SchemaBuilder.boolean().defaultValue(false).build())
.build();
Struct struct = new Struct(schema)
.put("name", "Barbara Liskov")
.put("age", 75);
もっとカフカ技術記事を関連:
カフカは何ですか?
カフカの監視ツールの概要
カフカクイックスタート
カフカのコア消費者
カフカのコアプロデューサー
よりリアルタイム計算、FLINK、カフカやその他の関連技術ボーエン、リアルタイムのストリーミングを計算するために歓迎の注意