- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在安装简单的 Hadoop 时遇到了一些麻烦。我已经下载了 hadoop 2.4.0 并安装在单个 CentOS Linux 节点(虚拟机)上。我已经按照 apache 站点 (http://hadoop.apache.org/docs/r2.4.0/hadoop-project-dist/hadoop-common/SingleCluster.html) 中的描述为具有伪分布的单个节点配置了 hadoop。开始时日志中没有任何问题,我可以使用命令行中的“hadoop fs”命令读取和写入文件。
我正在尝试使用 Java API 从远程计算机上的 HDFS 读取文件。机器可以连接并列出目录内容。它还可以确定文件是否存在代码:
Path p=new Path("hdfs://test.server:9000/usr/test/test_file.txt");
FileSystem fs = FileSystem.get(new Configuration());
System.out.println(p.getName() + " exists: " + fs.exists(p));
系统打印“true”表明它存在。但是,当我尝试读取文件时:
BufferedReader br = null;
try {
Path p=new Path("hdfs://test.server:9000/usr/test/test_file.txt");
FileSystem fs = FileSystem.get(CONFIG);
System.out.println(p.getName() + " exists: " + fs.exists(p));
br=new BufferedReader(new InputStreamReader(fs.open(p)));
String line = br.readLine();
while (line != null) {
System.out.println(line);
line=br.readLine();
}
}
finally {
if(br != null) br.close();
}
这段代码抛出异常:
线程“main”中的异常 org.apache.hadoop.hdfs.BlockMissingException:无法获取 block :BP-13917963-127.0.0.1-1398476189167:blk_1073741831_1007 file=/usr/test/test_file。 txt
谷歌搜索给出了一些可能的提示,但都被检查过了。数据节点已连接,处于 Activity 状态,并且有足够的空间。来自 hdfs dfsadmin –report 的管理报告显示:
Configured Capacity: 52844687360 (49.22 GB)
Present Capacity: 48507940864 (45.18 GB)
DFS Remaining: 48507887616 (45.18 GB)
DFS Used: 53248 (52 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Datanodes available: 1 (1 total, 0 dead)
Live datanodes:
Name: 127.0.0.1:50010 (test.server)
Hostname: test.server
Decommission Status : Normal
Configured Capacity: 52844687360 (49.22 GB)
DFS Used: 53248 (52 KB)
Non DFS Used: 4336746496 (4.04 GB)
DFS Remaining: 48507887616 (45.18 GB)
DFS Used%: 0.00%
DFS Remaining%: 91.79%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Last contact: Fri Apr 25 22:16:56 PDT 2014
客户端 jar 是直接从 hadoop 安装复制的,因此没有版本不匹配。我可以使用我的 Java 类浏览文件系统并读取文件属性。如果没有异常,我就无法读取文件内容。如果我尝试使用以下代码编写文件:
FileSystem fs = null;
BufferedWriter br = null;
System.setProperty("HADOOP_USER_NAME", "root");
try {
fs = FileSystem.get(new Configuraion());
//Path p = new Path(dir, file);
Path p = new Path("hdfs://test.server:9000/usr/test/test.txt");
br = new BufferedWriter(new OutputStreamWriter(fs.create(p,true)));
br.write("Hello World");
}
finally {
if(br != null) br.close();
if(fs != null) fs.close();
}
这会创建文件但不会写入任何字节并抛出异常:
线程“main”中的异常 org.apache.hadoop.ipc.RemoteException(java.io.IOException):文件/usr/test/test.txt 只能复制到 0 个节点而不是最小复制(=1)。有 1 个数据节点正在运行,1 个节点被排除在该操作中。
谷歌搜索表明可能存在空间问题,但从 dfsadmin 报告来看,似乎有足够的空间。这是一个普通的普通安装,我无法解决这个问题。
环境总结是:
服务器:
具有伪分布的 Hadoop 2.4.0 ( http://hadoop.apache.org/docs/r2.4.0/hadoop-project-dist/hadoop-common/SingleCluster.html )
CentOS 6.5 虚拟机 64 位服务器Java 1.7.0_55
客户:
Windows 8(虚拟机)Java 1.7.0_51
非常感谢任何帮助。
最佳答案
Hadoop 错误消息令人沮丧。他们通常不会说出他们的意思,也与真正的问题无关。当客户端、namenode 和 datanode 无法正常通信时,我见过这样的问题。对于您的情况,我会选择以下两个问题之一:
主机名“test.server”非常可疑。检查以下所有内容:
必须删除 FQDN、主机名、数字 IP 和本地主机使用中的任何不一致之处。永远不要将它们混合在您的 conf 文件或您的客户端代码中。首选始终使用 FQDN。一致使用数字 IP 通常也有效。使用不合格的主机名、localhost 或 127.0.0.1 会导致问题。
关于java - 使用 Java 读取远程 HDFS 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23307235/
HDFS 是 Hadoop 中的逻辑文件系统,块大小为 64MB。 HDFS 上的文件依次保存在底层操作系统文件系统上,比如 ext4,块大小为 4KiB。 据我所知,对于本地文件系统上的文件,操作系
哪种工具最适合测量 HDFS 空间消耗? 当我总结“hdfs dfs -du/”的输出时,与“hdfs dfsadmin -report”(“DFS Used”行)相比,我总是消耗更少的空间。是否有
我正在尝试编写一个简单的脚本来验证 HDFS 和本地文件系统校验和。 在 HDFS 上我得到 - [m@x01tbipapp3a ~]$ hadoop fs -checksum /user/m/fil
我从 HDFS 中删除了一个文件夹,我在下面找到了它 /user/hdfs/.Trash/Current/ 但我无法恢复它。我查看了论坛,但没有找到好的解决方案。 请有人有解决方案我可以帮助我如何在最
在 5 个节点的集群上运行 Presto 大型扫描查询,看起来只有一个节点是查询协调器,并通过网络从 5 个 hdfs 节点读取数据。 所有 presto 进程都在数据节点上运行。 有没有办法让5个节
我有一个名为 file name(1).zip 的文件(里面有空格和括号),我想把这个文件放在 HDFS 上。但是每次我尝试通过 hadoop fs -put ... 放置它时,我都会遇到异常。 我什
在 5 个节点集群上运行 Presto 大扫描查询,看起来只有一个节点是查询协调器,并通过网络从 5 个 hdfs 节点读取数据。 所有presto进程都在数据节点上运行。 有没有办法让5个节点使用s
所以我在 CentOS 5 上通过 Cloudera Manager cdh3u5 安装了 Hadoop。当我运行 cmd 时 hadoop fs -ls/ 我希望看到 hdfs://localhos
我用命令在hadoop上运行flume flume-ng agent -c conf -f conf/flume-twitter.conf -n TwitterAgent 现在我无法保存推特数据。它显
我使用两台主机(hadoop-coc-1 和 hadoop-coc-2)尝试在其中配置 HDFS 联合。因此,我在两个主机(hadoop-coc-1 和 hadoop-coc-2)中配置了 $ cat
我需要将大量文件从一个 hdfs 目录移动(而不是复制)到同一集群中的另一个 hdfs 目录。 我可以使用 distcp,但它似乎有点矫枉过正,因为它正在复制文件(复制它)我只想移动它。两个问题: A
当我尝试将文件从我的 本地目录 复制到 HDFS 时,出现以下错误: [cloudera@localhost ~]$ hadoop fs -copyFromLocal hello.txt /user/
据我所知,在从一个 HDFS 位置移动到另一个位置时,没有直接选项可以覆盖 HDFS 中的文件,复制 cp 可以选择强制执行。我试图找出是否有任何黑客可以做到这一点? 我们能做的是 hdfs dfs
我有两个 HDFS 设置,想将一些表从 HDFS1 复制(而不是迁移或移动)到 HDFS2。如何将数据从一个 HDFS 复制到另一个 HDFS?是否可以通过 Sqoop 或其他命令行实现? 最佳答案
目前尚不清楚您是否可以像在 Flume 中那样在 Kafka 中进行扇出(复制)。 我想让 Kafka 将数据保存到 HDFS 或 S3,并将该数据的副本发送到 Storm 进行实时处理。 Storm
如何发出 hdfs 命令作为 EMR 集群中的一个步骤?将步骤添加为 script_runner.jar 任务似乎奇怪地失败了。 最佳答案 使用 command-runner.jar 并调出 bash
如何发出 hdfs 命令作为 EMR 集群中的一个步骤?将步骤添加为 script_runner.jar 任务似乎奇怪地失败了。 最佳答案 使用 command-runner.jar 并调出 bash
我是 Hadoop 和 HDFS 的新手,所以当我从本地 (Ubuntu 10.04) 复制到本地主机上单个节点上的 HDFS 时,可能是我做错了什么。初始副本工作正常,但当我修改我的本地输入文件夹并
根据我在 Hadoop HDFS 上的实践,我了解到在创建用户 say u1 并尝试将文件从本地文件系统放入 HDFS 时,它会搜索目录 /user/u1 (默认情况下)对 HDFS 文件系统具有写入
我想将一个 70G 的文件放入 hdfs,所以我使用“put”命令来完成此操作。但是,我得到以下异常。我用相同的命令尝试了小尺寸文件,它有效。有谁知道是什么问题?谢谢! WARN [DataStre
我是一名优秀的程序员,十分优秀!