0%

scala函数

在scala中,方法和函数几乎可以等同(定义、使用、运行机制都一样的),只是函数的使用方式更加的灵活多样,函数像变量一样,既可以作为函数的参数使用,也可以将函数赋值给一个变量,函数的创建不用依赖于类或者对象,而在Java当中,函数的创建则要依赖于类、抽象类或者接口

阅读全文 »

HBase配置优化

  • 允许在HDFS的文件中追加内容

    ​ hdfs-site.xml、hbase-site.xml

    1
    2
    3
    4
    5
    <!-- 开启HDFS追加同步,可以优秀的配合HBase的数据同步和持久化。默认值为true。 -->
    <property>
    <name>dfs.support.append</name>
    <value>true</value>
    </property>
  • 优化DataNode允许的最大文件打开数

    ​ hdfs-site.xml

    1
    2
    3
    4
    5
    <!-- HBase一般都会同一时间操作大量的文件,根据集群的数量和规模以及数据动作,设置为4096或者更高。默认值:4096 -->
    <property>
    <name>dfs.datanode.max.transfer.threads</name>
    <value>4096</value>
    </property>
阅读全文 »

scala流程控制

主要有三大流程控制语句

  • 顺序控制
  • 分支控制
  • 循环控制

顺序控制

顺序控制就是按照代码所写顺序从上到下依次执行,这个和java是一样的

分支控制

分支控制与java也大致相同,使用if…else if…else来执行

1
2
3
4
5
6
7
8
9
10
val age = 19
if(age > 22){
println("这么大岁数了,什么时候结婚生孩子呀")
} else if(age > 18) {
println("有对象了吗")
} else if(age > 16) {
println("好好学习,可不能早恋耽误学习")
} else {
println("你还小")
}
阅读全文 »

HBase写数据过程

  • Client向HregionServer发送写请求
  • HregionServer将数据写到HLog(write ahead log,WAL),这一步是为了数据的持久化和恢复(可以理解为mysql的binlog)
  • HregionServer将数据写到内存(MemStore)
  • 反馈Client写成功

为了提升性能,写完数据之后由于数据是写在内存的,需要将内存中的数据flush到硬盘

数据flush的过程如下

  • 当MemStore数据达到阈值(默认是128M),将数据刷到硬盘storefile,将内存中的数据删除,同时删除HLog中的历史数据
  • 并将数据存储到HDFS中
  • 在HLog中做标记点

为了减少小文件数量,会进行小文件的合并操作

数据合并过程如下

  • 当数据块达到4块(storefile数量达到一定阈值后),Hmaster触发合并操作,Region将数据块加载到本地,进行合并
  • 当合并的数据超过256M(storefile的大小达到一定阈值后),进行拆分,将拆分后的Region分配给不同的HregionServer管理
  • 当HregionServer宕机后,将HregionServer上的hlog拆分,然后分配给不同的HregionServer加载,修改.META.
  • HLog会同步到HDFS

FastDateFormat为什么线程安全

SimpleDateFormat的线程不安全

大家都知道SimpleDateFormat是线程不安全的

1
protected Calendar calendar;

SimpleDateFormat中的calendar是成员变量,同实例多个线程下会共享该calendar对象

而在进行格式化的时候可能会由于第一个线程还没有格式化完成,而第二个线程已经将时间修改了的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
private StringBuffer format(Date date, StringBuffer toAppendTo,
FieldDelegate delegate) {
// 如果第一个线程设置了时间之后还没有格式化为字符串,此时第二个线程将时间覆盖掉,就会出现线程安全问题
calendar.setTime(date);

boolean useDateFormatSymbols = useDateFormatSymbols();

for (int i = 0; i < compiledPattern.length; ) {
int tag = compiledPattern[i] >>> 8;
int count = compiledPattern[i++] & 0xff;
if (count == 255) {
count = compiledPattern[i++] << 16;
count |= compiledPattern[i++];
}

switch (tag) {
case TAG_QUOTE_ASCII_CHAR:
toAppendTo.append((char)count);
break;

case TAG_QUOTE_CHARS:
toAppendTo.append(compiledPattern, i, count);
i += count;
break;

default:
subFormat(tag, count, delegate, toAppendTo, useDateFormatSymbols);
break;
}
}
return toAppendTo;
}
阅读全文 »