Hadoop是一个开源的Apache项目,允许对大规模,分布于不同网络的数据集进行并行处理
它由HDFS(hadoop distibuted file system )和hadoop YARN组成
HDFS:处理不同的节点上的大量数据
hadoop YARN :任务调度框架,调度所有节点上的数据处理
ubuntu 14.4 hadoop 2.8.5
单机设置
安装java
下载地址
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
解压到目标文件
tar -zxvf -C /usr/java/
配置环境变量
vim /etc/profile
文末添加
- JAVA_HOME=/usr/java/jdk1.8.0_161/
- CLASSPATH=$JAVA_HOME/lib/
- PATH=$PATH:$JAVA_HOME/bin
- export PATH JAVA_HOME CLASSPATH
使环境变量生效
source /etc/profile
下载Hadoop
https://hadoop.apache.org/releases.html
binary形式
使用SHA-256方式验证我们下载的压缩包没有被篡改。,运行以下命令:
shasum -a 256 hadoop-2.8.5.tar.gz
出现结果
F9C726DF 693CE2DA A4107886 F603270D 66E7257F 77A92C98 86502D6C D4A884A4 hadoop-2.8.5.tar.gz
将出现的结果同下载页面的checksum中对应的SHA256的值做对比,忽略空格和大小写,一致则说明没被修改
然后解压
tar -zxvf hadoop-2.8.5.tar.gz
移动
mv hadoop-2.8.5 /usr/local/hadoop
修改环境变量
/usr/local/hadoop/etc/hadoop/hadoop-env.sh
将JAVA_HOME改为之前设置的值
运行 /usr/local/hadoop/bin/hadoop ,就可以看到hadoop的使用说明
测试
运行自带的Mapreduce项目,创建一个input目录,然后复制hadoop的配置文件到input目录,将这些文件作为数据
mkdir ~/input
cp /usr/local/hadoop/etc/hadoop/*.xml ~/input
/usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar grep ~/input ~/grep_example 'principal[.]*'
我们使用上述语句运行mapreduce的hadoop-mapreduce-examples 项目中的grep项目,以~/input作为输入目录,~/grep_example作为输出目录。这个grep项目将会计算匹配的迭代单词或常规表达。最终,我们使用一个常规表达来统计其中的principal的出现次数在里面或者结尾的声明语句中,这个表达式是大小敏感的,所以如果出现在句子的开头被大写了,将不会被统计。
查看统计结果
cat ~/grep_example/*
6 principal1 principal.
hadoop 集群设置
一个master node对分布的文件系统有 索引和 调度资源分配的作用 ,node-master将会在该导文中担任这个角色,拥有两个守护进程:
NameNode:管理分布的文件系统 并 记录集群中数据块存储的地址
ResourceManager: 管理YARN作业,维护调度和在子节点上执行任务
Slave node存储具体数据,提供处理权限来运行作业,选取 node1,node2,它们也有两个守护进程
DataNode :管理节点上实际存储的数据,也叫NameNode
NodeMangager :管理节点上任务的执行
配置系统
在每个节点上创建host文件:
节点之间通过他们的名字交流,编辑 /etc/hosts 将三个节点的IP添加进去
192.0.2.1 node-master192.0.2.2 node1192.0.2.3 node2
添加认证key
master node通过ssh连接来连到其他节点管理它们
创建ssh-key :
ssh-keygen -b 4096
复制key到各个服务器(前提是保证个服务器上有hadoop用户,输入相应密码即可
ssh-copy-id -i $HOME/.ssh/id_rsa.pub hadoop@node-masterssh-copy-id -i $HOME/.ssh/id_rsa.pub hadoop@node1ssh-copy-id -i $HOME/.ssh/id_rsa.pub hadoop@node2
下载解压hadoop到/home/hadoop/hadoop
编辑/home/hadoop/.profile ,添加
PATH=/home/hadoop/hadoop/bin:/home/hadoop/hadoop/sbin:$PATH
node-master的配置就完成了,子节点照例配置
安装好java后,编辑/hadoop/etc/hadoop/hadoop-env.sh,设置 JAVA_HOME为Java的安装目录
export JAVA_HOME=${JAVA_HOME}
设置NameNode ,每个节点上的/hadoop/etc/hadoop/core-site.xml到node-master:9000
fs.default.name hdfs://node-master:9000
设置HDFS的路径,编辑 hadoop/etc/hadoop/hdfs-site.xml
dfs.namenode.name.dir /home/hadoop/data/nameNode dfs.datanode.data.dir /home/hadoop/data/dataNode dfs.replication 1
最后一个属性dfs.replication表示集群上每个节点上的数据的复制次数,该次数不应该大于实际子节点数,这里也可设置为2
设置YARN的作业计划
1.。将mapred-site.xml.template
重命名为 mapred-site.xml
cd ~/hadoop/etc/hadoopmv mapred-site.xml.template mapred-site.xml
2.编辑 mapred-site.xml
mapreduce.framework.name yarn
设置YARN,编辑 yarn-site.xml
yarn.acl.enable 0 yarn.resourcemanager.hostname node-master yarn.nodemanager.aux-services mapreduce_shuffle
配置slaves,编辑hadoop/etc/hadoop/slaves,内容为
node1
node2
配置内存分配
默认的内存分配对于RAM小于8GB的机器的内存分配比较不友好,下面将提供一个2GB 的RAM的内存分配样例
内存分配特性
一个YARN作业运行需要两种资源:
一个Application Master(AM) :负责管理应用 和 协调集群上分布的执行器
一些执行器 :由AM创建来实际运行作业 , 对于MapReduce类型的作业,他们将并行的执行 map或reduce操作
这两者都运行在子节点上的container中,每个子节点都运行着一个NodeManager 守护进程,负责container的创建。
主节点上的ResourceManager管理着集群上的所有节点的container分配,根据吞吐量需求和当前情况。
要保证集群的正常运行 ,有四种资源需要被合适的分配:
1.单个节点上的container应被分配的内存 ,要比其他三种大,比整个RAM小,否者container分配将被驳回,应用将失败 。configured in yarn-site.xml
with yarn.nodemanager.resource.memory-mb
2.单个节点的的container允许消耗的最大与最小内存 ,如果一个container消耗的大于最大值将会使分配失败,并将永远被分配为最小值的倍数。configured in yarn-site.xml
with yarn.scheduler.maximum-allocation-mb
和 yarn.scheduler.minimum-allocation-mb
3.ApplicationMaster应该被分配多少内存, 这是一个恒定值,应与container的最大允许值相适应。configured in mapred-site.xml
with yarn.app.mapreduce.am.resource.mb
4.每个map与reduce操作应被分配多少内存, 应该小于container的最大值 。configured in mapred-site.xml
with properties mapreduce.map.memory.mb
and mapreduce.reduce.memory.mb
2GB的RAM的配置样例
Property | Value |
---|---|
yarn.nodemanager.resource.memory-mb | 1536 |
yarn.scheduler.maximum-allocation-mb | 1536 |
yarn.scheduler.minimum-allocation-mb | 128 |
yarn.app.mapreduce.am.resource.mb | 512 |
mapreduce.map.memory.mb | 256 |
mapreduce.reduce.memory.mb | 256 |
编辑yarn-site.xml ,添加如下内容
yarn.nodemanager.resource.memory-mb 1536 yarn.scheduler.maximum-allocation-mb 1536 yarn.scheduler.minimum-allocation-mb 128 yarn.nodemanager.vmem-check-enabled false
最后一个属性 yarn.nodemanager.vmem-check-enabled ,禁用虚拟内存,能防止在JDK8上的container分配。
编辑mapred-site.xml ,添加 如下内容
yarn.app.mapreduce.am.resource.mb 512 mapreduce.map.memory.mb 256 mapreduce.reduce.memory.mb 256
复制master上的配置文件到子节点上(子节点之前的操作是 复制master上的hadoop压缩包,解压)
scp ~/hadoop/etc/hadoop/* hadoop@node1:/home/hadoop/hadoop/etc/hadoop/etc/hadoop/
像其他典型的文件系统一样 HDFS需要被格式化,在master节点上
~/hadoop/bin/hdfs namenode -format
运行HDFS
~/hadoop/sbin/start-dfs.sh
查看启动的进程
$JAVA_HOME/bin/jps
正常情况下,node-master上应有 nodename , jps, secondarynodename , ; node1,node2 上应有 datanode ,jps .
通过日志,看到启动namenode时遇到绑定IP失败
遇到异常java.net.BindException: Problem binding to [hadoop21:8031] java.net.BindException,根据提示https://wiki.apache.org/hadoop/BindException
将site-core.xml中的node-master改为0.0.0.0,就ok了。
停止HDFS
~/hadoop/sbin/stop-dfs.sh
管理HDFS集群
~/hadoop/bin/hdfs dfsadmin -report 将会显示所有运行的DataNode信息
hdfs dfsadmin -help可以查看所有可用命令
或者在浏览器上输入 http://node-master-IP:50070 通过网页查看比较友好的管理控制台。
从HDFS中 放入与读取数据
创建supergroup目录,所有没有指定上级目录的操作都会以该目录作为上级目录
~/hadoop/bin/hdfs dfs -mkdir -p /user/hadoop
查看目录下的文件
~/hadoop/bin/hadoop fs -ls /
可以查看根目录下的所有目录
创建目录books将自动在/user/hadoop/下创建
~/hadoop/bin/hdfs dfs -mkdir books
将数据放入books中
~/hadoop/bin/hdfs dfs -put alice.txt holmes.txt frankenstein.txt books
查看book目录中文件
~/hadoop/bin/hdfs dfs -ls books
将hdfs文件系统中的一个文件移动到本地文件系统
~/hadoop/bin/hdfs dfs -cat books/alice.txt
更多的HDFS文件操作命令见:
https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/FileSystemShell.html
集群中的一个服务器作为NameNode ,另一个服务器作为专门的资源管理器ResourceManager。这些是管理者,其他的服务器(例入web app代理服务器,mapreducce历史服务器)通常不是运行在专用的硬件上就是在共享的设备上,取决于上传和下载
集群上剩下的服务器同时作为DataNode和NodeManager
hadoop有两种典型的配置文件:
只读配置:core-default.xml, hdfs-default.xml, yarn-default.xml and mapred-default.xml
网站专用配置:etc/hadoop/core-site.xml, etc/hadoop/hdfs-site.xml, etc/hadoop/yarn-site.xml etc/hadoop/mapred-site.xml
你可以通过设置分布的服务器上的 bin/目录下的etc/hadoop/hadoop-env.sh and etc/hadoop/yarn-env.sh来控制hadoop 脚本
要配置hadoop集群就要配置hadoop守护进行执行的环境变量和配置参数
HDFS守护进程有NameNode,SecondaryNameNode和DataNode.
YARN的守护进程有ResourceManager, NodeManager 和WebAppProxy
如果要使用Mapreduce,那么MapReduce作业历史服务将启动,对于大型的安装,这些通常运行在不同的机器上。
配置hadoop守护进程的环境
管理员应该可以编辑 etc/hadoop/hadoop-env.sh 可选的 etc/hadoop/mapred-env.sh 和 etc/hadoop/yarn-env.sh 来个性化hadoop守护进程的环境
至少应该设置正确的JAVA_HOME
Daemon | Environment Variable |
---|---|
NameNode | HADOOP_NAMENODE_OPTS |
DataNode | HADOOP_DATANODE_OPTS |
Secondary NameNode | HADOOP_SECONDARYNAMENODE_OPTS |
ResourceManager | YARN_RESOURCEMANAGER_OPTS |
NodeManager | YARN_NODEMANAGER_OPTS |
WebAppProxy | YARN_PROXYSERVER_OPTS |
Map Reduce Job History Server | HADOOP_JOB_HISTORYSERVER_OPTS |
例如让Namenode使用parallelGC,则需要在hadoop-env.sh中添加 export HADOOP_NAMENODE_OPTS="-XX:+UseParallelGC"
其他有用的配置参数为
HADOOP_PID_DIR 守护进程的进程id文件保存的目录
HADOOP_LOG_DIR 守护进程的日志文件保存的目录
HADOOP_HEAPSIZE/YARN_HEAPSIZE 允许最大存储量MB, 默认为1000即1000M
通常应该设置HADOOP_PID和HADOOP_LOG_DIR这样它们就只能被运行hadoop守护进行的用户修改,避免潜在的连接攻击。
HADOOP_PREFIX也应该设置在系统范围的环境变量中 /etc/profile :
HADOOP_PREFIX=/path/to/hadoop
export HADOOP_PREFIX
Daemon | Environment Variable |
---|---|
ResourceManager | YARN_RESOURCEMANAGER_HEAPSIZE |
NodeManager | YARN_NODEMANAGER_HEAPSIZE |
WebAppProxy | YARN_PROXYSERVER_HEAPSIZE |
Map Reduce Job History Server | HADOOP_JOB_HISTORYSERVER_HEAPSIZE |
配置hadoop的守护进程
etc/hadoop/core-site.xml
Parameter | Value | Notes |
---|---|---|
fs.defaultFS | NameNode URI | |
io.file.buffer.size | 131072 | Size of read/write buffer used in SequenceFiles. |
etc/hadoop/hdfs-site.xml配置NameNode
Parameter | Value | Notes |
---|---|---|
dfs.namenode.name.dir | Path on the local filesystem where the NameNode stores the namespace and transactions logs persistently. | If this is a comma-delimited list of directories then the name table is replicated in all of the directories, for redundancy. |
dfs.hosts / dfs.hosts.exclude | List of permitted/excluded DataNodes. | If necessary, use these files to control the list of allowable datanodes. |
dfs.blocksize | 268435456 | HDFS blocksize of 256MB for large file-systems. |
dfs.namenode.handler.count | 100 | More NameNode server threads to handle RPCs from large number of DataNodes. |
配置DataNode
Parameter | Value | Notes |
---|---|---|
dfs.datanode.data.dir | Comma separated list of paths on the local filesystem of a DataNode where it should store its blocks. | If this is a comma-delimited list of directories, then data will be stored in all named directories, typically on different devices. |
etc/hadoop/yarnsite.xml
配置ResourceManager和NodeManager
Parameter | Value | Notes |
---|---|---|
yarn.acl.enable | true / false | Enable ACLs? Defaults to false. |
yarn.admin.acl | Admin ACL | ACL to set admins on the cluster. ACLs are of for comma-separated-usersspacecomma-separated-groups. Defaults to special value of * which means anyone. Special value of just space means no one has access. |
yarn.log-aggregation-enable | false | Configuration to enable or disable log aggregation |
配置ResourceManager: