⑴ 我使用emaprece hadoop jar依賴的jar怎麼上傳
主要有4個方式:
1、把引用的所有的第三方jar包打到一個jar包內,形成一個超大包。
優點:簡單,執行相對比較簡單
缺點:一些版本升級較為麻煩,需要重新升級包
例如在maven可以添加以下配置項:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<shadedArtifactAttached>false</shadedArtifactAttached>
<outputFile>${project.build.directory}/shaded/examples-${project.version}-shaded.jar</outputFile>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
2、把引用到所有第三方包放到Hadoop的lib目錄下
優點:執行運行即可。
缺點:需要重新啟動集群,不容易維護
不推薦
3、把引用到所有第三方包放到集群中固定的一台機器上,使用libjars命令載入第三方jar
優點:只需要維護hadoop集群中的一台機器上的lib庫,易於系統的維護;
缺點:只能在存放jar的機器上去執行hadoop jar 命令執行程序,且執行命令較復雜;
個人對這種方式還可以接受,不過並不是我最喜歡的方式。
在這里,我進行了測試,WordCount的代碼不變,打成WordCount_libjarscmd.jar,注意在打包的過程中不要選擇lib中的jar文件,然後把OperateHDFS.jar放到集群中的一台機器上面,執行的命令如下所示:
hadoop jar WordCount_libjarscmd.jar com.hadoop.examples.WordCount -libjars OperateHDFS.jar input libjarscmdoutput
4、把jar包放在HDFS或者OSS上,動態載入第三方jar包
優點:程序可以方便的在集群上的任何一個節點運行,且執行命令的機器沒有限制;
執行命令:
jar ossref://yourBucket/yourPath/wordcoun
⑵ 我用linux搭建hadoop集群,在本地我用eclipse向節點上傳文件,請問上傳的文件在節點的什麼位置
你可以先刷新一下再看看,另外實在不行,可以用HDFS的命令,在你的線上的HDFS里找找,命令大概是hadoop fs -ls /(看根目錄下的文件/文件夾,hadoop dfs -ls /也可以),這樣你就可以看到當前的HDFS里的文件夾或者文件,再依次找找你看得見的路徑。一般是可以看見的。
⑶ 在Hadoop中,使用put命令,在test中生成文件myfile,可以直接創建嗎命令是什麼呢
1. 創建本地的示例數據文件:
依次進入【Home】-【hadoop】-【hadoop-1.2.1】創建一個文件夾file用來存儲本地原始數據。
並在這個目錄下創建2個文件分別命名為【myTest1.txt】和【myTest2.txt】或者你想要的任何文件名。
分別在這2個文件中輸入下列示例語句:
2. 在HDFS上創建輸入文件夾
呼出終端,輸入下面指令:
bin/hadoop fs -mkdir hdfsInput
執行這個命令時可能會提示類似安全的問題,如果提示了,請使用
bin/hadoop dfsadmin -safemode leave
來退出安全模式。
當分布式文件系統處於安全模式的情況下,文件系統中的內容不允許修改也不允許刪除,直到安全模式結 束。安全模式主要是為了系統啟動的時候檢查各個DataNode上數據塊的有效性,同時根據策略必要的復制或者刪除部分數據塊。運行期通過命令也可以進入 安全模式。
意思是在HDFS遠程創建一個輸入目錄,我們以後的文件需要上載到這個目錄裡面才能執行。
3. 上傳本地file中文件到集群的hdfsInput目錄下
在終端依次輸入下面指令:
cd hadoop-1.2.1
bin/hadoop fs -put file/myTest*.txt hdfsInput
4. 運行例子:
在終端輸入下面指令:
bin/hadoop jar hadoop-examples-1.2.1.jar wordcount hdfsInput hdfsOutput
注意,這里的示常式序是1.2.1版本的,可能每個機器有所不一致,那麼請用*通配符代替版本號
bin/hadoop jar hadoop-examples-*.jar wordcount hdfsInput hdfsOutput
應該出現下面結果:
Hadoop命令會啟動一個JVM來運行這個MapRece程序,並自動獲得Hadoop的配置,同時把類的路徑(及其依賴關系)加入到Hadoop的庫中。以上就是Hadoop Job的運行記錄,從這里可以看到,這個Job被賦予了一個ID號:job_201202292213_0002,而且得知輸入文件有兩個(Total input paths to process : 2),同時還可以了解map的輸入輸出記錄(record數及位元組數)
⑷ 如何向 hadoop 導入數據
1.2
使用Hadoop
shell命令導入和導出數據到HDFS
實驗准備
實例需要用到的數據-weblog_entries.txt
在namenode創建2個文件夾用來存放實驗用的數據
mkdir
/home/data
1
mkdir
/home/data_download1
將weblog_entries.txt上傳到namenode里的/home/data文件夾(我使用SecureFXPortable.exe
工具)
註:以下命令都是在namenode節點運行的
實驗過程
1.在HDFS中創建一個新的文件夾,用於保存weblog_entries.txt
hadoop
fs
-mkdir
/data/weblogs1
2.將weblog_entries.txt文件從本地文件系統復制到HDFS剛創建的新文件夾下
cd
/home/data1
hadoop
fs
-FromLocal
weblog_entries.txt
/data/weblogs1
3.列出HDFS上weblog_entries.txt文件的信息:
hadoop
fs
–ls
/data/weblogs/weblog_entries.txt
1
4.將HDFS上的weblog_entries.txt文件復制到本地系統的當前文件夾下
cd
/home/data_download1
hadoop
fs
-ToLocal
/data/weblogs/weblog_entries.txt
./weblog_entries.txt
1
最後用
ls
命令檢驗下時候將weblog_entries.txt
下載到本地
⑸ hadoop中命令經常含有-fs,-dfs,fs和dfs有什麼區別作用是什麼
You can see definitions of the two commands (hadoop fs & hadoop dfs) in
可以看一下hadoop的源代碼
$HADOOP_HOME/bin/hadoop
...elif [ "$COMMAND" = "datanode" ] ; then CLASS='org.apache.hadoop.hdfs.server.datanode.DataNode' HADOOP_OPTS="$HADOOP_OPTS $HADOOP_DATANODE_OPTS"elif [ "$COMMAND" = "fs" ] ; then CLASS=org.apache.hadoop.fs.FsShell HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"elif [ "$COMMAND" = "dfs" ] ; then CLASS=org.apache.hadoop.fs.FsShell HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"elif [ "$COMMAND" = "dfsadmin" ] ; then CLASS=org.apache.hadoop.hdfs.tools.DFSAdmin HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"...
So, they are exactly the same.
所以,發現兩者是完全一樣的功能。
謝謝
⑹ 如何遠程上傳文件到hadoop中
全用以下命令上傳文件到Hadoop上:
hadoopfs-putlocal_file_name/user/hadoop/
其中,/user/hadoop/為HDFS上的路徑。local_file_name為需要上傳的文件名。
⑺ Hadoop中大文件上傳後是否被分割存儲在NDFS中
hdfs存儲文件是按照塊來的,hdfs的塊大小默認是256M,可以自己設置,一個大文件會被切分成很多塊存儲到不同的地方,同時每個塊也會備份多份。
⑻ Hadoop集群以外的機器如何訪問Hadoop集群,進行提交文件,下載文件
集群以外的機器如何訪問Hadoop集群,並像集群中提交作業和傳送數據
(1)首先,在機器上安裝nutch或者hadoop
(2)配置兩個文件
hadoop-site.xml:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://gc04vm12:9000</value>
<description> </description>
</property>
<property>
<name>mapred.job.tracker</name>
<value>gc04vm12:9001</value>
<description> </description>
</property>
</configuration>
(3)這樣便能執行命令,查看集群狀態,向集群提交作業
(4)hdfs中的用戶
使用root登陸而hadoop中沒有創建root用戶時,使用如下命令時,查看到的就不是nutch用戶主目錄 /user/root了
[root@gc03vm12 nutch-1.0]# bin/hadoop dfs -ls 執行此命令時,即是列出/user/root(root用戶主目錄)目錄下的文件或目錄
ls: Cannot access .: No such file or directory. 沒有此目錄
[root@gc03vm12 nutch-1.0]# bin/hadoop dfs -ls /
Found 3 items
drwxr-xr-x - nutch supergroup 0 2010-05-21 00:42 /tmp
drwxr-xr-x - nutch supergroup 0 2010-05-21 00:53 /user
drwxr-xr-x - nutch supergroup 0 2010-05-21 00:55 /usr 這個是什麼?
[root@gc03vm12 nutch-1.0]# bin/hadoop dfs -mkdir x 主目錄(/user/root)中創建x目錄,提示以下信息
mkdir: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="user":nutch:supergroup:rwxr-xr-x
這是因為root用戶對/user/目錄沒有寫許可權(drwxr-xr-x - nutch supergroup 0 2010-05-21 00:53 /user)
hdfs中的nutch用戶是啟動hadoop集群的這個用戶,當客戶機中也存在nutch用戶時,登陸後訪問hdfs時,進入的是home目錄(/user/nutch)。
hdfs中文件和目錄的許可權類似linux,可以修改其許可權,改變其所屬組
nutch用戶格式化namenode,啟動hadoop集群(會用到nutch用戶的公鑰信息,ssh配置)後,執行命令,
[nutch@gc03vm12 nutch-1.0]# bin/hadoop dfs -ls 執行此命令時,即是列出/user/nutch(nutch用戶主目錄)目錄下的文件或目錄
ls: Cannot access .: No such file or directory.
因為沒有/user/nutch目錄,所以不能訪問,而此時若創建一個文件,如使用以下命令
[nutch@gc03vm12 nutch-1.0]# bin/hadoop dfs -mkdir x 則可以順利執行,此時它將創建/user/nutch/x目錄。
而使用root用戶不行,是因為 root用戶對/user/目錄沒有寫許可權。
那麼如何創建一個root用戶呢,可以這樣做
超級用戶nutch在hdfs中創建目錄/user/root,即 bin/hadoop dfs -mkdir /user/root
更改/user/root目錄所屬用戶和組, bin/hadoop dfs -chown -R root:root /user/root (若此處沒有指定組,則默認root屬於supergroup組, bin/hadoop dfs -chown -R root /user/root)
這樣就相當於在hdfs中創建了用戶root,組root;
用戶許可權和Linux類似,nutch是超級用戶。
例如nutch在root的home目錄下創建目錄s,則s的許可權如下,屬於nutch,組是root
drwxr-xr-x - nutch root 0 2010-05-21 04:41 /user/root/s
root用戶此時就不能寫s目錄了
[root@gc04vm14 nutch-1.0]# bin/hadoop dfs -mkdir s/x
mkdir: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="s":nutch:root:rwxr-xr-x
root用戶屬於root組,並且執行作業,會提示錯誤,如下
[root@gc03vm12 nutch-1.0]# bin/nutch crawl /user/nutch/urls -dir data2 -depth 5 -topN 8
提示如下錯誤
org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="tmp":nutch:supergroup:rwxr-xr-x
這是因為root用戶對/tmp目錄(hdfs目錄)沒有寫許可權,因為作業執行時,會在/tmp目錄下生成相應的job文件,
/tmp的許可權如下:
drwxr-xr-x - nutch supergroup 0 2010-05-21 00:42 /tmp
因此非超級用戶提交作業時,用戶問題是一個很麻煩的問題
註:
hadoop有些命令只能在namenode上執行
⑼ hadoop使用put上傳文件出錯
先看看 /user/xxx目錄的許可權:drwxr-xr-x - hdfs supergroup 表示它屬於hdfs用戶,組名為 supergroup
因此需要使用 sudo -u hdfs hadoop fs -put localfile /user/xxx 來指定使用 hdfs 用戶來執行上傳命令。參考
當高興地執行sudo -u hdfs hadoop fs -put localfile /user/xxx 以為能成功上傳時,又報錯:
put: localfile No such file or directory 說找不到本地文件localfile,可是用 ls 明明 能看到 localfile ,後來在一篇文章(參考)中發現發來是lcoalfile的許可權問題。