㈠ java修改hdfs上文件权限问题
看来你是开启了HDFS的权限检查功能,这样你访问HDFS,NameNode都会检查访问用户的权限的。
你现在想要修改/process/startall.txt文件的权限,那process目录以及startall.txt的有效用户、有效组以及其权限是什么呢?
假设process目录与startall.txt原始的有效用户和有效组分别为root和supergroup,原始权限为750的话,你若在自己电脑运行上述程序,它会自动获取当前计算机的登录用户,假设为wyc,去访问HDFS,很显然,你的程序连process目录都进不去的。
此外,想要更改一个目录或文件的权限,当前用户则必须是有效用户或超级用户才可以。
想要解决的话,嘿嘿,如果你设置的hadoop.security.authenticationproperty,也就是认证方式为simple的话(默认就是simple),那还可以钻该认证方式的空子,运行程序是伪装成有效用户或者超级用户即可。
此外,有一行代码需要修改一下,我在实验后发现设置权限那一行有误,如下:
//hdfs.setPermission(dstPath,newFsPermission((short)775));
hdfs.setPermission(dstPath,newFsPermission("755"));
㈡ 大数据初学者需要看看哪些Hadoop问题及解决方案
相信大家在学习大数据hadoop的时候肯定会遇到各种各样的问题,这篇文章就是介绍一些常的问题及如何解决的办法。
1、namenode无法启动,不报错
可能原因是:之前用root启动过,导致current文件夹的权限和所属更改了,需要更改回来
解决:current文件夹位于hadoop安装目录同级目录的tmp/dfs/namesecondary
2、WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platfo
原因:查看本地文件:
[root@db96 hadoop]# file /usr/local/hadoop/lib/native/libhadoop.so.1.0.0
/usr/local/hadoop/lib/native/libhadoop.so.1.0.0: ELF 32-bit LSB shared object,
Intel 80386, version 1 (SYSV), dynamically linked, not stripped
是32位的hadoop,安装在了64位的linux系统上。lib包编译环境不一样,所以不能使用。
解决:重新编译hadoop.就是重新编译hadoop软件。
3、Hadoop 报错be replicated to 0 nodes, instead of 1
原因(1)namespaceid不相同(2)没有足够的硬盘
解决(1)停止datanode(2)删除datadir下所有数据。(3)重启datanode
4、The ratio of reported blocks 0.0000 has not reached the threshold 0.9990. Safe mode will be turned off automatically.
原因:由日志可以看出无法删除/home/hadoop/tmp/mapred/system.(其实这只是一种假象,往往我们会去纠结于这个目录,其实不然)
解决:
(1):终极办法强制退出安全模式(safemode)
hadoop dfsadmin -safemode leave
这种方式虽然快,但会有遗留问题,我在用habse的时候就遇到过,很麻烦,然后你就用“hadoop fsck /”工具慢慢恢复吧。
(2):删除namenode下/home/hadoop/tmp下的所有文件,重新format,当然这种方式非常暴力,因为你的数据完全木有了
(3):参考源码可发现这个错误是在检查file的时候抛出来的,基本也就是file的block丢失、错误等原因造成的。
这种情况在副本数为1的情况下会很棘手,其他的时候hadoop基本能自行解决,错误数很多的情况下就会一直处于safemode下,当然你关于集群修改配置文件后的分发,本人写了一个配置文件分发工具可以强制离开安全模式,先保证正常读写,然后再启用“hadoop fsck /”工具慢慢修复。
5、Access denied for user 'root'@'hadoop1master' (using password: YES)
原因:没有除本地用户的其他用户远程连接
解决:修改mysql表,将localhost修改为%
6、运行本地的wordcount报错
该错误是缺少hadoop.dll(hadoop2.6.0编译的版本)文件,需要将hadoop.dll拷贝到hadoop2.6.0/bin目录下。
再次运行没有报错。
7、运行api的时候报了权限问题,使用的是hadoop,而我们想使用root
原因:配置环境变量中设置了HADOOP_USER_NAME=hadoop或者在run configuration中设置的-DHADOOP_USER_NAME=hadoop
解决:将配置环境变量中设置成HADOOP_USER_NAME=root或者在run configuration中设置的-DHADOOP_USER_NAME=root
8、org.apache.hadoop.dfs.SafeModeException:Name node is in safe mode安全模式
解决方法:bin/hadoop dfsadmin -safemode leave也就是关闭Hadoop的安全模式,这样问题就解决了。
9、用java -jar执行hadoop的job报错
原因:用hadoop的maprece变成,在执行的时候需要依赖hadoop的大部分依赖,所以上述错误是缺少hadoop的依赖包
解决:(1)建议使用hadoop -jar 执行job(2)如果使用java -jar,需要使用java -cp 把hadoop依赖的所有jar拼接到路径里面去(3)如果使用java -jar,另一种是在打包的时候把hadoop依赖的jar一起打包进去
10、运行mr程序报UnsatisfiedLinkError:nativeio.NativeIO$Windows.access0(Ljava/lang/String
一般这个问题是由本地hadoop环境变量照成的。需要设置hadoop_home变量的值。注意hadoop安装目录下,bin目录中缺少hadoop.dll和winutils.exe等动态库。还要增加bin目录到path路径。另外编辑器需要添加hadoop环境 还要注意jdk等是否正确安装。
11、在使用hdfs的fromlocal上传文件到hdfs时,爆出本地文件找不到异常,但是查看本地文件确实存在
原因:windows设置了隐藏已知文件的扩展名功能,导致上传的文件没有写扩展名
解决:在上传文件的地方添加上扩展名即可。
12、在执行hadoop-deamon.sh start xxx时报错
原因:启动的时候,节点名写错了
解决:修改名字,名字有, namenode datanode等
13、hadoop 8088 看不到maprece 任务的执行状态,无数据显示
解决方法:
(1)首先检查自己的集群中配置$HADOOP_HOME/conf/mapred-site.xml是否存在。
其中的maprece.framework.name是否配置。
(2)如果还不行的话,请在$HADOOP_HOME/conf/mapred-site.xml中原来的配置文件基础之上再添加下面
property>
property>
14、security.AccessControlException: Access denied for user sunqw. Superuser privilege is required
解决方法:
方式一:
在系统环境变量中增加HADOOP_USER_NAME,其值为root;
或者 通过java程序动态添加,如下:
?1System.setProperty("HADOOP_USER_NAME", "root");
方式二:
使用Eclipse在非hadoop运行下进行写入hdfs文件系统中时,由于sunqw对"/"目录没有写入权限,所以导致异常的发生。解决方法即开放hadoop中的HDFS目录的权限,命令如下:hadoop fs -chmod 777 / 。
方式三:
修改hadoop的配置文件:conf/hdfs-core.xml,添加或者修改 dfs.permissions 的值为 false。
方式四:
将Eclipse所在机器的名称修改为root,即与服务器上运行hadoop的名称一致。
㈢ hdfs怎么设置客户端的权限
需要链接电脑设置吧
㈣ hdfs上文件权限问题
hadoop fs -chomd +x /upload/Hello 你这句话是错误的,chmod使用u+x 试试 ,不能单独使用+x来修改文件的权限.
㈤ 如何在linux脚本中执行hdfs命令
首先脚本需要有执行权限
chmod u+x file.sh
执行脚本有三种方法:
1. ./file.sh
特点:开启bash子进程来执行,也就是开启额外的进程来进行,不影响原进程的变量、配置等
2. bash file.sh
特点:和./file.sh相同
3. source file.sh 或者 . file.sh
特点:在原bash进程中执行脚本。
第三种方法主要用于在脚本中切换用户su、切换目录cd等命令。
source 和 . 命令是相同的。
你可以搜索 source
㈥ java修改hdfs上文件权限的问题
读(r=4),写(w=2),执行(x=1)
第一位数字代表文件所有者的权限,第二位数字代表同组用户的权限,第三位数字代表其他用户的权限
775: rwx--rwx--rx
上面是网络的资料,楼主可以把代码贴完整共同研究下么
㈦ 如何用命令取hdfs-site.xml的值
<!--Thu Aug 15 20:47:13 2013-->
<configuration>
<property>
<name>dfs.cluster.administrators</name>
<value> hdfs</value>
<!-- HDFS 超级管理员用户 -->
</property>
<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
<!-- 是否开启 token 访问验证 -->
</property>
<property>
<name>dfs.datanode.failed.volumes.tolerated</name>
<value>0</value>
<!-- 能够导致DN挂掉的坏硬盘最大数,默认0就是只要有1个硬盘坏了,DN就会shutdown -->
</property>
<property>
<name>dfs.replication.max</name>
<value>50</value>
<!-- 有时dn临时故障恢复后会导致数据超过默认备份数。复制份数的最多数,通常没什么用,可以不用写配置文件里。 -->
</property>
<property>
<name>dfs.datanode..reserved</name>
<value>1073741824</value>
<!-- 每块磁盘所保留的空间大小,需要设置一些,主要是给非hdfs文件使用,默认是不保留,0字节 -->
</property>
<property>
<name>dfs.blockreport.initialDelay</name>
<value>120</value>
<!-- 推迟第一个 block报告在几秒钟内 -->
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///data/hadoop/hdfs/dn</value>
<!-- 真正的datanode数据保存路径,可以写多块硬盘,逗号分隔.把这些位置分散在每个节点上的所有磁盘上可以实现磁盘 I/O 平衡,因此会显着改进磁盘 I/O 性能。 -->
</property>
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>4096</value>
<!-- 指定datanode的最大数量的线程用于传输数据。默认 4096 -->
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop01:50070</value>
<!--namenode web UI-->
</property>
<property>
<name>dfs.client.read.shortcircuit.streams.cache.size</name>
<value>4096</value>
<!-- 在客户端读取前会创建一个FileinputStreamCache,就是由前两个参数控制大小和过期时间,
dfs.client.read.shortcircuit.streams.cache.size和dfs.client.read.shortcircuit.streams.cache.expiry.ms -->
</property>
<property>
<name>dfs.namenode.avoid.write.stale.datanode</name>
<value>true</value>
<!-- 表明是否要避免写为“过时”的心跳消息尚未收到的NameNode超过指定的时间间隔数据节点。写操作将避免使用陈旧的数据节点,除非多数据节点的配置比例
(dfs.namenode.write.stale.datanode.ratio)被标记为失效。见dfs.namenode.avoid.read.stale.datanode为读取一个类似的设置。 -->
</property>
<property>
<name>dfs.namenode.avoid.read.stale.datanode</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.stale.datanode.interval</name>
<value>30000</value>
<!-- 默认时间间隔一个datanode标记为“down机”,即。 ,如果 namenode没有接到一个datanode心跳超过这个时间间隔,datanode将标记为“过期”。 过期的间隔不能太小 (默认值是3倍 心跳间隔)-->
<!--dfs.client.read.shortcircuit.streams.cache.size和dfs.client.read.shortcircuit.streams.cache.expiry.ms
以及dfs.client.read.shortcircuit.skip.checksum和dfs.client.read.shortcircuit.buffer.size.其中,
在客户端读取前会创建一个FileinputStreamCache,就是由前两个参数控制大小和过期时间的,其中key就是Datanode+block;
后两个参数就是决定是否跳过校验以及校验的块大小.-->
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>true</value>
<!-- 在HDFS中启用权限检查 TRUE|FALSE。-->
</property>
<property>
<name>dfs.datanode.ipc.address</name>
<value>0.0.0.0:8010</value>
<!--DN的IPC监听端口,写0的话监听在随机端口通过心跳传输给NN -->
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///data/hadoop/hdfs/nn</value>
<!-- NN所使用的元数据保存,一般建议在nfs上保留一份,作为1.0的HA方案使用,也可以在一台服务器的多块硬盘上使用 -->
</property>
<property>
<name>dfs.journalnode.http-address</name>
<value>0.0.0.0:8480</value>
<!-- JournalNode web UI监听。 如果端口是0,那么服务器将启动将自定义端口。 -->
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>3</value>
<!-- DN的心跳检测时间间隔 3 秒 -->
</property>
<property>
<name>dfs.datanode.data.dir.perm</name>
<value>750</value>
<!-- datanode所使用的本地文件夹的路径权限,默认755 -->
</property>
<property>
<name>fs.permissions.umask-mode</name>
<value>022</value>
<!-- 创建文件和目录使用umask值。 -->
</property>
<property>
<name>dfs.datanode.balance.bandwidthPerSec</name>
<value>6250000</value>
<!-- 每个datanode指定的最大数量的带宽,每秒的字节数。-->
</property>
<property>
<name>dfs.namenode.accesstime.precision</name>
<value>0</value>
<!-- HDFS文件的访问时间精确值。 默认值是1小时。 设置的值为0禁用HDFS的访问时间。-->
</property>
<property>
<name>dfs.namenode.write.stale.datanode.ratio</name>
<value>1.0f</value>
<!-- 当总datanodes陈旧datanodes数量的比率明显 超过这个比例,停止避免写入失效节点,防止出现问题。-->
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file:///data/hadoop/hdfs/snn</value>
<!-- secondary namenode 节点存储 checkpoint 文件目录-->
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/grid/0/hdfs/journal</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
<!-- 2.X 版本默认值:134217728 说明: 这个就是hdfs里一个文件块的大小了,默认128M;太大的话会有较少map同时计算,
太小的话也浪费可用map个数资源,而且文件太小namenode就浪费内存多。对于较大集群,可设为256MB,根据需要进行设置。-->
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
<!-- hdfs数据块的复制份数,默认3,理论上份数越多跑数速度越快,但是需要的存储空间也更多。有钱人可以调5或者6 -->
</property>
<property>
<name>dfs.block.local-path-access.user</name>
<value>hbase</value>
</property>
<property>
<name>dfs.datanode.address</name>
<value>0.0.0.0:50010</value>
<!-- DN的服务监听端口,端口为0的话会随机监听端口,通过心跳通知NN -->
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>0.0.0.0:50075</value>
<!-- DN的tracker页面监听地址和端口 -->
</property>
<property>
<name>dfs.https.namenode.https-address</name>
<value>c6401.ambari.apache.org:50470</value>
<!-- NN的HTTPS的tracker页面监听地址和端口 -->
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
<!-- 使WebHDFS Namenodes和Datanodes(REST API)。-->
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
<!--NN启动后展开的线程数。-->
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop02:50090</value>
<!-- secondary name node web 监听端口 -->
</property>
<property>
<name>dfs.permissions.superusergroup</name>
<value>hdfs</value>
</property>
<property>
<name>dfs.namenode.safemode.threshold-pct</name>
<value>1.0f</value>
</property>
<property>
<name>dfs.domain.socket.path</name>
<value>/var/lib/hadoop-hdfs/dn_socket</value>
</property>
</configuration>
㈧ 用Java的API操作HDFS,即进行简单的上传和下载的时候会出现权限问题
关闭hdfs权限管理。在hdfs-site.xml中添加下面的配置
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
㈨ java.api操作hadoop的hdfs需要什么权限吗
不知道你说的“调用Filesystem命令”是什么意思;使用hadoop fs -rm可以正常执行,MapRece也可以正常读写HDFS文件,说明HDFS文件系统没有问题。你不妨试一试hadoop fs -chmod a+rwx <path>设置rwx权限后,再试一次。
㈩ 何时使用hadoop fs,hadoop dfs与hdfs dfs命令
hadoop hdfs dfs基本操作
本文主要参考:
http://hadoop.apache.org/docs/r2.6.5/hadoop-project-dist/hadoop-common/FileSystemShell.html
根据上面官方文档的提示我们能够知道可以通过shell的方式访问hdfs中的数据,对数据进行操作。那么首先让我们看一下hdfs的版本,使用命令hdfs version。
好,下面上货:
1、查询
使用命令:
hdfs dfs -ls / 这条执行会列出/目录下的文件和目录
hdfs dfs -ls -R /这条会列出/目录下的左右文件,由于有-R参数,会在文件夹和子文件夹下执行ls操作。
2、添加文件夹
使用命令;
hdfs dfs -mkdir -p /xytest/testdata001/
这里需要注意的是,root用户是否拥有hdfs 的权限,如果有,我们可以继续操作,如果没有,我们可以直接使用hdfs用户,默认安装完cdh后,用户hdfs拥有所有的权限。如果对于权限有不明白的,推荐看一下我的另一篇文章:
http://blog.csdn.net/wild46cat/article/details/69664376
3、增加文件
使用命令:
hdfs dfs -FromLocal ~/123.txt /xytest/testdata001/
4、查看hdfs文件中的内容
使用命令:
hdfs dfs -cat /xytest/testdata001/123.txt
或者,可以把hdfs中的文件到本地
使用命令:
hdfs dfs -ToLocal /xytest/testdata001/123.txt ~/222.txt
5、删除文件
使用命令:
hdfs dfs -rm -f /xytest/testdata001/123.txt
6、删除文件夹
使用命令:
hdfs dfs -rm -r /xytest/testdata001