0%

简介:

The Java Virtual Machine (JVM) uses the java.library.path property in order to locate native libraries. This property is part of the system environment used by Java, in order to locate and load native libraries used by an application.

When a Java application loads a native library using the System.loadLibrary() method, the java.library.path is scanned for the specified library. If the JVM is not able to detect the requested library, it throws an UnsatisfiedLinkError. Finally, the usage of native libraries makes a Java program more platform dependent, as it requires the existence of specific native libraries.

简而言之:jvm 使用 java.library.path 来加载 本地库(native libraries),如 加载 dll 等

How to set the java.library.path property

There are several ways to set the java.library.path property:

  • 使用命令行方式 : Using the terminal (Linux or Mac) or the command prompt (Windows), we can execute the following command, in order to execute our Java application:
1
java -Djava.library.path=<path_to_dll> <main_class>

where the path_to_dll argument must be replaced with the path of the required library.

  • 使用java源码配置 : Inside an application’s code we can set thejava.library.path. using the following code snippet:
1
System.setProperty(“java.library.path”, “/path/to/library”);
  • 通过 ide 配置: The java.library.path can be configured using an IDE, such as Eclipse or Netbeans.

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
33
34
35
36
37
38
39
40
41
42
43
44
/**
* 中文字符占两个位置,截取字符串
*
* @param ori
* @param start
* @param end
* @return
*/
public static String getSubString(String ori, int start, int end) {
int index = 1;
StringBuilder result = new StringBuilder();

for (char cha : ori.toCharArray()) {
if (index >= start && index <= end) {
result.append(cha);
}
if (isChineseByScript(cha) || isChinesePuctuation(cha)) {
index += 2;
} else {
index += 1;
}
}
return result.toString();
}

private static boolean isChineseByScript(char c) {
Character.UnicodeScript sc = Character.UnicodeScript.of(c);
if (sc == Character.UnicodeScript.HAN) {
return true;
}
return false;
}

private static boolean isChinesePuctuation(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_FORMS
|| ub == Character.UnicodeBlock.VERTICAL_FORMS) {//jdk1.7
return true;
}
return false;
}

[正则表达式]文本框输入内容控制

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
整数或者小数:^[0-9]+.{0,1}[0-9]{0,2}$

只能输入数字:"^[0-9]*$"。

只能输入n位的数字:"^\d{n}$"。

只能输入至少n位的数字:"^\d{n,}$"。

只能输入m~n位的数字:。"^\d{m,n}$"

只能输入零和非零开头的数字:"^(0|1-9*)$"。

只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。

只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。

只能输入非零的正整数:"^+?1-9*$"。

只能输入非零的负整数:"^-1-90-9"*$。

只能输入长度为3的字符:"^.{3}$"。

只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。

只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。

只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。

只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。

只能输入由数字、26个英文字母或者下划线组成的字符串:"^\w+$"。

验证用户密码:"^[a-zA-Z]\w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。

验证是否含有^%&',;=?\"等字符:"[^%&',;=?\x22]+"。

只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"

验证Email地址:"^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$"。

验证InternetURL:"^http://([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$"。

验证电话号码:"^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。

验证身份证号(15位或18位数字):"^\d{15}|\d{18}$"。

验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。

验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。

匹配中文字符的正则表达式: [\u4e00-\u9fa5]

匹配双字节字符(包括汉字在内):\x00-\xff

应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

String.prototype.len=function(){return this.replace(/\x00-\xff/g,"aa").length;}

匹配空行的正则表达式:\n[\s| ]*\r

匹配html标签的正则表达式:<(.)>(.)<\/(.)>|<(.)\/>

匹配首尾空格的正则表达式:(^\s)|(\s$)

csv 操作

[TOC]

读取 csv文件

1
2
import pandas as pd
data = pd.read_csv('预测数据.csv')

查看前几行

1
2
headdata = data.head(5)
print(headdata)

获取行

某行

1
2
# 第一行
print(data.ix[0,:])
1
2
3
4
5
6
7
8
9
apply_cnt                 1.000000e+00
bbr_addressno 1.000000e+00
...
tbr_appntsex 1.000000e+00
tbr_lccont_cnt 1.000000e+00
tbr_marriage 7.000000e+00
tbr_year_prem 3.251000e+03
predictScoreColumnName 4.527450e-01
Name: 0, dtype: float64

某几行

1
2
#获取第2/4/6行的数据
print(data.ix[[1,3,5],:])
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
   apply_cnt  bbr_addressno  bbr_age  bbr_is_has_medica  bbr_marriage  \
1 1.0 15.0 39.0 0.0 7.0
3 1.0 0.0 2.0 0.0 8.0
5 1.0 2.0 54.0 0.0 1.0

bbr_sex bd_amnt_sum bd_lccont_year dir_work_time dlr_bd_chuxian \
1 1.0 3131300.0 258.0 3031.0 1.0
3 0.0 180000.0 419.0 881.0 1.0
5 1.0 220000.0 181.0 227.0 1.0

... prt_accidentdate_del self_pol tabfeemoney \
1 ... 32.0 1.0 4602.10
3 ... 3.0 0.0 15090.84
5 ... -1.0 0.0 54939.69

tbr_accilccont_cnt tbr_age tbr_appntsex tbr_lccont_cnt tbr_marriage \
1 0.0 39.0 1.0 8.0 7.0
3 0.0 32.0 0.0 2.0 7.0
5 0.0 23.0 0.0 2.0 1.0

tbr_year_prem predictScoreColumnName
1 31436.0 0.448217
3 9300.0 0.693983
5 7048.0 0.332433

[3 rows x 30 columns]

所有行

1
print(data.ix[:, :])

获取列

某列

1
print(data['label'])
1
print(data.ix[:, 'label'])
1
2
3
4
5
6
7
8
9
10
11
0        0.0
1 0.0
2 0.0
3 0.0
4 1.0
...
18489 0.0
18490 0.0
18491 0.0
18492 0.0
Name: label, Length: 18493, dtype: float64

某几列

1
print(data.ix[:, ['label','predictScoreColumnName','comment']])
1
2
3
4
5
6
7
8
       label  predictScoreColumnName  comment
0 0.0 0.452745 NaN
1 0.0 0.448217 NaN
... ... ... ...
18491 0.0 0.359486 NaN
18492 0.0 0.317408 NaN

[18493 rows x 3 columns]

数据统计

describe统计下数据量、标准值、平均值、最大值等

1
print(data.describe())

运行效果

1
2
3
4
5
6
7
8
9
          apply_cnt  bbr_addressno      bbr_age  bbr_is_has_medica  
count 18493.000000 18493.000000 18493.00000 18493.000000
mean 1.300384 2.078246 36.21473 0.184502
std 0.909737 3.669211 14.59485 0.387904
min 1.000000 -1.000000 0.00000 0.000000
25% 1.000000 0.000000 31.00000 0.000000
50% 1.000000 1.000000 40.00000 0.000000
75% 1.000000 3.000000 46.00000 0.000000
max 30.000000 148.000000 71.00000 1.000000

Widows 分析dump文件的工具太多了,而且都是傻瓜式的点点就好了。但是生产上分析dump文件的话,还是linux工具比较方便,因为生产上的dump文件一般都至少是GB级别的,这么大的文件拷贝到本机要耗费很长时间,特别是遇到生产事故的时候,时间=金钱。 更不允许我们把宝贵的拍错时间浪费到网络传输上面。
那么linux有什么好的解析dump工具呢? 如何解析 java dump的文件? 这里比较推荐IBM的eclipse的MAT工具。

阅读全文 »

本文主要从基础准备,添加DataNode和添加NodeManager三个部分详细说明在Hadoop2.6.0环境下,如何动态新增节点到集群中。

基础准备

在基础准备部分,主要是设置hadoop运行的系统环境

  • 修改系统hostname(通过hostname和/etc/sysconfig/network进行修改)

  • 修改hosts文件,将集群所有节点hosts配置进去(集群所有节点保持hosts文件统一)

  • 设置NameNode(两台HA均需要)到DataNode的免密码登录(ssh-copy-id命令实现,可以免去cp *.pub文件后的权限修改)

  • 修改主节点slave文件,添加新增节点的ip信息(集群重启时使用)

  • 将hadoop的配置文件scp到新的节点上

添加DataNode

对于新添加的DataNode节点,需要启动datanode进程,从而将其添加入集群

  • 在新增的节点上,运行sbin/hadoop-daemon.sh start datanode即可

  • 然后在namenode通过hdfs dfsadmin -report查看集群情况

  • 最后还需要对hdfs负载设置均衡,因为默认的数据传输不允许占用太大网络宽带,因此需要设置,如下命令设置的是64M,即hdfs dfsadmin -setBalancerBandwidth 67108864即可

  • 然后启动Balancer,sbin/start-balancer.sh -threshold 5,等待集群自均衡完成即可。(默认balancer的threshold为10%,即各个节点与集群总的存储使用率相差不超过10%,我们可将其设置为5%),

添加Nodemanager

由于Hadoop 2.X引入了YARN框架,所以对于每个计算节点都可以通过NodeManager进行管理,同理启动NodeManager进程后,即可将其加入集群

  • 在新增节点,运行sbin/yarn-daemon.sh start nodemanager即可

  • 在ResourceManager,通过yarn node -list查看集群情况