虚拟机:
桥接模式:可以局域网共享
NAT模式:如果只是自己用的话用这种
学习目标:
使用Hadoop分布式系统(HDFS)来海量存储数据集,通过MapReduce堆这些数据集运行分布式计算
熟悉Hadoop的数据和IO组件,用于压缩、数据集成、序列化和持久处理
熟悉编写MapReduce实际应用时的常见陷阱和高级特性
设计、勾践和管理一个专用的Hadoop集群或在云上运行Hadoop
使用高级查询语言Pig来处理大规模数据
利用Hadoop数据库Hbase保存和处理结构化/半结构化数据
学会ZooKeeper来构建分布式系统
Hadoop是是海量数据(GB,PB)完美解决方案
解决的问题
Hadoop提供一个稳定的共享存储和分析系统,存储由HDFS实现,分析有MapReduce实现
子组件介绍
Avro: 高效跨语言RPC的数据序列系统,持久化数据存储
MapReduce: 分布式数据处理模式和执行环境,运行于大型商用机集群
HDFS:分布式文件系统,运行于大型商用机集群
Pig:一种数据流语言和运行环境,用于检索非常大的数据集。它运行在MapREduce和HDFS上。
Hbase:一个分布式的,列存储数据库。使用HDFS作为底层存储同时支持MapReduce的批量式计算和点查询(随机读取)。
ZooKeeper: 一个分布式高可用性的协调服务。它提供分布式锁之类的基本服务用于构建分布式应用。
Hive:分布式数据仓库。Hive管理HDFS中存储的数据,并提供基于SQL的查询语言用于查询数据。
Chukwa:分布式数据收集和分析系统。它是运行于HDFS中存储数据的收集器。
Hadoop安装流程:
虚拟机安装注意事项见另一个附件:
一、 配置hosts文件(/etc/hosts)
1) 修改主机名称,三台机器分别为 HOSTnAME=slave2,HOSTnAME=slave2, HOSTnAME=master
2) 修改三个机器的host为 (ip 主机名称,下面是我的测试环境)
三个机器的ip 三个机器的主机名称
192.168.102.136 master
192.168.102.135 slave2
192.168.102.128 slave1
二、 建立hadoop运行帐号(专门负责hadoop管理)
在每台机器上都创建一个组,并且创建账号
groupadd hadoop
useradd -s /bin/bash -d /home/tony2 -m tony2 -g hadoop
三、 配置ssh免密码连入
单节点设置
hadoop 集群各个节点之间需要进行数据的访问,被访问节点对与访问节点的可靠性进行验证,hadoop通过ssh方法通过
秘钥验证方式远程安全登陆操作,如果每个节点的访问都需要验证太麻烦,所以需要ssh免密码直接登陆被访问节点
1 在master中生成公钥
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
-t 秘钥类型,有两种RSA和DSA
将生成一个公私钥的目录,这个目录是隐藏的,可以用ls -a 看到
2 将公钥拷贝一份并换成另一个名字
cat id_dsa.pub >> authorized_keys
3 测试本机免密码成功, 需要用ssh登陆两次 ,第一次需要输入密码,第二次不需要输入密码
ssh 机器名(master) (提示输入密码) exit(退出ssh) ssh 用户名(不提示输入密码,直接登陆成功,则测试成功)
4 其余的机器按照上面3个步骤操作即可
则单个机器设置成功。
子节点和主节点设置
为了让主节点(master)能通过SSH免密码登陆两个子节点,两个子节点的公钥必须包含主节点的公钥信息
主要通过在子节点中用scp将主节点公钥拷贝的子节点上
scp介绍:主要可以再两个linux主机间复制文件(远程到本地或本地到远程都可以)
命令格式:scp: [可选参数] file_source file_target (是需要输入密码的)
本地文件拷贝到远程文件:
scp local_file remote_username@remote_ip:remote_folder
1 登陆子机器中,拷贝master机器的公钥到到子机器中
scp tony2@master:~/.ssh/id_dsa.pub /home/tony2/.ssh/master_dsa.pub
2 合并公钥 ,将master公钥合并到子机器中去
cat master_dsa.pub >> authorized_keys
3 测试master可以免密码登陆slave1和slave2
登陆master机器,执行 ssh slave1
第一次执行需要输入密码,然后exit退出,第二次执行不需要输入密码,配置成功
用同样的方法测试slave2配置是否可以用
则主机与子机器通讯设置成功
四、 下载并解压hadoop安装包
http://mirrors.hust.edu.cn/apache/hadoop/common/
五、 配置namenode,修改site文件()
1 解压hadoop压缩包
2 配置环境变量(hadoop安装目录):
export HADOOP_INSTALL=/web/hadoop-2.2.0
export PATH=$PATH:$HADOOP_INSTALL/bin:$HADOOP_INSTALL/sbin
3 查看hadoop是否生效
source /etc/profile
env|grep HADOOP
4 配置hadoop配置文件
Create HDFS directory
mkdir -p /web/hadoop-2.2.0/tmp
5 修改 /hadoop/etc/hadoop/core-site.xml (inside <configuration> tag):
主要的localhost需要改成master主机的ip地址
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.102.136:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/web/hadoop-2.2.0/tmp</value>
</property>
6 修改 /hadoop/etc/hadoop/hdfs-site.xml
备份文件的数量
<property>
<name>dfs.data.dir</name>
<value>/web/hadoop-1.2.1/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
最后两个是创建的dfs目录;
7 修改 /hadoop/etc/hadoop/yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
8 创建mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
修改配置:IP地址为主机master的主机地址
<property>
<name>mapred.job.tracker</name>
<value>192.168.102.136:9001</value>
</property>
六、 配置hadoop-env.sh文件
修改jdk的安装目录。
七、 配置masters和slaves文件
修改slaves和masters文件,内部添加子节点和主节点的 “机器名称”
Slaves添加的是 slave1 slave2
Masters中添加master(我的主节点名称)
八、 向各节点复制hadoop
例:scp -r hadoop-1.2.1/ root@slave1:/web
九、 格式化namenode(初始化一些文件)
bin/hadoop namenode -format
十、 启动hadoop
1. start-all.sh/shutdown-all.sh
下面是个人启动的时候报的错误:
2. 错误记录:
1)原因:hadoop需要更高版本的linux内核,需要换linux或者降低hadoop的版本。
启动报错:Unable to load native-hadoop library for your platform.
调试命令:-bash-3.2# export HADOOP_ROOT_LOGGER=DEBUG,console
-bash-3.2# hadoop fs -text /test/data/origz/access.log.gz
出现:GLIBC_2.6' not found (系统glibc版本不够)
解决:1 查看当前系统支持的glibc版本,如果当前版本低,但当前系统支持升级高版本,则可以升级,否则换高版本操作系统
查看支持版本的命令:strings /lib64/libc.so.6 |grep GLIBC_
查看当前系统glibc版本:rpm -qa | grep glibc
2)be replicated to 0 nodes, instead of 1
原因:因为所有机器的防火墙开启,导致机器之间不能访问
解决:关闭各个机器的防火墙 service iptables stop
3. Cygwin和openssh 可以再windows中模拟linux环境,不是很稳定
十一、 用jps检验各后台进程是否成功启动
1) jps命令查看启动进程:
查看是否成功:执行命令 /web/jdk1.7.0_60/bin/jps(查看与java相关的进程)
会列出下面几个进程:JobTracker,SecondaryNameNode,NameNode,Jps
子节点进程:TaskTracker DataNode Jps
2) hdfs命令导入文件,来测试hdfs是否正常运行
Hadoop 中HDFS测试:创建一个文件夹/root/input 在里面放2个文件,执行文件导入报错
命令: Hadoop dfs –put /root/input in (说明:将目录拷贝到hadoop的in目录中)
查看文件是否导入成功:bin/hadoop dfs -ls ./in/*
问题及解决: http://blog.sina.com.cn/s/blog_67f81bad0101bmn4.html
3)运行hadoop自带的例子:
bin/hadoop jar hadoop-examples-1.2.1.jar pi 10 100
bin/hadoop jar hadoop-examples-1.2.1.jar wordcount in out
bin/hadoop dfs –ls 查看根目录的所有文件
bin/hadoop dfs -ls ./out 查看out目录中所有文件
bin/hadoop dfs -cat ./out/* 统计一下运算
十二、 通过网站查看集群情况
查看hadoop服务启动情况,IP为Master的IP地址
Jobtracker工作情况: http://192.168.102.136:50030/
namenode工作情况: http://192.168.102.136:50070/
调整日志级别:http://192.168.102.136:50070/logLevel
很多工具可以对hadoop进行监控
官方文档:http://hadoop.apache.org/docs/r1.2.1/#HDFS
基本组件功能介绍:
HDFS基本特性:
硬件错误是常态。因此需要冗余
流式数据访问。即数据批量读取而非随机读写,Hadoop擅长做的是数据分析而不是事务处理
大规模数据集
简单一致性模型。为了降低系统复杂度,对文件采用一次性写多次读的逻辑设计,即是文件一经写入,关闭,就再也不能修改
程序采用“数据就近”原则分配节点执行
Namenode作用:
管理文件系统的命名空间
记录每个文件数据块在各个Datanode上的位置和副本信息
协调客户端对文件的访问
记录命名空间内的改动或空间本身属性的改动
Namenode使用事务日志记录HDFS元数据的变化。使用映像文件存储文件系统的命名空间,包括文件映射,文件属性等
DataNode作用:
负责所在物理节点的存储管理
一次写入,多次读取(不修改)
文件由数据块组成,典型的块大小是64MB
数据块尽量散布道各个节点
读取数据流程:
客户端要访问HDFS中的一个文件
首先从namenode获得组成这个文件的数据块位置列表
根据列表知道存储数据块的datanode
访问datanode获取数据
Namenode并不参与数据实际传输
HDFS的可靠性:
冗余副本策略
机架策略:不同机架进行冗余
心跳机制:数据校验、数据块多少校验等
安全模式:可以确保数据有足够的冗余
使用文件块的校验和 Checksum来检查文件的完整性
回收站:文件删除后可以自动删除
元数据保护:
快照机制:快速返回某个时间点的数据状态
HDFS命令示例:
hadoop fs -mkdir /user/trunk
hadoop fs -ls /user
hadoop fs -lsr /user (递归的)
hadoop fs -put test.txt /user/trunk
hadoop fs -put test.txt . (复制到hdfs当前目录下,首先要创建当前目录)
hadoop fs -get /user/trunk/test.txt . (复制到本地当前目录下)
hadoop fs -cat /user/trunk/test.txt
hadoop fs -tail /user/trunk/test.txt (查看最后1000字节)
hadoop fs -rm /user/trunk/test.txt
hadoop fs -help ls (查看ls命令的帮助文档)
dfsadmin –safemode enter 进入hadoop的安全模式
dfsadmin –safemode leave 退出安全模式
MapReduce学习
Mapreduce运行机制图:
Input -> map -> shuffle -> reduce ->output
运行机制:
1. 客户端(client):编写mapreduce程序,配置作业,提交作业,这就是程序员完成的工作;
2. JobTracker:初始化作业,分配作业,与TaskTracker通信,协调整个作业的执行;
3. TaskTracker:保持与JobTracker的通信,在分配的数据片段上执行Map或Reduce任务,TaskTracker和JobTracker的不同有个很重要的方面,就是在执行任务时候TaskTracker可以有n多个,JobTracker则只会有一个(JobTracker只能有一个就和hdfs里namenode一样存在单点故障,我会在后面的mapreduce的相关问题里讲到这个问题的)
4. Hdfs:保存作业的数据、配置信息等等,最后的结果也是保存在hdfs上面
MapReduce性能调优:
1 调整reducer个数
2 大文件优于小文件
3 减少网络输出,压缩map的输出(之传送有用的)
4
调度机制:
1. 缺省为先入先出作业调度
2. 支持公平调度器和容量调度器
任务执行优化:
1. 推测式执行,这个方式默认是打开的,可以再配置文件(mapred-site.xml)中设置关闭
2. 可以重用JVM即单个JVM中可以执行的任务数量,可以提高效率(mapred-site.xml设置)。
3. 忽略模式:任务失败2次后,会把失败位置告诉jobTracker,jobtracker会重启这个任务,并且跳过上次执行失败的位置。(默认关闭)
错误处理机制:
硬件故障
Jobtracker是单点,需要找比较好的机器做这个节点。
Jobtracker通过心跳信号了解tasktracker是否发生故障,如果故障则会移除tasktracker任务。
如果故障节点在执行map任务并且尚未完成,则jobtracker会要求其他节点重新执行map任务。
如果故障节点在执行reduce任务尚未完成,jobtracker会要求其他节点继续执行reduce任务。
任务失败
1. 由于代码缺陷或进程崩溃引起任务失败
2. Jvm自动退出,向tasktracker父进程发送错误信息,并且错误信息会写到日志中
3. Tasktracker坚挺程序会发现进程退出,或进程很久没有信息送回,任务标记失败
4. 标记失败后,通过心跳告诉jobtracker任务失败
5. Jobtrack获悉任务失败后,将把任务重新放入调度队列重新分配在执行
6. 如果任务失败次数超过4(配置文件中设置),将不会再被执行,同时宣布作业失败
Mapreduce开发学习:
1 elipse 插件下载安装与使用,可以看安装文档
http://pan.baidu.com/share/link?shareid=2552850400&uk=2399653584
2 mapReduce开发与运行(开发完的程序必须打包成jar文件,然后在服务器上运行,elipse运行没有成功)
定义:一种用于数据处理的编程模型。
18 页面
Hadoop 完全分布式一些技巧
一、 Hadoop大集群实施
a) 设备选型(普通的pc机就可以了,但最多使用多个硬盘)
b) 是否使用虚拟机(资源允许的话可以,最好不要用一个硬盘)
c) Host维护,在急群中用DNS解析域名来查找响应的ip,例如:linux中的bind服务
d) 解决免密码登陆设置的繁琐:可以用NFS处理
e) 解决scp文件发送命令问题。 用awk解析slave文件生成scp文件脚本
,chmod a+x 文件名 ,将文件变成可执行脚本
云计算理解
云计算是服务模式:不是新技术,不是某一种软件,是一些关键技术日趋成熟后催生的一种新的服务模式
云计算是集中拥有:使用户能得到其本身无法得到的服务,降低拥有成本是云计算核心价值之一。
好处:提高软硬件使用率、集中管理降低能耗、节约维护人员费用。
风险:安全性风险,可用性风险,绑架风险
云计算形态
私有云(公司内部用),公有云(搜索,网盘),混合云
云计算解决方案:
Hadoop,Openstack
1. 基于Hadoop的日志分析项目的一些问题,可以分析出工程中:访问用户IP ,用户所在城市 ,访问时间 , 访问量怎么样
2. 离线日志分析,不适合做在线处理
3. 当传统方法解决不了,能处理足够大的数据,管理成本低,机器成本低
Hadoop解决方案(运维,写map-reduce和修改源代码,数据仓储)
1. 数据定时从收集服务器装在到Hadoop集群
2. 数据经过整理后放到数据仓库系统,数据仓库是基于Hive架构的(选用原因:支持sql语句复杂sql可能不支持,可以用Java写自定义函数),
3. 数据仓库查询系统结果被导入hbase中
4. 通过API进行连接展现
5. 对于权限需要看源代码,自己加上。