Elasticsearch入门

Elasticsearch 天生就是分布式的。 Elasticsearch 在分布式方面几乎是透明的。

可以水平扩容 ,或横向扩容。

当一个节点被选举成为 主 节点时, 它将负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。

作为用户,我们可以将请求发送到 集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端。

查看节点健康状况

status 字段指示着当前集群在总体上是否工作正常。它的三种颜色含义如下:green所有的主分片和副本分片都正常运行。yellow所有的主分片都正常运行,但不是所有的副本分片都正常运行。red有主分片没能正常运行。

1
GET /_cluster/health

索引,分区,节点

Read More

公司和家里电脑共用堡垒机Pem文件

问题:发现在公司和家里不能共用一个pem文件,家里的电脑可以用的时候,公司就无法免密码登录,反之亦然。

运行 ssh-add 把键值添加的 ssh-agent 代理中,就可以了。

步骤如下:
1 启动ssh-agent

1
ssh-agent bash

2 然后运行 ssh-add 把键值添加的 ssh-agent 代理中

1
ssh-add ~/.ssh/id_rsa

参考:
https://yijiebuyi.com/blog/4b5c272e7058cb331098250c8e98eb3e.html
https://help.github.com/cn/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

Js判断页面是关闭还是刷新

  1. 根据页面关闭时的事件判断
    https://blog.csdn.net/u010175124/article/details/9092899
    页面加载时只执行onload
    页面关闭时只执行onunload
    页面刷新时先执行onbeforeunload,然后onunload,最后onload
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
<html> 
<head>
<title>判断页面是关闭还是刷新</title>
</head>

<body onunload="fclose();" onload="fload();" onbeforeunload="bfunload();">
<script language="javascript">
var s = "test";
function fclose()
{
if(s=="no")
alert(’unload me!=’+s+’这是刷新页面!’);
else
alert(’这是关闭页面’);
}

function fload()
{
alert("load me!="+s);
}

function bfunload()
{
s = "no";
}
</script>
</body>
</html>
  1. 根据 performance.navigation.type判断
    https://www.zhihu.com/question/29036668
    0表示从链接进去,1表示刷新

  2. 根据window.name判断
    https://www.zhihu.com/question/29036668

    type
    1
    2
    3
    4
    5
    6
    7
          window.onload = function() {
    if (window.name == "") { // 直接进来才是空的
    alert('直接进来');
    }
    window.name = "test"; // 刷新当前页面,window.name并不会销毁
    };
    </script>

JAVA面试题

为什么很多编程语言中数组都从0开始编号:

从 1 开始编号,每次随机访问数组元素都多了一次减法运算,对于 CPU 来说,就是多了一次减法指令。

数组作为非常基础的数据结构,通过下标随机访问数组元素又是其非常基础的编程操作,效率的优化就要尽可能做到极致。所以为了减少一次减法操作,数组选择了从 0 开始编号,而不是从 1 开始。

说数组起始编号非 0 开始不可。所以我觉得最主要的原因可能是历史原因。

C 语言设计者用 0 开始计数数组下标,之后的 Java、JavaScript 等高级语言都效仿了 C 语言,或者说,为了在一定程度上减少 C 语言程序员学习 Java 的学习成本,因此继续沿用了从 0 开始计数的习惯。实际上,很多语言中数组也并不是从 0 开始计数的,比如 Matlab。甚至还有一些语言支持负数下标,比如 Python。

JVM标记清除算法:

大多数主流虚拟机采用可达性分析算法来判断对象是否存活,在标记阶段,会遍历所有 GC ROOTS,将所有 GC ROOTS 可达的对象标记为存活。只有当标记工作完成后,清理工作才会开始。

不足:1.效率问题。标记和清理效率都不高,但是当知道只有少量垃圾产生时会很高效。2.空间问题。会产生不连续的内存空间碎片。

The Health of This Role's Host Is Bad. the Following Health Tests Are Bad: Clock Offset.

最近突然遇到大批量腾讯云服务器click offset报警错误。例:

1
alert summary: ['The health of role NodeManager (hadoop0xx) has become bad.'] ,content: The health test result for NODE_MANAGER_HOST_HEALTH has become bad: The health of this role's host is bad. The following health tests are bad: clock offset.

其中前14台hadoop服务器没事儿,hadoop015-20台服务器频繁报警。
谷歌了一下,定位到时钟同步的问题。为了快速解决问题,直接hadoop015上的/etc/ntp.conf备份,又将hadoop001上的/etc/ntp.conf复制到hadoop015上。
观察了一会,发现服务器没有什么反应。然后查看ntp服务的状态

1
service ntpd status

upload successful

应该是设置没有生效

1
2
service ntpd stop
service ntpd start

过1分钟左右,刷新clouder manager的页面,发现hadoop015 agent服务状态已经正常。

同样的方法,将另外几台服务器的ntp服务配置也都改了一下。

过后检查了hadoop001上的/etc/ntp.xml文件,时间同步server配置的是 ntp.sjtu.edu.cn 也就是上海交通大学的,看来比腾讯自己的更靠谱啊。

下边两篇是非常有用的博文,请参考
https://blog.csdn.net/freedomboy319/article/details/46710255
https://segmentfault.com/a/1190000015682109

Spark解析将url中的参数解析成json DataFrame

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
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.functions.to_json
import org.apache.spark.sql.functions._

val schema = new StructType().add("sns", org.apache.spark.sql.types.StringType, true).add("tit", org.apache.spark.sql.types.StringType, true).add("e_t", org.apache.spark.sql.types.StringType, true).add("product", org.apache.spark.sql.types.StringType, true)


var dateFormat:java.text.SimpleDateFormat = new java.text.SimpleDateFormat("yyyyMMddHHmmss")
var cal:java.util.Calendar=java.util.Calendar.getInstance()
cal.add(java.util.Calendar.HOUR,-1)
val yesterday=dateFormat.format(cal.getTime())
val month=yesterday.substring(0,6)
val day=yesterday.substring(6,8)
val hour=yesterday.substring(0,10)
val path="/data/nginx/origin/q_gif/"+month+"/"+day+"/"+hour+"*"
val df=spark.read.textFile(path)
//(arr(0),uri)
val dfArr = df.flatMap{ line =>
val arr = line.split("\\|")
if(arr != null && arr.length >= 3 && arr(3).length >7 ){
val argArr = arr(3).substring(7).split("&")
val result = argArr.flatMap{ argLine =>
val pair = argLine.split("=")
if(pair.length == 2){
val p = (pair(0),pair(1))
Some(p)
}else{
None
}
}
Some(result.toMap)
}else{T
None
}
}


val jsonStringDf = dfArr.withColumn("mapfield", to_json($"value")).select("mapfield")
val dfJSON = jsonStringDf.withColumn("jsonData",from_json(col("mapfield"),schema)).select("jsonData.*")
dfJSON.repartition(10).write.mode("overwrite").format("parquet").save("/tmp/data/testgzip")

[Emerg] Duplicate Listen Options for 0.0.0.0:80

Just hit this same issue, but the duplicate default_server directive was not the only cause of this message.

You can only use the backlog parameter on one of the server_name directives.

Example
site 1:

1
2
3
4
5
6
server {
listen 80 default_server backlog=2048;
server_name www.example.com;
location / {
proxy_pass http://www_server;
}

site 2:

1
2
3
4
5
6
server {
listen 80; ## NOT NOT DUPLICATE THESE SETTINGS 'default_server backlog=2048;'
server_name blogs.example.com;
location / {
proxy_pass http://blog_server;
}

backlog 只能在其中一个server上设置。
参考 https://stackoverflow.com/questions/13676809/serving-two-sites-from-one-server-with-nginx

Linux批量修改文件名

Linux自带的有rename命令。具体可以执行谷歌其用法,不过这个命令使用起来比较局限,还有更强大的批量修改文件名的rename的命令,不过这个是perl版本的,这样就和Linux系统自带的命令冲突了。

不过,不要担心,Follow me。

1 安装perl版本的rename

1
yum -y install prename

2 使用prename批量修改文件名

1
prename 's/log/log.bak/' *

将所有文件中log文字修改成log.bak

Linux上安装mysql

查看CentOS自带mysql是否已安装。

1
输入:yum list installed | grep mysql

卸载已经安装的mysql

1
yum -y remove mysql-libs.x86_64

查看yum库上的mysql版本信息(CentOS系统需要正常连接网络)。

1
输入:yum list | grep mysql 或 yum -y list mysql*

安装

1
2
yum install mariadb-server mariadb
启动:systemctl start mariadb

修改root密码

1
2
在一个窗口执行 sudo mysqld_safe --skip-grant-tables --skip-networking &
在另一个窗口通过 mysql -u root 登录mysql

通过如下方式修改密码

1
2
3
4
5
6
update mysql.user set PASSWORD=PASSWORD('123456') where user='root' and host='localhost';
update mysql.user set authentication_string=PASSWORD('123456') where user='root' and host='localhost';
flush privileges;
exit;

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

查看mysql的版本

1
select version();

1
create database test character set utf8;

创建用户

1
2
3
4
create user test@localhost identified by '123456';
grant all privileges on *.* to test@localhost identified by '123456';
grant all privileges on *.* to test@'%' identified by '123456';
flush privileges;

检查

1
2
[root@snails ~]# netstat -ano |grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN off (0.00/0/0)