Hadoop是Apache软件基金会旗下的一个开源分布式计算平台。以Hadoop分布式文件系统(HDFS,Hadoop Distributed Filesystem)和MapReduce(Google MapReduce的开源实现)为核心的Hadoop为用户提供了系统底层细节透明的分布式基础架构。java
对于Hadoop的集群来说,能够分红两大类角色:Master和Salve。一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode做为主服务器,管理文件系统的命名空间和客户端对文件系统的访问操做;集群中的DataNode管理存储的数据。MapReduce框架是由一个单独运行在主节点上的JobTracker和运行在每一个集群从节点的TaskTracker共同组成的。主节点负责调度构成一个做业的全部任务,这些任务分布在不一样的从节点上。主节点监控它们的执行状况,而且从新执行以前的失败任务;从节点仅负责由主节点指派的任务。当一个Job被提交时,JobTracker接收到提交做业和配置信息以后,就会将配置信息等分发给从节点,同时调度任务并监控TaskTracker的执行。
从上面的介绍能够看出,HDFS和MapReduce共同组成了Hadoop分布式系统体系结构的核心。HDFS在集群上实现分布式文件系统,MapReduce在集群上实现了分布式计算和任务处理。HDFS在MapReduce任务处理过程当中提供了文件操做和存储等支持,MapReduce在HDFS的基础上实现了任务的分发、跟踪、执行等工做,并收集结果,两者相互做用,完成了Hadoop分布式集群的主要任务。node
集群架构:包括4个节点:1个Master,3个Salve,节点之间局域网链接,能够相互ping通。
linux
节点IP地址分布以下:apache
主机名 IP | 系统版本 | Hadoop | node | hadoop进程名 |
---|---|---|---|---|
Master | 192.168.33.200 | CentOS 6.5 | master | namenode,jobtracker |
Slave1 | 192.168.33.201 | CentOS 6.5 | slave | datanode,tasktracker |
Slave2 | 192.168.33.202 | CentOS 6.5 | slave | datanode,tasktracker |
Slave3 | 192.168.33.203 | CentOS 6.5 | slave | datanode,tasktracker |
四个节点上均是CentOS 6.5系统,而且有一个相同的用户hadoop。Master机器主要配置NameNode和JobTracker的角色,负责总管分布式数据和分解任务的执行;3个Salve机器配置DataNode和TaskTracker的角色,负责分布式数据存储以及任务的执行。vim
四台虚拟机按照上面的网络环境来进行配置
主机名
,静态ip
,hosts映射
。浏览器
1.修改主机名服务器
vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=Master
2.修改ip地址网络
vi /etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTO="static" #dhcp改成static ONBOOT="yes" #开机启用本配置 IPADDR=192.168.33.200 #静态IP GATEWAY=192.168.33.1 #默认网关 NETMASK=255.255.255.0 #子网掩码
service network restart
架构
3.修改ip地址和主机名的映射关系app
vi /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.33.200 Master 192.168.33.201 Slave1 192.168.33.202 Slave2 192.168.33.203 Slave3
4.关闭iptables并设置其开机启动/不启动
service iptables stop
chkconfig iptables on
chkconfig iptables off
在4台机器上分别配置好jdk
1.上传jdk-8u121-linux-x64.tar.gz到Linux上
2.解压jdk到/usr/local目录
tar -zxvf jdk-8u121-linux-x64.tar.gz -C /usr/local/
3.设置环境变量,在/etc/profile文件最后追加相关内容
vi /etc/profile export JAVA_HOME=/usr/local/jdk1.8.0_121 export PATH=$PATH:$JAVA_HOME/bin
4.刷新环境变量
source /etc/profile
5.测试java命令是否可用
java -version
[root@localhost ~]# adduser cmj
为这个用户初始化密码,linux会判断密码复杂度,不过能够强行忽略:
[root@localhost ~]# passwd cmj 更改用户 cmj 的密码 新的 密码: 无效的密码: 密码未经过字典检查 - 过于简单化/系统化 从新输入新的 密码: passwd:全部的身份验证令牌已经成功更新。
2.受权
[root@localhost ~]# ls -l /etc/sudoers -r--r----- 1 root root 4251 9月 25 15:08 /etc/sudoers
sudoers只有只读的权限,若是想要修改的话,须要先添加w权限:
[root@localhost ~]# chmod -v u+w /etc/sudoers mode of "/etc/sudoers" changed from 0440 (r--r-----) to 0640 (rw-r-----)
而后就能够添加内容了,在下面的一行下追加新增的用户:
[root@localhost ~]# vim /etc/sudoers ## Allow root to run any commands anywher root ALL=(ALL) ALL cmj ALL=(ALL) ALL #这个是新增的用户
wq保存退出,这时候要记得将写权限收回:
[root@localhost ~]# chmod -v u-w /etc/sudoers mode of "/etc/sudoers" changed from 0640 (rw-r-----) to 0440 (r--r-----)
这时候使用新用户登陆,使用sudo:
第一次使用会提示你,你已经化身超人,身负责任。并且须要输入密码才能够下一步。若是不想须要输入密码怎么办,将最后一个ALL修改为NOPASSWD: ALL
。
在Hadoop启动之后,Namenode是经过SSH(Secure Shell)来启动和中止各个datanode上的各类守护进程的,这就需要在节点之间执行指令的时候是不需要输入密码的形式,故咱们需要配置SSH运用无密码公钥认证的形式。以本文中的四台机器为例,如今Master是主节点,他需要链接Slave一、Slave2和Slave3。需要肯定每台机器上都安装了ssh,而且datanode机器上sshd服务已经启动。
切换到hadoop用户( 保证用户hadoop能够无需密码登陆,由于咱们后面安装的hadoop属主是hadoop用户。)须要使得Master到Slave1,Slave2,Slave3免密登录,以及Slave1,Slave2,Slave3到Master的免密登录,以及Master,Slave1,Slave2,Slave3到自身回环口的免密登录
注意是在cmj用户之下,而不是root,由于咱们最终是要使用cmj用户来使用hadoop,而你在cmj用户下配置免密登录后,切换至root用户或者其余用户的使用ssh登录时,仍然须要密码。
#su cmj #ssh-keygen -t rsa #cat ~/.ssh/id_rsa.pub
这个命令生成一个密钥对:id_rsa(私钥文件)和id_rsa.pub(公钥文件)。默认被保存在~/.ssh/目录下。
在/home/cmj/.ssh/下建立authorized_keys
上传Master公钥到Slave1中:
#scp /home/cmj/.ssh/id_rsa.pub cmj@slave1:/home/cmj/
到slave1中将刚才复制的公钥追加到authorized_keys中
#cd ~ #cat id_rsa.pub >> .ssh/authorized_keys #rm -f id_rsa.pub #删除Master复制到slave1下的临时key
权限设置为600.(这点很重要,网没有设置600权限会致使登录失败)
#chmod 600 .ssh/authorized_keys
测试登录
$ ssh Slave1 The authenticity of host 'Master (192.168.33.200)' can't be established. RSA key fingerprint is d5:18:cb:5f:92:66:74:c7:30:30:bb:36:bf:4c:ed:e9. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'Master,192.168.33.200' (RSA) to the list of known hosts. Last login: Fri Aug 30 21:31:36 2013 from slave1 [cmj@Slave1 ~]$
一样的方法,将Master 的公钥复制到其余节点。另外自身节点要设置免密登录。把自身的公钥追加到自身的authorized_keys中。
步骤相似上面。
1) 切换为cmj用户,下载安装包后,直接解压安装便可:
#su cmj #wget http://apache.stu.edu.tw/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz #tar -zxvf hadoop-1.2.1.tar.gz
个人安装目录为:
/home/cmj/hadoop-1.2.1
为了方便,使用hadoop命令或者start-all.sh等命令,修改Master上/etc/profile 新增如下内容:
export HADOOP_HOME=/home/cmj/hadoop-1.2.1 export PATH=$PATH:$HADOOP_HOME/bin
修改完毕后,执行source /etc/profile
来使其生效。
2) 配置conf/hadoop-env.sh文件
配置conf/hadoop-env.sh文件,添加:
export JAVA_HOME=/usr/local/jdk1.8.0_121/
这里修改成你的jdk的安装位置。
测试hadoop安装:
/home/cmj/hadoop-1.2.1/bin/hadoop jar hadoop-0.20.2-examples.jarwordcount conf/ /tmp/out
<configuration> <property> <name>fs.default.name</name> <value>Master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/cmj/tmp</value> </property> </configuration>
fs.default.name
是NameNode的URI。hdfs://主机名:端口/
hadoop.tmp.dir
:Hadoop的默认临时路径,这个最好配置,若是在新增节点或者其余状况下莫名其妙的DataNode启动不了,就删除此文件中的tmp目录便可。不过若是删除了NameNode机器的此目录,那么就须要从新执行NameNode格式化的命令。
<configuration> <property> <name>mapred.job.tracker</name> <value>hdfs://Master:9001</value> </property>
mapred.job.tracker
是JobTracker的主机(或者IP)和端口。主机:端口。
<configuration> <property> <name>dfs.replication</name> <value>3</value> </property> </configuration>
dfs.name.dir
是NameNode持久存储名字空间及事务日志的本地文件系统路径。 当这个值是一个逗号分割的目录列表时,nametable数据将会被复制到全部目录中作冗余备份。
dfs.data.dir
是DataNode存放块数据的本地文件系统路径,逗号分割的列表。 当这个值是逗号分割的目录列表时,数据将被存储在全部目录下,一般分布在不一样设备上。
dfs.replication
是数据须要备份的数量,默认是3,若是此数大于集群的机器数会出错。
注意:此处的name一、name二、data一、data2目录不能预先建立,hadoop格式化时会自动建立,若是预先建立反而会有问题。
配置conf/masters和conf/slaves来设置主从结点,注意最好使用主机名,而且保证机器之间经过主机名能够互相访问,每一个主机名一行。
$vim masters:
输入:
Master
$vim slaves:
输入:
Slave1 Slave2 Slave3
配置结束,把配置好的hadoop文件夹拷贝到其余集群的机器中,而且保证上面的配置对于其余机器而言正确,例如:若是其余机器的Java安装路径不同,要修改conf/hadoop-env.sh
$scp -r /home/cmj/hadoop-1.2.1 Slave1:/home/cmj/ $scp -r /home/cmj/hadoop-1.2.1 Slave2:/home/cmj/ $scp -r /home/cmj/hadoop-1.2.1 Slave3:/home/cmj/
$ cd /home/cmj/hadoop-1.2.1 $ bin/hadoop namenode -format
成功状况下系统输出:
Warning: $HADOOP_HOME is deprecated. 13/09/10 16:39:31 INFO namenode.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode STARTUP_MSG: host = Master/192.168.137.100 STARTUP_MSG: args = [-format] STARTUP_MSG: version = 1.2.1 STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1503152; compiled by 'mattf' on Mon Jul 22 15:23:09 PDT 2013 STARTUP_MSG: java = 1.6.0_45 ************************************************************/ 13/09/10 16:39:32 INFO util.GSet: Computing capacity for map BlocksMap 13/09/10 16:39:32 INFO util.GSet: VM type = 64-bit 13/09/10 16:39:32 INFO util.GSet: 2.0% max memory = 1013645312 13/09/10 16:39:32 INFO util.GSet: capacity = 2^21 = 2097152 entries 13/09/10 16:39:32 INFO util.GSet: recommended=2097152, actual=2097152 13/09/10 16:39:32 INFO namenode.FSNamesystem: fsOwner=hadoop 13/09/10 16:39:32 INFO namenode.FSNamesystem: supergroup=supergroup 13/09/10 16:39:32 INFO namenode.FSNamesystem: isPermissionEnabled=true 13/09/10 16:39:32 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100 13/09/10 16:39:32 INFO namenode.FSNamesystem: isAccessTokenEnabled=falseaccessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s) 13/09/10 16:39:32 INFO namenode.FSEditLog: dfs.namenode.edits.toleration.length = 0 13/09/10 16:39:32 INFO namenode.NameNode: Caching file names occuring more than 10 times 13/09/10 16:39:33 INFO common.Storage: Image file /home/hadoop/name1/current/fsimage of size 112 bytes saved in 0 seconds. 13/09/10 16:39:33 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/home/hadoop/name1/current/edits 13/09/10 16:39:33 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/home/hadoop/name1/current/edits 13/09/10 16:39:33 INFO common.Storage: Storage directory /home/hadoop/name1 has been successfully formatted. 13/09/10 16:39:33 INFO common.Storage: Image file /home/hadoop/name2/current/fsimage of size 112 bytes saved in 0 seconds. 13/09/10 16:39:33 INFO namenode.FSEditLog: closing edit log: position=4, editlog= /home/hadoop/name2/current/edits 13/09/10 16:39:33 INFO namenode.FSEditLog: close success: truncate to 4, editlog= /home/hadoop/name2/current/edits 13/09/10 16:39:33 INFO common.Storage: Storage directory /home/hadoop/name2 has been successfully formatted. 13/09/10 16:39:33 INFO namenode.NameNode: SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at Master/192.168.137.100 ************************************************************/
查看输出保证分布式文件系统格式化成功执行完后能够到master机器上看到/home/hadoop//name1和/home/hadoop/name2两个目录。在主节点master上面启动hadoop,主节点会启动全部从节点的hadoop。
$ bin/start-all.sh
(同时启动HDFS和Map/Reduce)系统输出:
$ bin/start-all.sh Warning: $HADOOP_HOME is deprecated. starting namenode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-namenode-Master.out Slave3: starting datanode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-datanode-Slave3.out Slave2: starting datanode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-datanode-Slave2.out Slave1: starting datanode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-datanode-Slave1.out The authenticity of host 'master (192.168.137.100)' can't be established. RSA key fingerprint is d5:18:cb:5f:92:66:74:c7:30:30:bb:36:bf:4c:ed:e9. Are you sure you want to continue connecting (yes/no)? yes Master: Warning: Permanently added 'master,192.168.137.100' (RSA) to the list of known hosts. hadoop@master's password: Master: starting secondarynamenode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-secondarynamenode-Master.out starting jobtracker, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-jobtracker-Master.out Slave2: starting tasktracker, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-tasktracker-Slave2.out Slave3: starting tasktracker, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-tasktracker-Slave3.out Slave1: starting tasktracker, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-tasktracker-Slave1.out
执行完后能够到master(Master)和slave(Slave1,Slave2,Slave3)机器上看到/home/hadoop/hadoopfs/data1和/home/hadoop/data2两个目录。
启动Hadoop集群须要启动HDFS集群和Map/Reduce集群。
在分配的NameNode上,运行下面的命令启动HDFS:
$ bin/start-dfs.sh
(单独启动HDFS集群)
bin/start-dfs.sh
脚本会参照NameNode上${HADOOP_CONF_DIR}/slaves
文件的内容,在全部列出的slave上启动DataNode守护进程。
在分配的JobTracker上,运行下面的命令启动Map/Reduce:$bin/start-mapred.sh
(单独启动Map/Reduce)
bin/start-mapred.sh
脚本会参照JobTracker上${HADOOP_CONF_DIR}/slaves
文件的内容,在全部列出的slave上启动TaskTracker守护进程。
从主节点master关闭hadoop,主节点会关闭全部从节点的hadoop。
$ bin/stop-all.sh
Hadoop守护进程的日志写入到 ${HADOOP_LOG_DIR}
目录 (默认是 ${HADOOP_HOME}/logs)
.
${HADOOP_HOME}
就是安装路径.
$ /usr/local/jdk1.6.0_45/bin/jps 3180 Jps 2419 SecondaryNameNode 2236 NameNode 2499 JobTracker
$ /usr/local/jdk1.6.0_45/bin/jps 2631 Jps 2277 DataNode 2365 TaskTracker
NameNode – http://Master:50070/dfshealth.jsp
http://master:50030
对刚刚安装好的hadoop集群作个测试
准备两个数据文件test1.txt,test2.txt,将其put到hadoop的file system的in里面
说明:bin/hadoop fs -put ../input ./in
:将当前目录下的input文件夹拷贝到hadoop文件系统的in文件夹里面
[cmj@Master hadoop-1.2.1]$ bin/hadoop jar hadoop-examples-1.2.1.jar wordcount in out 17/04/16 19:50:37 INFO input.FileInputFormat: Total input paths to process : 2 17/04/16 19:50:37 INFO util.NativeCodeLoader: Loaded the native-hadoop library 17/04/16 19:50:37 WARN snappy.LoadSnappy: Snappy native library not loaded 17/04/16 19:50:37 INFO mapred.JobClient: Running job: job_201704161933_0001 17/04/16 19:50:38 INFO mapred.JobClient: map 0% reduce 0% 17/04/16 19:50:45 INFO mapred.JobClient: map 100% reduce 0% 17/04/16 19:50:54 INFO mapred.JobClient: map 100% reduce 33% 17/04/16 19:50:55 INFO mapred.JobClient: map 100% reduce 100% 17/04/16 19:50:57 INFO mapred.JobClient: Job complete: job_201704161933_0001 17/04/16 19:50:57 INFO mapred.JobClient: Counters: 29 17/04/16 19:50:57 INFO mapred.JobClient: Map-Reduce Framework 17/04/16 19:50:57 INFO mapred.JobClient: Spilled Records=8 17/04/16 19:50:57 INFO mapred.JobClient: Map output materialized bytes=61 17/04/16 19:50:57 INFO mapred.JobClient: Reduce input records=4 17/04/16 19:50:57 INFO mapred.JobClient: Virtual memory (bytes) snapshot=5800771584 17/04/16 19:50:57 INFO mapred.JobClient: Map input records=2 17/04/16 19:50:57 INFO mapred.JobClient: SPLIT_RAW_BYTES=210 17/04/16 19:50:57 INFO mapred.JobClient: Map output bytes=41 17/04/16 19:50:57 INFO mapred.JobClient: Reduce shuffle bytes=61 17/04/16 19:50:57 INFO mapred.JobClient: Physical memory (bytes) snapshot=395091968 17/04/16 19:50:57 INFO mapred.JobClient: Reduce input groups=3 17/04/16 19:50:57 INFO mapred.JobClient: Combine output records=4 17/04/16 19:50:57 INFO mapred.JobClient: Reduce output records=3 17/04/16 19:50:57 INFO mapred.JobClient: Map output records=4 17/04/16 19:50:57 INFO mapred.JobClient: Combine input records=4 17/04/16 19:50:57 INFO mapred.JobClient: CPU time spent (ms)=1470 17/04/16 19:50:57 INFO mapred.JobClient: Total committed heap usage (bytes)=324055040 17/04/16 19:50:57 INFO mapred.JobClient: File Input Format Counters 17/04/16 19:50:57 INFO mapred.JobClient: Bytes Read=25 17/04/16 19:50:57 INFO mapred.JobClient: FileSystemCounters 17/04/16 19:50:57 INFO mapred.JobClient: HDFS_BYTES_READ=235 17/04/16 19:50:57 INFO mapred.JobClient: FILE_BYTES_WRITTEN=160505 17/04/16 19:50:57 INFO mapred.JobClient: FILE_BYTES_READ=55 17/04/16 19:50:57 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=25 17/04/16 19:50:57 INFO mapred.JobClient: Job Counters 17/04/16 19:50:57 INFO mapred.JobClient: Launched map tasks=2 17/04/16 19:50:57 INFO mapred.JobClient: Launched reduce tasks=1 17/04/16 19:50:57 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=10333 17/04/16 19:50:57 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0 17/04/16 19:50:57 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=10492 17/04/16 19:50:57 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0 17/04/16 19:50:57 INFO mapred.JobClient: Data-local map tasks=2 17/04/16 19:50:57 INFO mapred.JobClient: File Output Format Counters 17/04/16 19:50:57 INFO mapred.JobClient: Bytes Written=25
HDFS操做
运行bin/目录的hadoop命令,能够查看Haoop全部支持的操做及其用法,这里以几个简单的操做为例。
创建目录
$bin/hadoop dfs -mkdir testdir Warning: $HADOOP_HOME is deprecated. 13/09/10 17:29:05 WARN fs.FileSystem: "Master:9000" is a deprecated filesystem name. Use"hdfs://Master:9000/" instead.
在HDFS中创建一个名为testdir的目录
复制文件
$ bin/hadoop dfs -put /home/hadoop/hadoop-1.2.1.tar.gz testfile.zip Warning: $HADOOP_HOME is deprecated. 13/09/10 17:30:32 WARN fs.FileSystem: "Master:9000" is a deprecated filesystem name. Use"hdfs://Master:9000/" instead. 13/09/10 17:30:33 WARN fs.FileSystem: "Master:9000" is a deprecated filesystem name. Use"hdfs://Master:9000/" instead
把本地文件/home/hadoop/hadoop-1.2.1.tar.gz拷贝到HDFS的根目录/user/hadoop/下,文件名为testfile.zip
查看现有文件
$ bin/hadoop dfs -ls Warning: $HADOOP_HOME is deprecated. 13/09/10 17:32:00 WARN fs.FileSystem: "Master:9000" is a deprecated filesystem name. Use"hdfs://Master:9000/" instead. Found 2 items drwxr-xr-x - hadoop supergroup 0 2013-09-10 17:29 /user/hadoop/testdir -rw-r--r-- 3 hadoop supergroup 63851630 2013-09-10 17:30 /user/hadoop/testfile.zip
经过启动或中止hadoop咱们会发现会出现 “Warning: $HADOOP_HOME is deprecated” 这样一个警告,下面给出解决方案:
第一种:去除/etc/profile
中export HADOOP_HOME=/home/cmj/hadoop-1.2.1
,而后source /etc/profile
不过咱们通常推荐第二种,由于咱们仍是须要$HADOOP_HOME的,方便引用。
因此咱们通常在/etc/profile
文件最后加上 export HADOOP_HOME_WARN_SUPPRESS=1
,而后输入命令source /etc/profile
使其生效便可。