hbase源码编译(hbase基础)
本文目录一览:
- 1、如何用MapReduce程序操作hbase
- 2、(课程)基于HBase做Storm 实时计算指标存储
- 3、hbase wal 是同步的吗
- 4、坑爹的Apache hbase 64位机装配Snappy终于成功了怎么解决
- 5、如何使用Maven构建《hadoop权威指南3》随书的源码包
- 6、数据分析需要掌握哪些知识?
如何用MapReduce程序操作hbase
先看一个标准的hbase作为数据读取源和输出目标的样例:
Configuration conf = HBaseConfiguration.create();
Job job = new Job(conf, "job name ");
job.setJarByClass(test.class);
Scan scan = new Scan();
TableMapReduceUtil.initTableMapperJob(inputTable, scan, mapper.class, Writable.class, Writable.class, job);
TableMapReduceUtil.initTableReducerJob(outputTable, reducer.class, job);
job.waitForCompletion(true);
和普通的mr程序不同的是,不再用job.setMapperClass()和job.setReducerClass()来设置mapper和reducer,而用TableMapReduceUtil的initTableMapperJob和initTableReducerJob方法来实现。此处的TableMapReduceUtil是hadoop.hbase.mapreduce包中的,而不是hadoop.hbase.mapred包中的。
数据输入源是hbase的inputTable表,执行mapper.class进行map过程,输出的key/value类型是 ImmutableBytesWritable和Put类型,最后一个参数是作业对象。需要指出的是需要声明一个扫描读入对象scan,进行表扫描读取数据用,其中scan可以配置参数。
数据输出目标是hbase的outputTable表,输出执行的reduce过程是reducer.class类,操作的作业目标是job。与map比缺少输出类型的标注,因为他们不是必要的,看过源代码就知道mapreduce的TableRecordWriter中write(key,value) 方法中,key值是没有用到的,value只能是Put或者Delete两种类型,write方法会自行判断并不用用户指明。
mapper类从hbase读取数据,所以输入的
public class mapper extends TableMapperKEYOUT, VALUEOUT {
public void map(Writable key, Writable value, Context context)
throws IOException, InterruptedException {
//mapper逻辑
context.write(key, value);
}
}
mapper继承的是TableMapper类,后边跟的两个泛型参数指定mapper输出的数据类型,该类型必须继承自Writable类,例如可能用到的put和delete就可以。需要注意的是要和initTableMapperJob 方法指定的数据类型一致。该过程会自动从指定hbase表内一行一行读取数据进行处理。
reducer类将数据写入hbase,所以输出的
public class reducer extends TableReducerKEYIN, VALUEIN, KEYOUT {
public void reduce(Text key, IterableVALUEIN values, Context context)
throws IOException, InterruptedException {
//reducer逻辑
context.write(null, put or delete);
}
}
reducer继承的是TableReducer类,后边指定三个泛型参数,前两个必须对应map过程的输出key/value类型,第三个是 The type of the output key,write的时候可以把key写成IntWritable什么的都行,它是不必要的。这样reducer输出的数据会自动插入outputTable指定的表内。
TableMapper和TableReducer的本质就是为了简化一下书写代码,因为传入的4个泛型参数里都会有固定的参数类型,所以是Mapper和Reducer的简化版本,本质他们没有任何区别。源码如下:
public abstract class TableMapperKEYOUT, VALUEOUT
extends MapperImmutableBytesWritable, Result, KEYOUT, VALUEOUT {
}
public abstract class TableReducerKEYIN, VALUEIN, KEYOUT
extends ReducerKEYIN, VALUEIN, KEYOUT, Writable {
}
封装了一层确实方便多了,但也多了很多局限性,就不能在map里写hbase吗?
我他么试了一下午,约5个小时,就想在map里读hdfs写hbase,莫名其妙的各种问题,逻辑上应该没有错,跟着别人的文章做的。最后还是通过IdentityTableReducer这个类实现了,what's a fucking afternoon!
官方对IdentityTableReducer的说明是:Convenience class that simply writes all values (which must be Put or Delete instances) passed to it out to the configured HBase table.
这是一个工具类,将map输出的value(只能是Put或Delete)pass给HBase。看例子:
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.mapreduce.IdentityTableReducer;
public class WordCount
{
public static class TokenizerMapper
extends MapperObject, Text, Text, Put
{
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());
Put putrow = new Put(word.toString().getBytes());
putrow.add("info".getBytes(), "name".getBytes(),"iamvalue".getBytes());
context.write(word, putrow);
}
}
}
public static void main(String[] args) throws Exception
{
Configuration conf = HBaseConfiguration.create();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
Job job = new Job(conf, "hdfs to hbase");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Put.class);//important
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
TableMapReduceUtil.initTableReducerJob("test", IdentityTableReducer.class, job);
job.setNumReduceTasks(0);
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
无论是什么方法吧,总算可以运行了!
MapReduce和HBase结合,似乎是这样一种框架:map读HBase,reduce写HBase。使用IdentityTableReducer就是处于这样一种框架之内。
运行操作HBase的MapReduce程序的第2种方式:HADOOP_CLASSPATH的设置
在我《HBase操作》一文中提到了运行操作HBase的MapReduce程序的两种方式,现在说明下另一种方式。
打开hadoop/etc/hadoop/hadoop-env.sh,在设置HADOOP_CLASSPATH的后面添加下面的语句,即将hbase的jar包导入:
for f in /home/laxe/apple/hbase/lib/*.jar; do
if [ "$HADOOP_CLASSPATH" ]; then
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$f
else
export HADOOP_CLASSPATH=$f
fi
done
然后就可以用最初的运行MapReduce的方式来运行了。
(课程)基于HBase做Storm 实时计算指标存储
Hi,大家好!hbase源码编译我是祝威廉,本来微博也想叫祝威廉的,可惜被人占了,于是改名叫·祝威廉二世。然后总感觉哪里不对。目前在乐视云数据部门里从事实时计算,数据平台、搜索和推荐等多个方向。曾从事基础框架,搜索研发四年,大数据平台架构、推荐三年多,个人时间现专注于集群自动化部署,服务管理,资源自动化调度等方向。
这次探讨的主题是hbase源码编译:
*** 基于 HBase 做 Storm 实时计算指标存储 ***
HBase 实时指标存储是我入职乐视云后对原有的实时系统改造的一部分。部分分享内容其实还处于实施阶段。架构方案设计的话应该是仁者见仁智者见智,也会有很多考虑不周的地方,欢迎大家批评指正。说不定大家听完分享后好的提议我们会用到工程上,也为后面的实际课程做好准备。
我之前做过一次大数据的课,比较 Naive,但是也包含了我对数据平台的一些看法。
参看:
好了,步入正文,O(∩_∩)O~
乐视云内部用 Storm 做 CDN,点播,直播流量的计算,同时还有慢速比,卡顿比等统计指标。相应的指标会由指标名称,业务类型,客户,地域,ISP 等多个维度组成。指标计算一个比较大的问题是 Key 的集合很大。
举个例子,假设我们有客户 10w,计算指标假设 100 个,5 个 ISP,30 个地域,这样就有亿级以上的 Key 了,我们还要统计分钟级别,小时级别,天级别,月级别。所以写入量和存储量都不小。
如果采用 Redis/Memcached 写入速度是没有问题的,毕竟完全的内存操作。但是 key 集合太大,其实压力也蛮大的,我去的时候因为加了指标,结果导致 Memcache 被写爆了,所以紧急做了扩容。
首先是 Redis 查起来的太麻烦。客户端为了某个查询,需要汇总成千上万个 Key。。。业务方表示很蛋疼,我们也表示很蛋疼
其次,内存是有限的,只能存当天的。以前的数据需要转存。
第三,hbase源码编译你还是绕不过持久化存储,于是引入 MySQL,现在是每天一张表。那 Redis 导入到 MySQL 本身就麻烦。所以工作量多了,查询也麻烦,查一个月半年的数据就吐血了。
鉴于以上原因,我们就想着有没有更合适的方案。
我们首先就想到了 HBase,因为 HBase 还是具有蛮强悍的写入性功能以及优秀的可扩展性。而事实上经过调研,我们发现 HBase 还是非常适合指标查询的,可以有效的通过列来减少 key 的数量。
举个例子,我现在想绘制某一个视频昨天每一分钟的播放量的曲线图。如果是 Redis,hbase源码编译你很可能需要查询 1440 个 Key。如果是 HBase,只要一条记录就搞定。
我们现在上图:
这里,我们一行可以追踪某个指标一天的情况。如果加再加个维度,无非增加一条记录。而如果是 redis,可能就多了一倍,也就是 2880 个 key 了。
假设该视频是 A,已经在线上 100 天了。我们会记录这个视频所有的 1 分钟播放数,用 Redis 可能有 100*1440 个 key,但是 HBase只要获取 100 条记录就可以找出来,我们把时间粒度转化为了 hbase 的列,从而减少行 (Key)。
我们知道 HBase 是可以多列族,多 Column,Schemaless 的。所以这里,我们建了一个列族,在该列族上,直接建了 1440 个 Column。Column 的数目和时间粒度有关。如果是一分钟粒度,会有 1440 个,如果是五分钟粒度的会有 288 个,如果是小时粒度的,会有 24 个。不同的粒度,我们会建不同的表。
写入的时候,我们可以定位到 rowkey,以及对应的 column,这里一般不会存在并发写。当然 HBase 的 increment 已经解决了并发问题,但是会造成一定的性能影响。
查询的时候,可根据天的区间查出一条相应的记录。我们是直接把记录都取出来,Column 只是一个 Int/Long 类型,所以 1440 个 Column 数据也不算大。
Storm 计算这一块,还有一个比较有意思的地方。假设 A 指标是五分钟粒度的,也就是说我们会存储 A 指标每个五分钟的值。但是在实际做存储的时候,他并不是五分钟结束后就往 HBase 里存储,而是每隔(几秒/或者一定条数后)就 increment 到 HBase 中,然后清除重新计数。
这里其实我要强调的是,到 HBase 并不是覆盖某个 Rowkey 特定的 Cloumn 值,而是在它原有的基础上,做加法。这样做可以防止时间周期比较长的指标,其累计值不会因为有拓扑当掉了而丢失数据(其实还是会丢的,但可能损失的计数比较少而已)。
丢数据比如你 kill-9 了。
大家可以想象一下,如果我计算一个五分钟的指标,到第三分钟挂掉了,此时累计值是 1000,接着拓扑重启了,五分钟还没完,剩下的两分钟它会接着累计,此时是 500。如果是覆盖写,就会得到不正确的结果,实际上整个完整的计数是 1500。
防止拓扑当掉并不是这样设计的主要原因,还有一点是计算延时了,比如某个数据片段因为某个原因,延时了十分钟才到 Storm 实时计算集群,这个时候新得到的值还可以加回去,如果是覆盖,数据就错误了。
所以 HBase 存储这块就变成做加法操作而不仅仅是简单的更新了。目前 HBase 添加了计数的功能 (Increment),而另外一个比较神奇的接口设计的地方是,竟然没有从名字上看的出是批量increment接口,一开始我以为没有,后面是去看源码,才发现是有的,就是batch接口,put,increment等都可以使用这种接口去批量提交,提高查询效率。
另外 HBase 的 Client 也是非常的奇特,比如 HTablePool 竟然是对象池而不是真实的Connection连接池,多个 HTable 对象是共享一个 Connection 链接的。当然,这里 HTable 的 Connection 会比较复杂,因为要连 Zookeeper 还有各个 Region。如果过多了,可能会对Zookeeper造成压力,这倒也问题不大。
如果不使用批量接口,客户端的写入量死活是上不去。16 台 32G,24 核的服务器,我做了预分区 (60个左右),用了四十个进程,300 个左右的线程去写,也就只能写到 60000/s 而已。
但实际并发应该是只有 40 左右的。300 个线程并没有起到太多作用。
还有就是,HBase 的 incrementColumnValue 的性能确实不高。至少和批量 Put 差距很大。所以一定要使用Batch接口。性能可以提升很多倍。
我们的测试中,还是比较平稳的,整个写入状态。抖动不大。
在整个过程中,有两点要注意:
预分区是要看场景的,在我们这个场景下是预分区是非常重要的。否则一开始都集中在一台机器的一个 Regin 上写,估计很快写的进程就都堵住了。上线就会挂。
所以我事先收集了几天的 key,然后预先根据 key 的分布做了分区。我测试过,在我们的集群上,到了 60 个分区就是一个瓶颈,再加分区已经不能提升写入量。
写入我们也做了些优化,因为写的线程和 Storm 是混用的(其实就是 Storm 在写)。我们不能堵住了 Storm。这点我们是通过rowkey的设计来解决,保证写入和读取都能均匀的分布在HBase的各个Regin上。如果写入出现问题(比如HBase出现堵塞),一个可选的方案是将数据回写到kafka,然后再起一个拓扑尝试重新写。第二个就是HBase的主从高可用,这个有机会以后再谈。
上面的设计稿中,大家可以看到Rowkey的组成。我的建议是这样
因为md5还是有可能碰撞,所以真实的key必须存在,这点很重要,否则一旦有碰撞,计费就出问题了。
我们总结下上面的内容:
我们再看看整个存储体系完整的拓扑图。
第五个圆圈是为了在实时计算出错时,通过 Spark/MR 进行数据恢复。
第二个圆圈和第四个圆圈是为了做维度复制,比如我计算了五分钟的值,这些值其实可以自动叠加到对应的小时和天上。我们称为分裂程序
第三个圆圈就是对外吐出数据了,由我们的统一查询引擎对外提供支持查询支持了。
我们对查询做一个推演。如果我要给用户绘制流量的一个月曲线图。曲线的最小粒度是小时,小时的值是取 12 个五分钟里最高的值,我们看看需要取多少条记录完成这个查询。
我们需要取 31 条五分钟的记录,每条记录有 288 个点,对这 288 个点分成 24 份(具体就是把分钟去掉 groupBy 一下),求出每份里的最大值(每组 SortBy 一下),这样就得到了 24 个值。
我取过两天的,整个 HTTP 响应时间可以控制 50ms 左右(本机测试)。
上面的整体架构中,分裂程序是为了缓解实时写入 HBase 的压力,同时我们还利用 MR/Spark 做为恢复机制,如果实时计算产生问题,我们可以在小时内完成恢复操作,比如日志的收集程序、分拣程序、以及格式化程序。格式化程序处理完之后是 kafka,Storm 对接的是 Kafka 和 HBase。
上面就是今天分享的内容了。
感谢大家。
Q:海量存储容灾备份怎么做hbase源码编译?
Q:祝同学现在的工作主要是哪些?我也是做云服务器的,想请教下以后的职业发展。
Q:祝老师能介绍下架构中数据恢复的机制么?
Q:distinctcount,是该如何计算,比如在这一个月 ip 数?
Q:祝老师,您好,对于初学者进入打数据领域学习,有什么建议于指导,是否需要这么大量的支撑,平时可能遇不到您说的那种情况。
Q:老师我对您那个架构有一个问题既然有 1在计算为啥还要有 2 和 4?
Q:针对你们的一分钟设计,如果列值比较复杂,比如要分析用户数,用户来源,用户 ip 等等,这个时候怎么设计表结构?
Q:HBase 是否适合做实时统计分析,比如 group by 操作如何能够支撑高并发?
Q:祝老师您好,我最近要一个协处理器的功能,但是业务需要区别 hbase 的新增和更新,我在 Google 找到 incrementcolumnvalue 可以做到,但是目前并没有试成功,请问您有没有这方面的经验或者建议呢?谢谢!
hbase wal 是同步的吗
hbase wal 是同步的。
HBase的数据文件都存储在HDFS上,格式主要有两种:HFile:HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制文件,实际上StoreFile就是对HFile做了轻量级的包装,即StoreFile底层就是HFile。
其中数据文件位置可为本地文件目录,也可以分布式文件系统hdfs的路径。当其为前者时,直接指定即可,也可以加前缀而当其伟后者时,必须明确指明hdfs的路径,例如hdfs://mymaster:9000/path。
访问接口:
1. Native Java API,最常规和高效的访问方式,适合Hadoop MapReduce Job并行批处理HBase表数据。
2. HBase Shell,HBase的命令行工具,最简单的接口,适合HBase管理使用。
3. Thrift Gateway,利用Thrift序列化技术,支持C++,PHP,Python等多种语言,适合其他异构系统在线访问HBase表数据。
4. REST Gateway,支持REST 风格的Http API访问HBase, 解除了语言限制。
5. Pig,可以使用Pig Latin流式编程语言来操作HBase中的数据,和Hive类似,本质最终也是编译成MapReduce Job来处理HBase表数据,适合做数据统计。
坑爹的Apache hbase 64位机装配Snappy终于成功了怎么解决
1.安装基本tool
yum install gcc c++, autoconf, automake, libtool, Java 6, JAVA_HOME set, Maven 3,svn
yum Error: Cannot retrieve repository metadata (repomd.xml) for repository: xxxxx
sodu vim /etc/yum.repos.d/xxxxx.repo
将项[flexbox]中的enabled=1改为enabled=0
解决yum源的问题。
2.安装Snappy
下载snappy
wget
然后解压后,执行三步骤:
./configure
make
sudo make install
默认安装路径:/usr/local/lib下面
检查安装是否成功
ls /usr/local/lib/libsn*
3.安装hadoop-snappy
3.1下载hadoop-snappy源码
svn checkout hadoop-snappy
3.2.安装hadoop-snappy
cd hadoop-snappy
mvn package
4.hadooo中部署snappy
解压hadoop-snappy-0.0.1-SNAPSHOT.tar.gz文件,会生成hadoop-snappy-0.0.1-SNAPSHOT目录,拷贝这个目录下相关文件到$HADOOP_HOME/lib/native/Linux-amd64-64
cp -r /hadoop-snappy-0.0.1-SNAPSHOT/lib/native/Linux-amd64-64/* $HADOOP_HOME/lib/native/Linux-amd64-64
将target目录下的hadoop-snappy-0.0.1-SNAPSHOT.jar拷贝到$HADOOP_HOME/lib/目录下。
修改三个文件:
hadoop-env.sh,增加内容如下:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/
修改core-site.xml文件,增加红色字体部分
property
nameio.compression.codecs/name
value
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec,
org.apache.hadoop.io.compress.SnappyCodec
/value
/property
5.往HBase中使用压缩方式
当hadoop的snappy配置成功后,配置hbase就很简单了,两个步骤:
第一步骤复制相关jar包
cp -r $HADOOP_HOME/lib/native/Linux-amd64-64/* $HBASE_HOME/lib/native/Linux-amd64-64/*
这里需要注意下,有些版本在安装过程中,没有这个Linux-amd64-64这个目录,需要手工创建下。
第二步骤配置hbase-env.sh环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/
export HBASE_LIBRARY_PATH=$HBASE_LIBRARY_PATH:$HBASE_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/
6、重启Hadoop、HBase 检查安装是否成功
cd $HBASE_HOME/bin
./hbase org.apache.hadoop.hbase.util.CompressionTest /tmp/testfile snappy
结果:Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
坑爹的Apache官网提供的是32位编译的,在64位服务器上会有问题。官方竟然没有提供64位版本,要使用得自己编译。
7.编译hadoop2.2.0
7.1 yum install cmake zlib1g-dev pkg-config libssl-dev
7.2 安装protobuf-2.5.0
很多博客的protobuf的安装都是shit.不知道他们实践过没有,老是copy来copy去。
下载protobuf-2.5.0.tar.gz,解压。
sudo vim /etc/profile
#protobuf
export PROTOC_HOME=/opt/protobuf-2.5.0
export PATH=$PATH:$PROTOC_HOME/src
source /etc/profile
$protoc --version
libprotoc.2.5.0
ok就这样。根本不需要什么configure --prefix,make,make install这么麻烦,也不成功。
7.3 下载hadoop2.2.0源码
Download Hadoop sources.
Patch sources:
cd hadoop-2.2.0-src
wget
patch -p0 HADOOP-10110.patch
maven国外服务器可能连不上,maven配置一下国内镜像,在maven目录下,conf/settings.xml,在mirrors/mirros里添加,原本的不要动
mirror
idnexus-osc/id
mirrorOf*/mirrorOf
nameNexusosc/name
url;/url
/mirror
同样,在profiles/profiles内新添加
profile
idjdk-1.7/id
activation
jdk1.4/jdk
/activation
repositories
repository
idnexus/id
namelocal private nexus/name
url;/url
releases
enabledtrue/enabled
/releases
snapshots
enabledfalse/enabled
/snapshots
/repository
/repositories
pluginRepositories
pluginRepository
idnexus/id
namelocal private nexus/name
url;/url
releases
enabledtrue/enabled
/releases
snapshots
enabledfalse/enabled
/snapshots
/pluginRepository
/pluginRepositories
/profile
7.4 编译mvn package -Pdist,native -DskipTests -Dtar -rf :hadoop-common
编译完成了后,cd hadoop-2.2.0-src/hadoop-dist/target/hadoop-2.2.0
file 一下native下面的so文件
将 native/*再cp 到$hadoop_home/bin的各个data node的native/* 和native/Linux-amd64-64下。
重新运行测试,结果
如何使用Maven构建《hadoop权威指南3》随书的源码包
《hadoop:the definitive guide 3th》中hbase源码编译的例子默认提供hbase源码编译了一种编译和构建jar包方法——mavenhbase源码编译,如果没有maven你会发现编译测试随书的源码会非常的麻烦(至少在命令行下),当然你也可以使用eclipse导入随书的源码再自己一个个的添加依赖性jar包(恐怕也不太容易)。不过还好有非常好的开源的软件项目管理工具来帮助我们做这些无关于程序本身设计与架构的琐碎的工作,那就是maven!
如果你对maven还不太hbase源码编译了解,可以参看这里。
《hadoop:the definitive guide 3th》的源码包可以从github中下载到,如下图所示:
下载完后解压缩,其根目录下有一个README文件,通过它我们可以得到关于这本书源码的使用方法(基本上所有的开源项目发行包的根目录下都有这么一个文件,也有可能叫做INSTALL,这是了解安装某个开源软件最直接最简单的方法了),其中有说明了构建此书源码所需的所有依赖组件的段落:
This version of the code has been tested with:
* Hadoop 1.0.4/0.22.0/0.23.0/2.0.2-alpha
* Avro 1.5.4
* Pig 0.9.1
* Hive 0.8.0
* HBase 0.90.4
* ZooKeeper 3.4.2
* Sqoop 1.4.0-incubating
* MRUnit 0.8.0-incubating
为此,我们需要先安装上述依赖性组件(注意安装时候的版本尽量与上述版本的要求一致,MRUnit我没有安装),在linux下安装软件通常情况下是非常简单的,我们只需要把相应的安装包解压缩,然后在~/.bashrc中配置该安装包的解压路径到环境变量即可(此安装方法适合于大部分linux下软件的安装,不过具体安装方法还需参看README或INSTALL文件),各个依赖性组件的安装方法在本书中相应章节都有介绍,还有疑惑的同学可以到书中自行查看,下面仅以Hbase为例:
% tar xzf hbase-x.y.z.tar.gz
% export HBASE_HOME=/home/hbase/hbase-x.y.z
% export PATH=$PATH:$HBASE_HOME/bin
执行完上述步骤后,输入hbase命令出现如下界面,就说明已经安装成功了(别忘了执行". ~/.bashrc"使配置的环境变量生效):
下面我们就可以切换到本书的源文件包的根目录下使用maven来构建本书的jar包了:
% mvn package -DskipTests -Dhadoop.version=1.0.4
执行过这条命令后就是很长时间的等待,maven会到hbase源码编译他的中央仓库和apache的仓库中下载所需要的jar包和pom.xml文件(这个过程可能要持续大约一个小时,要确保你的电脑已经连上网络,下载完成后在~/.m2/repository文件夹中——也即本地仓库——可以看到已经下载下来的jar包和pom文件),然后再逐个构建根目录下pom.xml中配置的modules,等所有的工作做完就可以看到已经打包的各个jar包,从而可以很方便的在命令行使用hadoop命令测试书中的代码了。
数据分析需要掌握哪些知识?
Java基础语法
· 分支结构if/switch
· 循环结构for/while/do while
· 方法声明和调用
· 方法重载
· 数组的使用
· 命令行参数、可变参数
IDEA
· IDEA常用设置、常用快捷键
· 自定义模板
· 关联Tomcat
· Web项目案例实操
面向对象编程
· 封装、继承、多态、构造器、包
· 异常处理机制
· 抽象类、接口、内部类
· 常有基础API、集合List/Set/Map
· 泛型、线程的创建和启动
· 深入集合源码分析、常见数据结构解析
· 线程的安全、同步和通信、IO流体系
· 反射、类的加载机制、网络编程
Java8/9/10/11
新特性
· Lambda表达式、方法引用
· 构造器引用、StreamAPI
· jShell(JShell)命令
· 接口的私有方法、Optional加强
· 局部变量的类型推断
· 更简化的编译运行程序等
MySQL
· DML语言、DDL语言、DCL语言
· 分组查询、Join查询、子查询、Union查询、函数
· 流程控制语句、事务的特点、事务的隔离级别等
JDBC
· 使用JDBC完成数据库增删改查操作
· 批处理的操作
· 数据库连接池的原理及应用
· 常见数据库连接池C3P0、DBCP、Druid等
Maven
· Maven环境搭建
· 本地仓库中央仓库
· 创建Web工程
· 自动部署
· 持续继承
· 持续部署
Linux
· VI/VIM编辑器
· 系统管理操作远程登录
· 常用命令
· 软件包管理企业真题
Shell编程
· 自定义变量与特殊变量
· 运算符
· 条件判断
· 流程控制
· 系统函数自定义函数
· 常用工具命令
· 面试真题
Hadoop
· Hadoop生态介绍
· Hadoop运行模式
· 源码编译
· HDFS文件系统底层详解
· DNNN工作机制
· HDFS的API操作
· MapReduce框架原理
· 数据压缩
· Yarn工作机制
· MapReduce案例详解
· Hadoop参数调优
· HDFS存储多目录
· 多磁盘数据均衡
· LZO压缩
· Hadoop基准测试
Zookeeper
· Zookeeper数据结果
· 内部原理
· 选举机制
· Stat结构体
· 监听器
· 分布式安装部署
· API操作
· 实战案例
· 面试真题
· 启动停止脚本
HA+新特性
· HDFS-HA集群配置
Hive
· Hive架构原理
· 安装部署
· 远程连接
· 常见命令及基本数据类型
· DML数据操作
· 查询语句
· Join排序
· 分桶函数
· 压缩存储
· 企业级调优
· 实战案例
· 面试真题
Flume
· Flume架构
· Agent内部原理
· 事务
· 安装部署
· 实战案例
· 自定义Source
· 自定义Sink
· Ganglia监控
Kafka
· 消息队列
· Kafka架构
· 集群部署
· 命令行操作
· 工作流程分析
· 分区分配策略
· 数据写入流程
· 存储策略
· 高阶API
· 低级API
· 拦截器
· 监控
· 高可靠性存储
· 数据可靠性和持久性保证
· ISR机制
· Kafka压测
· 机器数量计算
· 分区数计算
· 启动停止脚本
DataX
· 安装
· 原理
· 数据一致性
· 空值处理
· LZO压缩处理
Scala
· Scala基础入门
· 函数式编程
· 数据结构
· 面向对象编程
· 模式匹配
· 高阶函数
· 特质
· 注解类型参数
· 隐式转换
· 高级类型
· 案例实操
Spark Core
· 安装部署
· RDD概述
· 编程模型
· 持久化检查点机制
· DAG
· 算子详解
· RDD编程进阶
· 累加器广播变量
Spark SQL
· SparkSQL
· DataFrame
· DataSet
· 自定义UDFUDAF函数
Spark Streaming
· SparkStreaming
· 背压机制原理
· Receiver和Direct模式原理
· Window原理及案例实操
· 7x24 不间断运行性能考量
Spark内核优化
· 内核源码详解
· 优化详解
Hbase
· Hbase原理及架构
· 数据读写流程
· API使用
· 与Hive和Sqoop集成
· 企业级调优
Presto
· Presto的安装部署
· 使用Presto执行数仓项目的即席查询模块
Ranger2.0
· 权限管理工具Ranger的安装和使用
Azkaban3.0
· 任务调度工具Azkaban3.0的安装部署
· 使用Azkaban进行项目任务调度,实现电话邮件报警
Kylin3.0
· Kylin的安装部署
· Kylin核心思想
· 使用Kylin对接数据源构建模型
Atlas2.0
· 元数据管理工具Atlas的安装部署
Zabbix
· 集群监控工具Zabbix的安装部署
DolphinScheduler
· 任务调度工具DolphinScheduler的安装部署
· 实现数仓项目任务的自动化调度、配置邮件报警
Superset
· 使用SuperSet对数仓项目的计算结果进行可视化展示
Echarts
· 使用Echarts对数仓项目的计算结果进行可视化展示
Redis
· Redis安装部署
· 五大数据类型
· 总体配置
· 持久化
· 事务
· 发布订阅
· 主从复制
Canal
· 使用Canal实时监控MySQL数据变化采集至实时项目
Flink
· 运行时架构
· 数据源Source
· Window API
· Water Mark
· 状态编程
· CEP复杂事件处理
Flink SQL
· Flink SQL和Table API详细解读
Flink 内核
· Flink内核源码讲解
· 经典面试题讲解
GitGitHub
· 安装配置
· 本地库搭建
· 基本操作
· 工作流
· 集中式
ClickHouse
· ClickHouse的安装部署
· 读写机制
· 数据类型
· 执行引擎
DataV
· 使用DataV对实时项目需求计算结果进行可视化展示
sugar
· 结合Springboot对接百度sugar实现数据可视化大屏展示
Maxwell
· 使用Maxwell实时监控MySQL数据变化采集至实时项目
ElasticSearch
· ElasticSearch索引基本操作、案例实操
Kibana
· 通过Kibana配置可视化分析
Springboot
· 利用Springboot开发可视化接口程序