㈠ 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