一:简介
Hadoop是一个用Java开发的开源框架,它允许使用简单的编程模型在跨计算机集群的分布式环境中存储和处理大数据。它的设计是从单个服务器扩展到数千个机器,每个都提供本地计算和存储。特别适合写一次,读多次的场景。
Hadoop一般用于对大量数据执行完整统计分析的应用程序。
Hadoop架构图:
- HDFS:分布式文件系统 Hadoop Distributed File System
- YARN:分布式资源管理和作业调度
- MapReduce:分布式计算
Hadoop的搭建有三种方式,本文章安装的是单机版
- 单机版:适合开发调试。
- 伪分布式版:适合模拟集群学习。
- 完全分布式:生产使用的模式。
二:安装步骤
1. 修改主机名
sudo scutil --set HostName localhost
2. ssh免密登录
具体配置方法:
(1)ssh-keygen -t rsa (一路回车直到完成)
(2)cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
(3)chmod og-wx ~/.ssh/authorized_keys
然后重启终端,在命令行下输入>ssh localhost 如果不需要输密码即可进入,证明设置成功。如果仍需要输入密码,那可能是文件权限的问题,尝试执行 chmod 755 ~/.ssh
3. 安装hadoop
这里安装的是目前最新版本3.1.1
brew install hadoop
4. 修改配置文件 libexec/etc/hadoop/core-site.xml
在修改配置文件时注意不要有中文字符,如中文空格之类的
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/Cellar/hadoop/3.1.1/libexec/tmp</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:8020</value>
</property>
</configuration>
5. 修改配置文件 libexec/etc/hadoop/hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.permissions.enabled</name>
<value>false</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.1.1/libexec/tmp/dfs/name</value>
</property>
<property>
<name>dfs.namenode.data.dir</name>
<value>file:/usr/local/Cellar/hadoop/3.1.1/libexec/tmp/dfs/data</value>
</property>
</configuration>
6. 配置hadoop的环境变量
vi ~/.bash_profile
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_141.jdk/Contents/Home
export HADOOP_HOME=/usr/local/Cellar/hadoop/3.1.1/libexec
export HADOOP_ROOT_LOGGER=DEBUG,console
export PATH=$PATH:${HADOOP_HOME}/bin
source ~/.bash_profile
7. 拷贝lib/native库 libexec目录
注意:在mac环境中,通过brew install hadoop安装时在/usr/local/Cellar/hadoop/3.1.1/libexec目录下是没有/lib/native目录的,如果没有这目录在启动hadoop时会有警告的日志 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable。
解决办法有两种:
- 下载hadoop的源码自己通过maven编译出lib/native。自己编码麻烦,耗时长,不一定能编译成功。
- 在网上找一些别人编译好的,直接放到hadoop中即可。下载lib/native然后放到/usr/local/Cellar/hadoop/3.1.1/libexec目录下,然后再重启。
修改/usr/local/Cellar/hadoop/3.1.1/libexec/etc/hadoop/hadoop-env.sh
# 配置Hadoop使用的JDK版本,注意不要使用jdk1.9, 高版本会有问题
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_141.jdk/Contents/Home
# 增加导出
export HADOOP_OPTS="-Djava.library.path=${HADOOP_HOME}/lib/native"
相关文章:mac下编译hadoop3.0.*版本的native lib
8. 格式化HDFS
注意:格式化一次就可以了
cd /usr/local/Cellar/hadoop/3.1.1/bin
./hdfs namenode -format
9. 启动Hadoop
cd /usr/local/Cellar/hadoop/3.1.1/sbin
# 使用start-dfs.sh或者start-all.sh来启动hadoop
# 停止 sbin/stop-dfs.sh 或者 sbin/stop-all.sh
./start-dfs.sh
10. 查看Hadoop是否启动成功
# 查看启动的服务,如果有下面的服务则启动hadoop成功
jps
DataNode
NameNode
SecondaryNameNode
NameNode: http://localhost:9870/
三:启动yarn
1. 修改配置文件 libexec/etc/hadoop/mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
2. 修改配置文件 libexec/etc/hadoop/yarn-site.xml
<?xml version="1.0"?>
<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>
</configuration>
3. 启动yarn
# 启动ResourceManager 和 NodeManager,启动成功后可以访问http://localhost:8088/cluster
# 停止 sbin/stop-yarn.sh
# 可以通过start-all.sh 来同时启动start-dfs.sh和start-yarn.sh
sbin/start-yarn.sh
四:运行Hadoop自带的MapReduce程序(wordcount)
wordcount: 用于统计每个单词出现的次数
# 在HDFS中创建层级目录
bin/hadoop fs -mkdir -p /wordcount/input
# 将hadoop中的LICENSE.txt文件上传到层级目录中
bin/hdfs dfs -put README.txt /wordcount/input
# 查看某个层级目录下面的内容
bin/hdfs dfs -ls /wordcount/input
# 运行hadoop自带的示例程序hadoop-mapreduce-examples-3.1.1.jar 该jar中有多个示例,wordcount是其中一个示例,用于统计每个单词出现的次数,
# /wordcount/input/LICENSE.txt 表示要统计的文件
# /wordcount/output 存放统计结果存放的目录,注意/wordcount/output目录不能存在
bin/hadoop jar /usr/local/Cellar/hadoop/3.1.1/libexec/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar wordcount /wordcount/input/README.txt /wordcount/output
# 查看目录内容,运行完wordcount程序,输出目录下会有一个文件叫part-r-00000,这个就是统计的结果
bin/hdfs dfs -ls /wordcount/output
# 查看统计结果
bin/hadoop fs -cat /wordcount/output/part-r-00000
# 将hdfs指定的目录内容拉到自己机器上
bin/hadoop fs -get /wordcount/output /Users/mengday/Desktop/wordcount
统计结果part-r-00000
http://localhost:9870/ Utilities -> Browse the file system
五:hadoop 安装启动问题
1. There are 0 datanode(s) running and no node(s) are excluded in this operation.
有的时候在启动hadoop的时候使用jps查看如果没有启动datanode
原因
当我们使用hadoop namenode -format格式化namenode时,会在namenode数据文件夹(这个文件夹为自己配置文件中dfs.name.dir的路径)中保存一个current/VERSION文件,记录clusterID,datanode中保存的current/VERSION文件中的clustreID的值是上一次格式化保存的clusterID,这样,datanode和namenode之间的ID不一致。
解决方法
-
第一种:如果dfs文件夹中没有重要的数据,那么删除dfs文件夹(dfs目录在core-site.xml中hadoop.tmp.dir配置),再重新格式化和启动hadoop即可。此种方式会将数据清空!
hadoop namenode -format sbin/start-dfs.sh
-
第二种:如果dfs文件中有重要的数据,那么在dfs/name目录下找到一个current/VERSION文件,记录clusterID并复制。然后dfs/data目录下找到一个current/VERSION文件,将其中clustreID的值替换成刚刚复制的clusterID的值即可;
2. mkdir: Cannot create directory /user. Name node is in safe mode. 可通过执行下面命令执行。
# 离开安全模式
bin/hadoop dfsadmin -safemode leave
3. 运行wordcount示例程序一直循环打印日志updateStatus
ipc.Client: IPC Client (389993238) connection to /0.0.0.0:8032 from mengday got value #80
ipc.ProtobufRpcEngine: Call: getApplicationReport took 1ms
security.UserGroupInformation: PrivilegedAction as:mengday (auth:SIMPLE) from:org.apache.hadoop.mapreduce.Job.updateStatus(Job.java:328)
mapred-site.xml去掉mapreduce.framework.name配置,并重启hadoop: sbin/stop-all.sh 和 sbin/start-all.sh。
<configuration>
<!--
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
-->
<property>
<name>mapreduce.job.tracker</name>
<value>hdfs://127.0.0.1:8001</value>
<final>true</final>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>200</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>200</value>
</property>
</configuration>
yarn-site.xml 中增加yarn.resourcemanager.address、yarn.app.mapreduce.am.resource.mb、yarn.scheduler.minimum-allocation-mb配置
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>127.0.0.1:8032</value>
</property>
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>200</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>50</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>
</configuration>