一、 Hadoop偽分布配置
1. 在conf/hadoop-env.sh文件中增加:export JAVA_HOME=/home/Java/jdk1.6
2. 在conf/core-site.xml文件中增加如下內容:
<!-- fs.default.name - 這是一個描述集群中NameNode結點的URI(包括協議、主機名稱、端口號),集群里面的每一台機器都需要知道NameNode的地址。DataNode結點會先在NameNode上注冊,這樣它們的數據才可以被使用。獨立的客戶端程序通過這個URI跟DataNode交互,以取得文件的塊列表。-->
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
<!—hadoop.tmp.dir 是hadoop文件系統依賴的基礎配置,很多路徑都依賴它。如果hdfs-site.xml中不配置namenode和datanode的存放位置,默認就放在這個路徑中-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hdfs/tmp</value>
</property>
(如果出現ERROR namenode.NameNode: java.io.IOException: Cannot create directory /export/home/dfs/name/curren,則改用user身份可以寫入的路徑hadoop.tmp.dir的路徑---修改core-site.xml
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop-${user.name}</value>
</property>
)
3. 在conf/hdfs-site.xml中增加如下內容:
<!-- dfs.replication -它決定着系統里面的文件塊的數據備份個數。對於一個實際的應用,它 應該被設為3(這個數字並沒有上限,但更多的備份可能並沒有作用,而且會占用更多的空間)。少於三個的備份,可能會影響到數據的 可靠性(系統故障時,也許會造成數據丟失)-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
( <!-- dfs.data.dir - 這是DataNode結點被指定要存儲數據的本地文件系統路徑。DataNode結點上的這個路徑沒有必要完全相同,因為每台機器的環境很可能是不一樣的。但如果每台機器上的這個路徑都是統一配置的話,會使工作變得簡單一些。默認的情況下,它的值hadoop.tmp.dir, 這個路徑只能用於測試的目的,因為,它很可能會丟失掉一些數據。所以,這個值最好還是被覆蓋。
dfs.name.dir - 這是NameNode結點存儲hadoop文件系統信息的本地系統路徑。這個值只對NameNode有效,DataNode並不需要使用到它。上面對於/temp類型的警告,同樣也適用於這里。在實際應用中,它最好被覆蓋掉。-->
<property>
<name>dfs.name.dir</name>
<value>/home/hdfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hdfs/data</value>
</property>
<!—解決:org.apache.hadoop.security.AccessControlException:Permission denied:user=Administrator,access=WRITE,inode="tmp":root:supergroup:rwxr-xr-x 。
因為Eclipse使用hadoop插件提交作業時,會默認以 DrWho 身份去將作業寫入hdfs文件系統中,對應的也就是 HDFS 上的/user/hadoop , 由於 DrWho 用戶對hadoop目錄並沒有寫入權限,所以導致異常的發生。解決方法為:放開 hadoop 目錄的權限,命令如下:$ hadoop fs -chmod 777 /user/hadoop -->
<property>
<name>dfs.permissions</name>
<value>false</value>
<description>
If "true", enable permission checking in HDFS. If "false", permission checking is turned off, but all other behavior is unchanged. Switching from one parameter value to the other does not change the mode, owner or group of files or directories
</description>
</property>
)括號內的我沒作考慮!
4. 在conf/mapred-site.xml中增加如下內容:
<!-- mapred.job.tracker -JobTracker的主機(或者IP)和端口。-->
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
二、操作命令
1. 格式化工作空間
進入bin目錄,運行 ./hadoop namenode –format
2. 啟動hdfs
進入hadoop目錄,在bin/下面有很多啟動腳本,可以根據自己的需要來啟動。(高一點版本的Hadoop里面還有一個超級用戶的文件夾sbin,下面的那些文件可能在這個文件夾內)
* start-all.sh 啟動所有的Hadoop守護。包括namenode, datanode, jobtracker, tasktrack
* stop-all.sh 停止所有的Hadoop
* start-mapred.sh 啟動Map/Reduce守護。包括Jobtracker和Tasktrack
* stop-mapred.sh 停止Map/Reduce守護
* start-dfs.sh 啟動Hadoop DFS守護Namenode和Datanode
* stop-dfs.sh 停止DFS守護
三、Hadoop hdfs 整合
可按如下步驟刪除和更改hdfs不需要的文件:
1.將hadoop-core-1.0.0.jar 移動到lib目錄下。
2. 將ibexec目錄下的文件移動到bin目錄下。
3. 刪除除bin、lib、conf、logs之外的所有目錄和文件。
4. 如果需要修改日志存儲路徑,則需要在conf/hadoop-env.sh文件中增加:
export HADOOP_LOG_DIR=/home/xxxx/xxxx即可。
四、HDFS文件操作
Hadoop使用的是HDFS,能夠實現的功能和我們使用的磁盤系統類似。並且支持通配符,如*。
1. 查看文件列表
查看hdfs中/user/admin/hdfs目錄下的文件。
a. 進入HADOOP_HOME目錄。
b. 執行sh bin/hadoop fs -ls /user/admin/hdfs
查看hdfs中/user/admin/hdfs目錄下的所有文件(包括子目錄下的文件)。
a. 進入HADOOP_HOME目錄。
b. 執行sh bin/hadoop fs -lsr /user/admin/hdfs
2. 創建文件目錄
查看hdfs中/user/admin/hdfs目錄下再新建一個叫做newDir的新目錄。
a. 進入HADOOP_HOME目錄。
b. 執行sh bin/hadoop fs -mkdir /user/admin/hdfs/newDir
3. 刪除文件
刪除hdfs中/user/admin/hdfs目錄下一個名叫needDelete的文件
a. 進入HADOOP_HOME目錄。
b. 執行sh bin/hadoop fs -rm /user/admin/hdfs/needDelete
刪除hdfs中/user/admin/hdfs目錄以及該目錄下的所有文件
a. 進入HADOOP_HOME目錄。
b. 執行sh bin/hadoop fs -rmr /user/admin/hdfs
4. 上傳文件
上傳一個本機/home/admin/newFile的文件到hdfs中/user/admin/hdfs目錄下
a. 進入HADOOP_HOME目錄。
b. 執行sh bin/hadoop fs –put /home/admin/newFile /user/admin/hdfs/
5. 下載文件
下載hdfs中/user/admin/hdfs目錄下的newFile文件到本機/home/admin/newFile中
a. 進入HADOOP_HOME目錄。
b. 執行sh bin/hadoop fs –get /user/admin/hdfs/newFile /home/admin/newFile
6. 查看文件內容
查看hdfs中/user/admin/hdfs目錄下的newFile文件
a. 進入HADOOP_HOME目錄。
b. 執行sh bin/hadoop fs –cat /home/admin/newFile
注:主機名字必須和hostname名字相同(cat /etc/hosts,找出127.0.0.1對應的主機名稱)
