Flume 不会将 Twitter 数据加载到 HDFS
Flume won't load Twitter data to HDFS
我正在尝试将 Twitter 数据加载到 Hadoop 中。它说它已经处理了将近 25000 个文件,但是当我检查 Hadoop 时,我总是发现该文件夹是空的。
这是我正在使用的命令
flume-ng agent -n TwitterAgent -f flume.conf
这是一个小标题
21/07/18 19:40:03 INFO twitter.TwitterSource: Processed 25,000 docs
21/07/18 19:40:03 INFO twitter.TwitterSource: Total docs indexed:
25,000, total skipped docs: 0 21/07/18 19:40:03 INFO
twitter.TwitterSource: 45 docs/second 21/07/18 19:40:03 INFO
twitter.TwitterSource: Run took 545 seconds and processed: 21/07/18
19:40:03 INFO twitter.TwitterSource: 0.012 MB/sec sent to index
21/07/18 19:40:03 INFO twitter.TwitterSource: 6.708 MB text sent
to index 21/07/18 19:40:03 INFO twitter.TwitterSource: There were 0
exceptions ignored: 21/07/18 19:40:05 INFO twitter.TwitterSource:
Processed 25,100 docs 21/07/18 19:40:06 INFO hdfs.BucketWriter:
Creating /home/hadoopusr/flumetweets/FlumeData.1626629459197.tmp
21/07/18 19:40:06 WARN hdfs.HDFSEventSink: HDFS IO error
org.apache.hadoop.fs.ParentNotDirectoryException: /home (is not a
directory) at
org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkIsDirectory(FSPermissionChecker.java:538)
at
org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:278)
at
org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:206)
at
org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:189)
at
org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:507)
at
org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkTraverse(FSDirectory.java:1612)
at
org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkTraverse(FSDirectory.java:1630)
at
org.apache.hadoop.hdfs.server.namenode.FSDirectory.resolvePath(FSDirectory.java:551)
at
org.apache.hadoop.hdfs.server.namenode.FSDirWriteFileOp.resolvePathForStartFile(FSDirWriteFileOp.java:291)
at
org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInt(FSNamesystem.java:2282)
at
org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:2225)
at
org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.create(NameNodeRpcServer.java:728)
这是我的Flume.config文件
#命名当前代理上的组件。
TwitterAgent.sources = 推特
TwitterAgent.channels = 内存通道
TwitterAgent.sinks = HDFS
#Describing/Configuring 来源
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,冠状病毒
#Describing/Configuring水槽
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
#Describing/Configuring频道
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 = 高清文件系统
我正在尝试将 Twitter 数据加载到 Hadoop 中。它说它已经处理了将近 25000 个文件,但是当我检查 Hadoop 时,我总是发现该文件夹是空的。 这是我正在使用的命令
flume-ng agent -n TwitterAgent -f flume.conf
这是一个小标题
21/07/18 19:40:03 INFO twitter.TwitterSource: Processed 25,000 docs 21/07/18 19:40:03 INFO twitter.TwitterSource: Total docs indexed: 25,000, total skipped docs: 0 21/07/18 19:40:03 INFO twitter.TwitterSource: 45 docs/second 21/07/18 19:40:03 INFO twitter.TwitterSource: Run took 545 seconds and processed: 21/07/18 19:40:03 INFO twitter.TwitterSource: 0.012 MB/sec sent to index 21/07/18 19:40:03 INFO twitter.TwitterSource: 6.708 MB text sent to index 21/07/18 19:40:03 INFO twitter.TwitterSource: There were 0 exceptions ignored: 21/07/18 19:40:05 INFO twitter.TwitterSource: Processed 25,100 docs 21/07/18 19:40:06 INFO hdfs.BucketWriter: Creating /home/hadoopusr/flumetweets/FlumeData.1626629459197.tmp 21/07/18 19:40:06 WARN hdfs.HDFSEventSink: HDFS IO error org.apache.hadoop.fs.ParentNotDirectoryException: /home (is not a directory) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkIsDirectory(FSPermissionChecker.java:538) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:278) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:206) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:189) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:507) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkTraverse(FSDirectory.java:1612) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkTraverse(FSDirectory.java:1630) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.resolvePath(FSDirectory.java:551) at org.apache.hadoop.hdfs.server.namenode.FSDirWriteFileOp.resolvePathForStartFile(FSDirWriteFileOp.java:291) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInt(FSNamesystem.java:2282) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:2225) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.create(NameNodeRpcServer.java:728)
这是我的Flume.config文件
#命名当前代理上的组件。
TwitterAgent.sources = 推特
TwitterAgent.channels = 内存通道
TwitterAgent.sinks = HDFS
#Describing/Configuring 来源
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,冠状病毒
#Describing/Configuring水槽 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
#Describing/Configuring频道
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 = 高清文件系统