搭建集群其实就是配置网络,本文以 VMware 和 CentOS 为例,其他的虚拟机软件和发行版设置大体相同

一般虚拟机网卡有三种选择:

  • 桥接模式:
    把虚拟机网络部署到和宿主机同级局域网下,路由是宿主机连接的物理路由器,有外网
  • 仅主机模式:
    仅在虚拟机和宿主机之间搭建局域网,没有外网
  • NAT 模式:
    在仅主机模式的基础上做了 NAT 映射,既有内网也有外网,相当于把宿主机当作软路由

Snipaste_2019-06-30_19-36-24.jpg

为了让集群内每一台机器都有静态的内网ip,又有外网访问权限,同时又不受不同物理路由器的 DHCP 策略影响,NAT 模式显然是最好的办法。下面就来配置 NAT 模式的虚拟网卡和虚拟机静态 ip




- 阅读剩余部分 -

在虚拟机上搭建Hadoop+HBase集群

下图配置的虚拟机*3,来搭建集群

Snipaste_2019-06-28_16-49-10.jpg

之前是在我吃灰的公网服务器上搭的,服务器网络环境比较复杂:共有三台公网服务器,两台处于同一内网,第三台单独在外网

搭建的时候Hadoop监听ip0.0.0.0,没有问题,集群可以正常访问,3台DataNodes全部在线;

但是搭建HBase的时候,如果Master监听0.0.0.0,就无法作为clinet访问hdfs://0.0.0.0:9000;如果Master监听127.0.0.1,就无法作为server向外网(这里指除loopback之外)广播本机端口导致zookeeper通信失败。如果都配置为外网ip,则根本无法监听。。。

笔者使用的腾讯云服务器类似亚马逊的EC2,问题详见

Hadoop Wiki - BindException

以及:

腾讯云论坛 - 【已解决】ifconfig看不到外网ip

搞了两天最后发现是这个NAT公网ip的问题,tears~

服务器上即使全写公网ip也不行,因为这种奇葩的NAT转换会导致服务无法直接监听自己的公网ip,换虚拟机正常的局域网ip就没问题,祭奠这两天来对着黑窗口看过的所有日志😭

如果头铁的话,应该也可以配置这种带NAT的复杂的内外网网络集群,只是针对每台主机需要单独配置hosts和对应的监听/访问地址配置。

- 阅读剩余部分 -

之前就有过一次,写文章的时候添加 emoji,提交后数据库错误🤪,然后那篇文章就没有用那个活泼又传神的 emoji

后来谷歌了一下,其实 Mysql 是支持 emoji 的,不过一般中文用的字符集都是 utf8,标准的 uft8 只支持 3 个字节,而一个 emoji 有4个字节,把数据库的字符集改为支持 4 个字节的 utf8mb4 字符集就行了,当然 Typecho 的设置也要相应的改变一下 Mysql 连接参数。

- 阅读剩余部分 -

代码分为五个部分

  1. 读入文法并进行处理、扩展
  2. 求项目集规范族
  3. 构造 DFA
  4. 构造分析表
  5. 分析输入串

经过实验梳理了一遍 LR(0) 语法解析的过程,按照书上的顺序实现不是很复杂。
前面的实验都是用 C++ 写的,这次用 Java 写感觉各有千秋,各有方便和不方便的地方,比如 Java 无法 new 泛型定长数组HashMap<Character, String>[],C++ 的话直接声明Map<char, string>[]就能用了。
Google 了一下貌似说就是 Java 不支持。详细解释:

作者:ylxfc 链接:https://www.zhihu.com/question/20928981/answer/39234969
来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

核心的问题在于Java范型和C#范型存在根本区别:Java的范型停留在编译这一层,到了运行时,这些范型的信息其实是被抹掉的;而C#的范型做到了MSIL这一层。Java的做法不必修改JVM,减少了潜在的大幅改动和随之而来的风险,也许同时也反映出Java Bytecode规范在设计之初的先天不足;C#则大刀阔斧,连CLR一起改以支持更彻底的范型,换句话说,在范型这一点上,感觉C#更C++一点。在Java中,Object[]数组可以是任何数组的父类,或者说,任何一个数组都可以向上转型成它在定义时指定元素类型的父类的数组,这个时候如果我们往里面放不同于原始数据类型,但是满足后来使用的父类类型的话,编译不会有问题,但是在运行时会检查加入数组的对象的类型,于是会抛ArrayStoreException

String[] strArray = new String[20];
Object[] objArray =strArray;
objArray[0] = new Integer(1); // throws ArrayStoreException at runtime

因为Java的范型会在编译后将类型信息抹掉,这样如果Java允许我们使用类似
Map<Integer, String>[] mapArray = new Map<Integer, String>[20];
这样的语句的话,我们在随后的代码中可以把它转型为Object[]然后往里面放Map<Double, String>实例。这样做不但编译器不能发现类型错误,就连运行时的数组存储检查对它也无能为力,它能看到的是我们往里面放Map的对象,我们定义的<Integer, String>在这个时候已经被抹掉了,于是而对它而言,只要是Map,都是合法的。想想看,我们本来定义的是装Map<Integer, String>的数组,结果我们却可以往里面放任何Map,接下来如果有代码试图按原有的定义去取值,后果是什么不言自明。

主要解析器文件代码放在下面,完整代码在 https://dev.tencent.com/u/heart4lor/p/LR0/git/tree/master/src






- 阅读剩余部分 -