问题描述
我正在尝试将 Twitter 数据加载到 Hadoop 中。它说它已经处理了近 25000 个文件,但是当我检查 Hadoop 时,我总是发现文件夹是空的。 这是我正在使用的命令
flume-ng agent -n Twitteragent -f flume.conf
21/07/18 19:40:03 INFO twitter.TwitterSource:已处理 25,000 个文档 21/07/18 19:40:03 信息 twitter.TwitterSource:索引的文档总数: 25,000,跳过的文档总数:0 21/07/18 19:40:03 INFO twitter.Twitter 来源:45 个文档/秒 21/07/18 19:40:03 信息 twitter.TwitterSource:运行耗时 545 秒,处理时间:21/07/18 19:40:03 INFO twitter.TwitterSource:0.012 MB/秒发送到索引 21/07/18 19:40:03 信息 twitter.TwitterSource:6.708 MB 文本发送 to index 21/07/18 19:40:03 INFO twitter.TwitterSource: 有 0 忽略的例外:21/07/18 19:40:05 INFO twitter.TwitterSource: 已处理 25,100 个文档 21/07/18 19:40:06 信息 hdfs.BucketWriter: 创建 /home/hadoopusr/flumetweets/FlumeData.1626629459197.tmp 21/07/18 19:40:06 警告 hdfs.HDFSEventSink:HDFS IO 错误 org.apache.hadoop.fs.ParentNotDirectoryException: /home (不是 目录)在 org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkIsDirectory(FSPermissionChecker.java:538) 在 org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:278) 在 org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:206) 在 org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:189) 在 org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:507) 在 org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkTraverse(FSDirectory.java:1612) 在 org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkTraverse(FSDirectory.java:1630) 在 org.apache.hadoop.hdfs.server.namenode.FSDirectory.resolvePath(FSDirectory.java:551) 在 org.apache.hadoop.hdfs.server.namenode.FSDirWriteFileOp.resolvePathForStartFile(FSDirWriteFileOp.java:291) 在 org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInt(FSNamesystem.java:2282) 在 org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:2225) 在 org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.create(NameNodeRpcServer.java:728)
#命名当前代理上的组件。
Twitteragent.sources = Twitter
Twitteragent.channels = MemChannel
Twitteragent.sinks = HDFS
#描述/配置源
Twitteragent.sources.Twitter.type = org.apache.flume.source.twitter.TwitterSource
Twitteragent.sources.Twitter.channels=MemChannel
Twitteragent.sources.Twitter.consumerKey = ************
Twitteragent.sources.Twitter.consumerSecret =************
Twitteragent.sources.Twitter.accesstoken = ************
Twitteragent.sources.Twitter.accesstokenSecret = ************
Twitteragent.sources.Twitter.keywords =covid,covid-19,coronavirus
#描述/配置接收器 Twitteragent.sinks.HDFS.type = hdfs
Twitteragent.sinks.HDFS.hdfs.path = /home/hadoopusr/flumetweets
Twitteragent.sinks.HDFS.hdfs.fileType = DataStream
Twitteragent.sinks.HDFS.hdfs.writeFormat = 文本
Twitteragent.sinks.HDFS.hdfs.batchSize = 10
Twitteragent.sinks.HDFS.hdfs.rollSize = 0
Twitteragent.sinks.HDFS.hdfs.rollInterval = 600
Twitteragent.sinks.HDFS.hdfs.rollCount = 100
#描述/配置通道
Twitteragent.channels.MemChannel.type = 内存
Twitteragent.channels.MemChannel.capacity = 1000
Twitteragent.channels.MemChannel.transactionCapacity = 1000
#将source和sink绑定到channel
Twitteragent.sources.Twitter.channels = MemChannel
Twitteragent.sinks.HDFS.channel = MemChannel
解决方法
正如所评论的,您修复了第一个错误,现在在写入 HDFS 根路径时出现权限错误 user=amel
在你的配置中有
TwitterAgent.sinks.HDFS.hdfs.path = /home/hadoopusr/flumetweets
但是,我猜测 /home
或 /home/hadoopusr
不存在,因此该目录正在尝试创建。
但是,您的用户不是 hadoopusr
(您的 HDFS 超级用户),因此没有权限这样做
因此您的选择是
- 以
flume-ng agent
(hadoopusr
) 的身份运行sudo su hadoopusr -c flume-ng agent ...
- 更改配置中的 HDFS 路径以使用
/home/amel
(在您创建该路径并为其授予权限之后)sudo su hadoopusr; hadoop fs -mkdir /home/amel; hadoop fs chown -R amel /home/amel; hadoop fs -chmod -R 760 /home/amel
尝试将其添加到您的 Flume.config 文件中: TwitterAgent.sinks.HDFS.type = hdfs