Induction to Hadoop

来源:互联网 发布:mysql和oracle的关系 编辑:程序博客网 时间:2024/05/18 02:12
induction to hadoop:
Yarn:管理多个不同的集群,提升资源利用率;
HIVE:能将HQL转化为map-reduce作业;
Mahout:提供了数据挖掘库,包含丰富的大数据相关算法;
HBase:Table,Column Family,Row key:主键,Timestamp:时间戳(版本号);
Zookeeper:解决分布式环境下数据管理问题(统一命名,状态同步,集群管理,配置同步);
Sqoop:插拔式,连接Hadoop与传统数据库之间的桥梁;
Flume:日志收集工具;
Oozie:作业流调度系统;
使用jar包安装部署hadoop;
建议使用非root用户安装hadoop;
ssh免密码登录:启动hadoop集群方便,只需设置master到slave节点的免密码登录;
hadoop环境搭建大致流程:解压包(jdk,hadoop包);
拷贝相关文件:cp  ../../hadoop_2_conf/*  etc/hadoop/
修改相关配置文件:vi  etc/hadoop/hadoop-env.sh
vi  etc/hadoop/mapred-site.xmlvi  etc/hadoop/core-site.xml
vi  etc/hadoop/hdfs-site.xmlvi  etc/hadoop/yarn-site.xml
vi  /etc/hadoop/slaves
启动服务:bin/hadoop namenode -format (格式化后,产生/dfs/name/目录)
先启动namedoe进程,运行 ../jdk1.7/bin/jps   多了NameNode进程
sbin/hadoop-daemon.sh  start datanode启动datanode进程。
HDFS(原理):缺点(不支持低延迟数据访问,小文件存取占用namenode内存且增加寻道时间,不能并发写入和文件随机修改,只能append);设计思想:将一大块数据分成若干小块(默认64M),每一小块数据对应多个数据节点(datanode)分布,映射关系保存在namenode中,以此实现负载均衡和解决网络瓶颈;客户端从namenode获得数据位置后,从datanode单路管道式写或者多路读; block数据副本放置策略:副本1,同Client的节点上,副本2,不同机架中的节点上,副本3,与第二个副本同一机架的另一节点上,其他副本:随机挑选;可靠性策略:文件完整性(CRC32校验,用其他副本取代损坏文件),Heartbeat(Datanode定期向Namenode发heartbeat),元数据信息(FSImage系统文件镜像,Editlog操作日志,多份存储,主备NameNode实时切换)。
HDFS java API:   Configuration类:该类的对象封装了来自core-*.xml的配置信息;FileSystem类:文件系统类,可使用该类的方法对文件/目录进行操作,一般通过FileSystem的静态方法get获得一个文件系统对象;FSDataInputStream和FSDataOutputStream类:HDFS中的输入输出流,分别通过FileSystem的open方法和create方法获得;以上类均来自java包 : org.apache.hadoop.fs 。
HDFS shell:   常用命令: dfs, dfsadmin, fsck, balancer.
yarn:产生背景:改善运维成本和数据共享,做成共享集群(以前是一个框架一个集群);yarn容错性:ResourceManager,NodeManager,ApplicationMaster;  调度架构:双层调度框架:RM将资源分配给AM,AM将资源进一步分配给各个Task;基于资源预留的调度策略:资源不够时,会为Task预留,直到资源充足。
Tez(DAG) on yarn: 不经过磁盘,基于有向图的有依赖关系的多个作业处理框架;
MapReduce2.0(原理): 案例(wordcount):有一批文件(规模为TB级或PB级),如何统计这些文件中所有单词出现的次数;方案:首先,分别统计每个文件中单词出现次数,然后累加不同文件中同一个单词出现次数; 体现分治思想(map:分,reduce:总); MapReduce将作业的整个运行过程分为两个阶段:Map阶段(可包含多个map task)和Reduce阶段;
MapReduce编程模型:  InputFormat:文件分片(InputSplit)方法,处理跨行问题;将分片数据解析成key/value对,默认实现是TextInputFormat;TexInputFormat,key是行在文件中的偏移量,value是行内容,若行被截断,则读取下一个block的前几个字符;Split:MapReduce中最小的计算单元,默认与Block一一对应,两者之间对应关系是任意的,可由用户控制;  Partitioner决定了Map Task输出的每条数据交给哪个Reduce Task处理,默认实现:hash(key)mod R,R是Reduce Task数目;
数据本地性:如果任务运行在它将处理的数据所在的节点,则称该任务具有“数据本地性”;数据本地性分类:同节点(node-local),同机架(rack-local),其他(off-switch);
MapReduce应用场景:简单的数据统计,比如网站pv,uv统计,搜索引擎建索引,海量数据查找,复杂数据分析算法实现:聚类,分类,推荐,图算法;
WordCount问题的java实现:
public static class TokenizerMapper extends Mapper<Object,Text,Text,IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new text();
public void map(Object key,Text value,Context context) throws IOException,InterruptedException{
StringTokenizer itr = new StringTokenizer(value.toString());
while(itr.hasMoreTokens()){
word.set(itr.nextToken())
context.write(word,one);
}
}
}
public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable>{
private IntWritable result = new IntWritable();
public void reduce(Text key,Iterable<IntWritable> values,Context context) throws IOException,InterruptedException{
int sum = 0;
for(IntWritable val : values){
sum += val.get();
}
result.set(sum);
context.write(key,result);
}
}
案例(Grep问题):一批TB或者PB量级的文档,需要完成以下功能:1,搜索符合某种规则(正则表达式)的单词或者句子,2,统计相应的单词或者句子的数目,3,按照数目对其进行排序,并输出最终结果;
public class RegexMapper<K> extends MapReduceBase implements Mapper<K,Text,Text,LongWritable>{
private Pattern pattern;
private int group;
public void configure(JobConf job){
pattern = Pattern.compile(job.get(“mapred.mapper.regex”));
group = job.getInt(“mapred.mapper.regex.group”,0);
public void map(K key,Text value,OutputCollector<Text,LongWritable> output,Report reporter) throws IOException{
String text = value.toString();
Matcher matcher = pattern.matcher(text);
while(matcher.find()){
output.collect(new Text(matcher.group(group)),new LongWritable(1));
}
}
}
}
主要依赖的java包:org.apache.hadoop.conf.Configuration;  fs.Path;  io.IntWritable,Text;  mapreduce.Job,Mapper,Reducer,lib.input.FileInputFormat,output.FileOutputFormat;  util.GenericOptionParser;
HBase(原理):基于HDFS的分布式列式数据库;相比HDFS,支持数据随机查找,适合增量数据处理,支持数据更新;HBase表特点:大(可以有上亿行,上百万列),无模式(每行都有一个可排序的主键和任意多的列),面向列:面向列(族)的存储和权限控制,列(族)独立检索,稀疏:对于空(null)的列不占用存储空间,数据多版本(单元格插入时的时间戳),数据类型单一(都是字符串,没有类型);数据模型:基于GoogleBigTable模型开发的,典型的key/value系统; HBase支持的操作:所有操作基于rowkey的,支持CRUD和Scan,单行操作(Put,get,Scan),多行操作(Scan,MultiPut),没有内置join操作,可使用MapReduce解决;HBase物理模型:每个column family存储在HDFS上的一个单独文件中,Key和Version number在每个column family中均由一份,空值不会被保存,HBase为每个值维护了多级索引( <key,column family,column name,timestamp> );物理存储:Table中的所有行都按照row key的字典序排列,Table在行的方向上(按大小)分割为多个Region;Region是分布式存储的最小单元,但不是存储的最小单元,Region由一个或者多个Store组成,每个Store保存一个column family,每个Store又由一个memStore和0到多个StoreFile,memStore存储在内存中,StoreFile存储在HDFS中;Write-Ahead-Log(WAL):先写操作日志,以防数据丢失;
HBase java API:  程序设计步骤:1,创建一个Configuration对象(包含各种配置信息),2,构建一个HTable句柄(提供Configuration对象,提供待访问Table的名称),3,执行相应的操作(执行put,get,delete,scan等操作),4,关闭HTable句柄(将内存数据刷新到磁盘上,释放各种资源);代码示例:Configuration conf = HbaseConfiguration.create();  HTable table = new HTable(conf,tableName);  table.getTableName();  table.close();  org.apache.hadoop.hbase.client.HTable:一个table对应一个HTable句柄,提供行级事务,严格的行一致性,并发度,顺序写;HTable并非线程安全的,创建一次,以后尽可能复用;
向HBase写入数据步骤:1,创建一个Put对象,Put put = new Put(Bytes.toBytes(“rowkey”)); 2,设置cell值,put.add(family,column,value)  put.add(family,column,timestamp.value)  put.add(KeyValue kv); 3,调用HTable中的put方法,写入数据, 4,关闭HTable句柄;
Hbase-MapReduce编程(基本思路):准备好mapper,reducer,创建job,用scan搂出数据,配工具方法,提交;
HBase应用场景:随机读或者随机写,大数据上高并发操作,比如每秒对PB级数据进行上千次操作,读写均是非常简单的操作,比如没有join操作;
HBase Schema设计(Rowkey设计关键点):避免Rowkey热点,充分利用Rowkey有序特点,可使用多个字段组合成Rowkey;
Zookeeper是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护,名字服务,分布式同步,组服务等,Zookeeper数据节点叫znode;
Zookeeper中角色分为:领导者leader,学习者learner(跟随者follower,观察者observer),客户端client;
Flume三个重要组件:1,Agent,用于采集数据,数据流产生的地方,通常由source和sink两部分组成,source用于获取数据,可从文本文件,syslog,HTTP等获取数据,sink将source获得的数据进一步传输给后面的Collector;2,Collector,它也有自己的source和sink,汇总多个Agent结果,将汇总结果导入后端存储系统,比如HDFS,HBase;3,Master,管理协调agent和collector的配置信息,Flume集群的控制器,跟踪数据流的最后确认信息,并通知agent,通常需配置多个master以防止单点故障,借助zookeeper管理。
细节:为什么引入Collector?
原因:1,对Agent数据进行汇总,避免产生过多小文件,2,避免多个Agent连接对Hadoop造成过大压力,3,中间件,屏蔽Agent和Hadoop间的异构性;
Sqoop(SQL-to-Hadoop):sqoop import connect jdbc:mysql://mysql.example.com/sqoop
Hive(ETL工具:Extraction-Transformation-Loading):构建于Hadoop之上的数据仓库,用于离线数据处理,HQL—>MR的语言翻译器;Hive局限性:HQL表达的能力有限,Hive效率较低;  支持的数据结构:STRING,FLOAT,ARRAY,MAP,STRUCT,INT等;Partition(分区):为减少不必要的暴力数据扫描,可以对表进行分区,为减少产生过多小文件,建议只对离散字段进行分区;Bucket(分桶):对于值较多的字段,可将其分成若干个Bucket,可结合Partition与Bucket使用;eg: CREATE TABLE weblog (user_id INT,url STRING,source_ip STRING) PARTITION BY (dt STRING) CLUSTERED BY (user_id) INTO 96 BUCKETS;   SET hive.enforce.bucketing = true;   FROM raw_logs INSERT OVERWRITE TABLE weblog PARTTION (dt=‘2009-02-25’) SELECT user_id,url,source_ip WHERE dt=‘2009-02-25’;HQL中两种特殊Join: Map-side Join (Broadcast join) :SELECT /*+MAPJOIN(b)*/ a.key,a.value FEOM a join b on a.key = b.key;   LEFT SEMI JOIN(左半连接):SELECT a.key,a.val FROM a LEFT SEMI JOIN b on (a.key = b.key);   用户自定义函数(UDF);   HQL不支持索引,执行过程主要是并行地暴力扫描,而且不支持update操作;
Pig(数据流执行引擎):数据模型:可通过LOAD,FOREACH和STREAM三个操作符将数据模式化,可为每个模式指明每个字段的类型,默认是bytearray;复杂数据类型:tuple(有序数据集),bag(tuple构成的集合),map;
Mahout(数据挖掘工具包):基于MapReduce开发的数据挖掘/机器学习库;K-Means聚类算法计算步骤:1,提取feature,2,将feature向量化,3,利用K-means算法实现聚类;  实例:有1TB的新闻网页数据,如何使用K-mean对其分成若干类?  分类算法:根据不同的数据集采用不同的分类模型;  Naive Bayes(简称NB),朴素贝叶斯算法(基本思想):已知类条件概率密度参数表达式和先验概率,利用贝叶斯公式转换成后验概率,根据后验概率大小进行决策分类。协同过滤推荐算法:Item(能够被推荐给使用者的项目),User(能够推Item做评分,能为系统推荐Item的使用者),Preference(User对Item的评分,{userId,itemId,rating}),其实就是个矩阵模型,行是User,列是Item,值是评分;   User-based(查找用户相似度):1,如何预测用户1对于商品4的喜好程度?   2,找到和用户1相似的用户且购买过商品4(基于购买记录)即用户n,3,根据用户n对商品4的评价,以相似度为权重回填结果,4,针对所有用户组合,重复1~3,直到所有空格被填满;   类比迁移Item-based;
基于用户的推荐效果好,基于商品的计算效率高;Taste:Mahout自带的一个推荐系统实现;
自己构建作业流:crontab+shell缺点:编写复杂,不灵活,不易于管理,难以监控,报警
e.g.  //mapreduce_job.sh
cmd = “hadoop jar example1.jar xxx-D … … “
$cmd
code = $?
while [$code !=0]; do
echo “run job failed,run submit”
$cmd
done
企业应用案例:日志分析系统和机器学习平台;
日志数据特点:数据源多样化,流式数据,高并发,数据量大,近实时分析与离线处理;
0 0
原创粉丝点击