啟動(dòng)HDFS

配置的修改

pom文件

hdfs代碼在hadoop-hdfs-project/hadoop-hdfs中,pom中關(guān)于依賴的其他hadoop模塊的scope都設(shè)置為了provided,但我們需要在IDEA里啟動(dòng)hdfs,所以,要把這些provided都注釋掉。

<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-annotations</artifactId>
  <!--<scope>provided</scope>-->
</dependency>
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-auth</artifactId>
  <!--<scope>provided</scope>-->
</dependency>
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-common</artifactId>
  <!--<scope>provided</scope>-->
</dependency>

hdfs配置文件

core-site.xml

在hadoop-common工程里的src/main/conf/目錄下找到 core-site.xml
配置內(nèi)容如下

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

然后把這個(gè)文件復(fù)制一份,放到該工程的target/classes/目錄里。

hdfs-site.xml

在hadoop-hdfs-project工程里的hadoop-hdfs模塊下的src/main/conf目錄里找到hdfs-site.xml,配置內(nèi)容如下

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/opt/xxxxxxxx/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/opt/xxxxxxxx/hadoop-2.7.3-src/dfs/data</value>
    </property>
</configuration>

然后把這個(gè)文件復(fù)制一份,放到該工程的target/classes目錄下

關(guān)于webapps

hadoop內(nèi)部有web應(yīng)用對(duì)外提供服務(wù),比如我們常用的50070之類的端口。這部分web應(yīng)用在namenode和datanode啟動(dòng)的時(shí)候都需要加載,編譯完畢的hadoop中,hdfs的web程序放在了 hadoop-hdfs-project/hadoop-hdfs/target/webapps目錄下。在IDEA里,classpath被指定到了hadoop-hdfs/target/classes目錄下,代碼里啟動(dòng)的時(shí)候是到classpath里加載webapps的資源的,找不到就會(huì)報(bào)錯(cuò)。我的解決辦法是:把hadoop-hdfs-project/hadoop-hdfs/target/webapps目錄完整復(fù)制到hadoop-hdfs-project/hadoop-hdfs/target/classes下。

如果有人知道如何在IDEA里給classpath添加目錄,可以在評(píng)論里留言,多謝各位。

嘗試啟動(dòng)

namenode和datanode是兩個(gè)獨(dú)立的進(jìn)程,說(shuō)明他們有獨(dú)立的main函數(shù)啟動(dòng)。namenode的main函數(shù)在hadoop-hdfs模塊下的org.apache.hadoop.hdfs.server.namenode.NameNode類里。datanode的main函數(shù)在org.apache.hadoop.hdfs.server.datanode.DataNode類里。 分別右鍵debug一下。datanode啟動(dòng)沒(méi)有報(bào)錯(cuò),namenode報(bào)了一個(gè)我們非常熟悉的錯(cuò)誤,告訴我們沒(méi)有給NameNode做格式化。

java.io.IOException: NameNode is not formatted.
    at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:225)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:976)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:681)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:585)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:645)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:812)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:796)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1493)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1559)

hdfs在啟動(dòng)的時(shí)候,需要從磁盤上讀取fsimage和editlog,然后把他們加載到內(nèi)存里來(lái),如果磁盤上沒(méi)有這些信息,hdfs啟動(dòng)就會(huì)報(bào)這個(gè)錯(cuò)誤,提示我們hdfs沒(méi)有format。那我們要做的事情就是,去看下namenode 的format動(dòng)作是如何被調(diào)起執(zhí)行的。這個(gè)操作是hdfs的指令,所以,這個(gè)操作應(yīng)該在hdfs的shell腳本里。在hadoop-hdfs-project/hadoop-hdfs/src /main/bin目錄中找到hdfs腳本,我們看到當(dāng)我們運(yùn)行 hdfs namenode -format命令的時(shí)候,實(shí)際上,執(zhí)行的主類就是NameNode主類,然后把-format參數(shù)傳了進(jìn)去。

hdfs文件第134行,解析到傳入的command是namenode的時(shí)候,指定要執(zhí)行的class名為org.apache.hadoop.hdfs.server.namenode.NameNode

if [ "$COMMAND" = "namenode" ] ; then
  CLASS='org.apache.hadoop.hdfs.server.namenode.NameNode'
  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_NAMENODE_OPTS"
elif [ "$COMMAND" = "zkfc" ] ; then
  CLASS='org.apache.hadoop.hdfs.tools.DFSZKFailoverController'
  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_ZKFC_OPTS"
......

文件末尾,執(zhí)行的時(shí)候的命令如下

else
  # run it
  exec "$JAVA" -Dproc_$COMMAND $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"
fi

所以,我們想在IDEA里執(zhí)行hdfs namenode -format,只需要啟動(dòng)NameNode的main方法的時(shí)候,設(shè)置好參數(shù)就可以了。

namenode設(shè)置啟動(dòng)參數(shù): -format

當(dāng)程序執(zhí)行完畢后,我們從控制臺(tái)看到的輸出如下

Connected to the target VM, address: '127.0.0.1:49792', transport: 'socket'
log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Formatting using clusterid: CID-fd99778b-85d1-4b0e-bbbd-4fd9e93a96ac
Disconnected from the target VM, address: '127.0.0.1:49792', transport: 'socket'

Process finished with exit code 0

到我們配置的hdfs的磁盤目錄上去看下內(nèi)容,發(fā)現(xiàn)數(shù)據(jù)都o(jì)k了。


fsimage生成完畢

看到網(wǎng)上有人寫了hdfs namenode -format整體的執(zhí)行流程,地址在這里。后續(xù)的文章里HDFS的所有常用執(zhí)行操作我也盡量都去做一下分析。

啟動(dòng)HDFS

查看啟動(dòng)腳本后發(fā)現(xiàn),腳本里是先啟動(dòng)namenode,然后啟動(dòng)datanode的。我們要做的事情就是,在IDEA里分別啟動(dòng)兩個(gè)進(jìn)程。namenode和datanode的main函數(shù)所在的類前面已經(jīng)寫了,不再重復(fù)。啟動(dòng)完畢后,在瀏覽器里訪問(wèn)50070,就可以看到hdfs已經(jīng)啟動(dòng)成功了。


hdfs啟動(dòng)成功.png

最后,如果你在虛擬機(jī)上啟動(dòng)了HDFS,想從其他機(jī)器上訪問(wèn),別忘了設(shè)置防火墻策略,放行HDFS需要的端口,或者干脆關(guān)掉防火墻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容