docker - Docker中的Kafka连接和HDFS
问题描述
我在 docker-compose 中使用 kafka 连接 HDFS 接收器和 Hadoop(用于 HDFS)。
Hadoop(名称节点和数据节点)似乎工作正常。
但我对 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 添加了一个 env 变量以了解集群名称(env 变量: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.
编辑2:
该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
解决方案
最后就像@cricket_007 注意到的那样,我需要配置hadoop.conf.dir
.
该目录应包含hdfs-site.xml
.
当每个服务都被 dockerized 时,我需要创建一个命名卷以便在kafka-connect
服务和namenode
服务之间共享配置文件。
为此,我添加了我的docker-compose.yml
:
volumes:
hadoopconf:
然后对于namenode
服务,我添加:
volumes:
- hadoopconf:/etc/hadoop
对于 kafka 连接服务:
volumes:
- hadoopconf:/usr/local/hadoop-conf
最后,我hadoop.conf.dir
在我的 HDFS 接收器属性文件中设置为/usr/local/hadoop-conf
.
推荐阅读
- ios - 快速将数据上传到网站不起作用
- python - 将 3D 螺旋线投影到 XY 平面
- javascript - 使用 JavaScript 将函数组合成更“实用”
- jquery - Jquery 函数不能在新元素上运行
- c - 从字符串读取的 fopen、fread 的替代方案?
- java - 多线程应用程序,在 Java 中缺少对图像的操作
- c# - 在 Xamarin C# 中显示 Google Calendar API v3 事件 dateTime
- r - R:在用户库中强制安装包和依赖项
- qt - ffmpeg“动态”图像叠加
- javascript - 用于 reactjs 的 bundle.js 中未捕获的错误