【发布时间】:2019-03-06 10:55:46
【问题描述】:
我在 docker-compose 中使用 kafka 连接 HDFS 接收器和 Hadoop(用于 HDFS)。
Hadoop(namenode 和 datanode)似乎工作正常。
但我在使用 kafka 连接接收器时出错:
ERROR Recovery failed at state RECOVERY_PARTITION_PAUSED
(io.confluent.connect.hdfs.TopicPartitionWriter:277)
org.apache.kafka.connect.errors.DataException:
Error creating writer for log file hdfs://namenode:8020/logs/MyTopic/0/log
有关信息:
-
我的 docker-compose.yml 中的 Hadoop 服务:
namenode: image: uhopper/hadoop-namenode:2.8.1 hostname: namenode container_name: namenode ports: - "50070:50070" networks: default: fides-webapp: aliases: - "hadoop" volumes: - namenode:/hadoop/dfs/name env_file: - ./hadoop.env environment: - CLUSTER_NAME=hadoop-cluster datanode1: image: uhopper/hadoop-datanode:2.8.1 hostname: datanode1 container_name: datanode1 networks: default: fides-webapp: aliases: - "hadoop" volumes: - datanode1:/hadoop/dfs/data env_file: - ./hadoop.env
还有我的 kafka-connect 文件:
name=hdfs-sink
connector.class=io.confluent.connect.hdfs.HdfsSinkConnector
tasks.max=1
topics=MyTopic
hdfs.url=hdfs://namenode:8020
flush.size=3
编辑:
我为 kafka connect 添加了一个环境变量以了解集群名称(环境变量:CLUSTER_NAME 以在 docker compose 文件中添加 kafka 连接服务)。
报错不一样(而且好像解决了一个问题):
INFO Starting commit and rotation for topic partition scoring-topic-0 with start offsets {partition=0=0} and end offsets {partition=0=2}
(io.confluent.connect.hdfs.TopicPartitionWriter:368)
ERROR Exception on topic partition MyTopic-0: (io.confluent.connect.hdfs.TopicPartitionWriter:403)
org.apache.kafka.connect.errors.DataException: org.apache.hadoop.ipc.RemoteException(java.io.IOException):
File /topics/+tmp/MyTopic/partition=0/bc4cf075-ccfa-4338-9672-5462cc6c3404_tmp.avro
could only be replicated to 0 nodes instead of minReplication (=1).
There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
EDIT2:
hadoop.env 文件是:
CORE_CONF_fs_defaultFS=hdfs://namenode:8020
# Configure default BlockSize and Replication for local
# data. Keep it small for experimentation.
HDFS_CONF_dfs_blocksize=1m
YARN_CONF_yarn_log___aggregation___enable=true
YARN_CONF_yarn_resourcemanager_recovery_enabled=true
YARN_CONF_yarn_resourcemanager_store_class=org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore
YARN_CONF_yarn_resourcemanager_fs_state___store_uri=/rmstate
YARN_CONF_yarn_nodemanager_remote___app___log___dir=/app-logs
YARN_CONF_yarn_log_server_url=http://historyserver:8188/applicationhistory/logs/
YARN_CONF_yarn_timeline___service_enabled=true
YARN_CONF_yarn_timeline___service_generic___application___history_enabled=true
YARN_CONF_yarn_resourcemanager_system___metrics___publisher_enabled=true
YARN_CONF_yarn_resourcemanager_hostname=resourcemanager
YARN_CONF_yarn_timeline___service_hostname=historyserver
【问题讨论】:
-
您的 Kafka Connect 是否属于同一个 Docker Compose 文件?如果不是,这些服务是否在同一个 docker 网络上?
-
是的 kafka-connect 在同一个 docker compose 文件中。 Kafka connect 似乎在 HDFS 中创建了文件夹,但它没有写在里面。我更改了一个环境变量,但出现了一个新错误。我编辑帖子。
-
我确信 Hadoop 一切正常,但要让 Kafka Connect 连接到 Hadoop,它通常需要的不仅仅是名称节点连接,您可以通过从 Hadoop 服务器中获取 XML 文件来设置它,然后将它们复制到
hadoop.conf.dirKafka Connect 属性 -
非常感谢,当我将 hadoop conf 复制到包含 kafka 连接的 docker 映像时它可以工作。我很想找到一种方法来自动化它,但它现在是一种解决方法:)。我让你发布一个答案:)
-
我的解决方案是在 namenode 和 kafka connect 之间共享一个包含 conf 文件的命名卷
标签: docker hadoop apache-kafka hdfs apache-kafka-connect