在终端输入下面代码即可。
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
注意,这里要用JAVA8或以下版本,否则后续 ResourceManager 和 NodeManager会出问题。
brew install java8
可用java -version命令查看java版本,楼主用的是openjdk version “1.8.0_242”
ssh localhost
显示需要输入密码,把密码输入后,出现时间,代表登陆成功。
但是hadoop中需要免密登录,比如在启动datanode、namenode时都需要免密登录,如果不设置,则会出现权限不允许(Permission denied)的错误提示,导致无法启动DataNode等。
所以我们需要设置一下,在终端输入:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
之后再使用ssh localhost命令,我们会发现不用输入密码,直接可以登录。
同样是在终端使用brew进行安装
brew install hadoop
如果长时间卡在 Updating Homebrew 这个步骤,使用control+c中断此次更新即可,显示 ^C,就代表已经取消了 Updating Homebrew 操作。再等待一会儿,就会开始下载hadoop了
安好后,可在终端输入命令 hadoop 进行查看:
此时就已经安好了Hadoop的单机模式。
接下来配置的文件均在 /usr/local/Cellar/hadoop/3.2.1/libexec/etc/hadoop 路径中,文件可使用编辑器打开,楼主这里用sublime
在文件的
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/Cellar/hadoop/3.2.1/libexec/tmp</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:8020</value>
</property>
在文件的
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/Cellar/hadoop/3.2.1/libexec/tmp/dfs/name</value>
</property>
<property>
<name>dfs.namenode.data.dir</name>
<value>file:/usr/local/Cellar/hadoop/3.2.1/libexec/tmp/dfs/data</value>
</property>
在文件的
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
在文件的
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
在终端输入open ~/.bash_profile ,对环境变量文件进行编辑,添加以下信息:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
export CLASSPAHT=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export HADOOP_HOME=/usr/local/Cellar/hadoop/3.2.1/libexec
export HADOOP_COMMON_HOME=$HADOOP_HOME
export PATH=$JAVA_HOME/bin:$PATH:$HADOOP_HOME/bin:/usr/local/Cellar/scala/bin
在终端输入source ~/.bash_profile ,使刚刚修改的环境变量生效
先进入到 /usr/local/Cellar/hadoop/3.2.1/libexec/bin 路径中:
cd /usr/local/Cellar/hadoop/3.2.1/libexec/bin
然后对文件系统进行格式化:
hdfs namenode -format
然后进行启动NameNode和datanode
进入 /usr/local/Cellar/hadoop/3.2.1/libexec/sbin 路径中:
cd /usr/local/Cellar/hadoop/3.2.1/libexec/sbin
输入:
./start-dfs.sh
结果如下:
这时候NameNode和DataNode都已经启动成功了,可在终端输入命令jps查看启动情况:
到此为止,我们可以在网页中看到Overview页面了。
在浏览器上输入
http://localhost:9870/dfshealth.html#tab-overview
如下图所示:
接下来启动 ResourceManager 和 NodeManager:
先进入 /usr/local/Cellar/hadoop/3.2.1/libexec/sbin 路径中:
cd /usr/local/Cellar/hadoop/3.2.1/libexec/sbin
然后在终端输入:
./start-yarn.sh
终端输入jps命令查看是否启动成功:
(在这里我遇到了一个问题,顺便记录一下:
一开始我的NodeManager启动后过了一会儿总是会闪退,查对应的log日志显示这个错误
java.lang.NoClassDefFoundError: javax/activation/DataSource
搜索发现有两个原因会导致这个错误:
1)是JAVA版本不对,但是我用的是8,显然没问题,所以排除。
2)是缺失 javax.activation.jar。解决办法:下载javax.activation.jar, 然后复制到Hadoop的lib目录下,我的目录是:/usr/local/Cellar/hadoop/3.2.1/libexec/share/hadoop/common/lib
然后重新启动yarn,发现解决了问题,启动成功。)
启动成功后可以在浏览器输入 http://localhost:8088/cluster ,出现如下界面:
首先在终端输入:
hadoop fs -mkdir /input
这是在hadoop文件系统的根目录下新建一个input文件夹。类似的,也可以新建其他的文件或文件夹。
注意:文件夹在这里找:
http://localhost:9870/explorer.html#/
(这里我遇到了问题:
mkdir: Cannot create directory /input. Name node is in safe mode.
意思是安全模式下HDFS文件只接受读取文件,不能进行创建修改等变更请求。
在Hadoop的bin目录下终端输入命令退出安全模式即可:
hdfs dfsadmin -safemode leave
)
终端输入命令:
hadoop fs -ls /
在当前目录下新建一个LICENSE.txt文件上传即可,内容随意。
hadoop fs -put LICENSE.txt /input
hadoop fs -ls /input
因为楼主步骤(2)中显示这里已经有了一个output夹,所以这里新建一个output2文件夹
hadoop jar /usr/local/Cellar/hadoop/3.2.1/libexec/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount /input /output2
最后三个参数的意思如下:wordcount是测试用例的名称,/input表示输入文件的目录,/output表示输出文件的目录
(⚠️输出文件必须是一个不存在的文件,如果指定一个已有目录作为hadoop作业输出的话,作业将无法运行。如果想让hadoop将输出存储到一个目录,它必须是不存在的目录,应该是hadoop的一种安全机制,防止hadoop重写有用的文件)
hadoop fs -ls /output2
hadoop fs -cat /output/part-r-00000
hadoop fs -copyToLocal /output/part-r-00000
hadoop fs -rm -R /output
到此为止,第一个Hadoop程序就终于完成了!
附一些hadoop命令:
1)要从HDFS中删除文件,可以使用以下命令:
hadoop fs -rm -r -skipTrash /path_to_file/file_name
2)要从HDFS中删除文件夹,可以使用以下命令:
hadoop fs -rm -r -skipTrash /folder_name