Hadoop架构中的Namenode是单点故障.
拥有大型Hadoop集群的人如何应对这个问题?
是否有一个行业认可的解决方案运行良好,其中一个辅助Namenode接管以防主要的一个失败?
我有一个map-reduce java程序,我尝试只压缩mapper输出但不压缩reducer输出.我认为这可以通过在Configuration实例中设置以下属性来实现,如下所示.但是,当我运行我的作业时,reducer生成的输出仍然被压缩,因为生成的文件是:part-r-00000.gz.有没有人成功地压缩了映射器数据而不是缩减器?这甚至可能吗?
//压缩映射器输出
conf.setBoolean("mapred.output.compress", true);
conf.set("mapred.output.compression.type", CompressionType.BLOCK.toString());
conf.setClass("mapred.output.compression.codec", GzipCodec.class, CompressionCodec.class);
Run Code Online (Sandbox Code Playgroud) 这是我的问题:我在HDFS中有一个文件可能很大(=不足以满足所有内存)
我想要做的是避免将此文件缓存在内存中,并且只像我对常规文件那样逐行处理:
for line in open("myfile", "r"):
# do some processing
Run Code Online (Sandbox Code Playgroud)
我希望看看是否有一种简单的方法可以在不使用外部库的情况下完成这项工作.我大概可以使其与工作libpyhdfs或蟒蛇,HDFS,但我想如果可能的话,以避免在系统中引入新的依赖和未经考验的库,特别是因为这两个似乎没有大量维护和状态,他们不应该用于生产.
我想做到这一点使用标准的"Hadoop的"命令行工具,使用Python subprocess模块,但我似乎无法能够做什么,我需要的,因为没有命令行工具,会做我处理,我想以流方式为每一行执行Python函数.
有没有办法使用子进程模块将Python函数应用为管道的正确操作数?或者甚至更好,打开它就像一个文件作为生成器,所以我可以轻松处理每一行?
cat = subprocess.Popen(["hadoop", "fs", "-cat", "/path/to/myfile"], stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
如果有另一种方法可以在不使用外部库的情况下实现上述描述,我也非常开放.
谢谢你的帮助 !
我想访问具有完全限定名称的hdfs,例如:
hadoop fs -ls hdfs://machine-name:8020/user
Run Code Online (Sandbox Code Playgroud)
我也可以简单地访问hdfs
hadoop fs -ls /user
Run Code Online (Sandbox Code Playgroud)
但是,我正在编写应该适用于不同发行版(HDP,Cloudera,MapR等)的测试用例,其中涉及访问具有限定名称的hdfs文件.
据我所知,hdfs://machine-name:8020它在core-site.xml中定义为fs.default.name.但这在不同的发行版上似乎有所不同.例如,hdfs是MapR上的maprfs.IBM BigInsights甚至没有core-site.xml在$HADOOP_HOME/conf.
hadoop似乎没有办法告诉我fs.default.name使用它的命令行选项定义了什么.
如何fs.default.name从命令行可靠地获取定义的值?
测试将始终在namenode上运行,因此机器名称很容易.但是获取端口号(8020)有点困难.我试过lsof,netstat ..但仍然找不到可靠的方法.
是否有可以将整个本地目录复制到HDFS的HDFS API?我找到了一个用于复制文件的API,但有一个用于目录吗?
我有3个数据节点正在运行,而在运行作业时,我得到以下错误,
java.io.IOException:File/user/ashsshar/olhcache/loaderMap9b663bd9只能复制到0个节点而不是minReplication(= 1).运行中有3个数据节点,此操作中排除了3个节点.在org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget(BlockManager.java:1325)
当我们的DataNode实例空间不足或DataNode未运行时,主要出现此错误.我尝试重新启动DataNodes但仍然遇到相同的错误.
我的集群节点上的dfsadmin -reports清楚地显示了大量可用空间.
我不确定为什么会这样.
我使用Cloudera CDH存储库在CentOS上构建了一个单节点Hadoop环境.当我想将本地文件复制到HDFS时,我使用了以下命令:
sudo -u hdfs hadoop fs -put /root/MyHadoop/file1.txt /
Run Code Online (Sandbox Code Playgroud)
但是,结果让我很沮丧:
put: '/root/MyHadoop/file1.txt': No such file or directory
Run Code Online (Sandbox Code Playgroud)
我确定这个文件确实存在.
请帮帮我,谢谢!
尝试写入HDFS作为我的多线程应用程序的一部分时,我收到以下错误
could only be replicated to 0 nodes instead of minReplication (=1). There are 1 datanode(s) running and no node(s) are excluded in this operation.
Run Code Online (Sandbox Code Playgroud)
我在这里尝试了重新格式化的最高评价答案,但这对我不起作用:HDFS错误:只能复制到0个节点,而不是1个节点
这是怎么回事:
PartitionTextFileWriter线程1和2不会写入同一文件,尽管它们在我的目录树的根目录下共享一个父目录.
我的服务器上的磁盘空间没有问题.
我也在我的名称 - 节点日志中看到了这一点,但不确定它的含义:
2016-03-15 11:23:12,149 WARN org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy: Failed to place enough replicas, still in need of 1 to reach 1 (unavailableStorages=[], storagePolicy=BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}, newBlock=true) For more information, please enable DEBUG log level on org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy
2016-03-15 11:23:12,150 WARN org.apache.hadoop.hdfs.protocol.BlockStoragePolicy: Failed to place enough replicas: …Run Code Online (Sandbox Code Playgroud) 我已经建立了一个多节点Hadoop集群.NameNode和Secondary namenode在同一台机器上运行,集群只有一个Datanode.所有节点都在Amazon EC2计算机上配置.
masters
54.68.218.192 (public IP of the master node)
slaves
54.68.169.62 (public IP of the slave node)
Run Code Online (Sandbox Code Playgroud)
核心的site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
Run Code Online (Sandbox Code Playgroud)
mapred-site.xml中
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
Run Code Online (Sandbox Code Playgroud)
HDFS-site.xml中
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop_store/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.name.dir</name>
<value>file:/usr/local/hadoop_store/hdfs/datanode</value>
</property>
</configuration>
Run Code Online (Sandbox Code Playgroud)
核心的site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://54.68.218.192:10001</value>
</property>
</configuration>
Run Code Online (Sandbox Code Playgroud)
mapred-site.xml中
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>54.68.218.192:10002</value>
</property>
</configuration>
Run Code Online (Sandbox Code Playgroud)
HDFS-site.xml中
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop_store/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.name.dir</name>
<value>file:/usr/local/hadoop_store/hdfs/datanode</value>
</property>
</configuration>
Run Code Online (Sandbox Code Playgroud)
在Namenode上运行的jps给出以下内容: …
我有一个存储在HDFS中的文件 part-m-00000.gz.parquet
我试图运行,hdfs dfs -text dir/part-m-00000.gz.parquet但它已经压缩,所以我运行gunzip part-m-00000.gz.parquet但它没有解压缩文件,因为它无法识别.parquet扩展名.
如何获取此文件的架构/列名称?
hadoop ×10
hdfs ×10
hadoop2 ×2
mapreduce ×2
amazon-ec2 ×1
apache-pig ×1
cloudera ×1
compression ×1
hadoop-yarn ×1
hive ×1
java ×1
mapr ×1
parquet ×1
put ×1
python ×1
shell ×1
subprocess ×1
ubuntu ×1