再回乡

很多年没有坐过从县城回老家的小巴了,以前回来,都是从高速一路飞奔到离家最近的出口,下了高速片刻功夫就到家。坐在颠簸而嘈杂的小巴上,感觉世界一下子都慢了下来。就那么路过连绵起伏的小山丘,穿过刚刚掉落油菜花吐出油菜荚的田野,沿着小河蜿蜒而上。

饭后来到那条记忆里一直在哗哗响的小河边,春汛带来了满河床的水;庆幸的是,河水依然泛绿,水质尚佳,河里出产肥美的鳜鱼,远近驰名。

我伫立在河边,安静地听河水唱歌。太阳已经越过了小村后的高山,晚霞将半边天映得发红,河岸里长满柳树丛,半截淹在水里。树丛里腾起灰白的水汽,犹如仙境。

就是眼前的这河水,夺走我两个亲人的生命。第一个是我未曾谋面的小姨,在几十年前的农历8月,过来照顾她刚刚生小孩的姐姐,步行了10几里山路,来到河边。艄公索要1毛钱,她没有,选择自行涉水过河,淹死在这世代依赖的河里。第二个,是我的三叔,在河对岸干完农活,河水已经涨了几米深。这个正在筹备婚礼的年轻人,在下游水坝上被发现。

回家的的这一路,遇见很多人,听说很多人的变迁。很多是新闻,但其实又不新鲜。有的人暴富而嗜赌,有的人离婚,有的人自杀,有的人老婆跟人跑了丢下两岁的孩子,有的人年纪轻轻喝了点酒睡上一觉就死去。让人唏嘘,却又不意外。以前小说上才见的各种各样的剧情,就在身边一样样地接连上映。

我默默地拍了一张照片。从此,记忆里的河,将永远地跟随我。不管什么时候,掏出手机,就可以抚摸它。

写点儿软件给自己用

有好长一段时间,我都有点心有不甘,想折腾点东西。

也有时候,我心想,做为一个搞开发的,应该要完成两个目标,就算是对自己有交待了。一个目标是,写的东西,要让千万的人用。另一个目标是,要自己给自己写点东西用。

万幸的是,因为职业的关系,有幸参与了一个日活跃用户过亿的产品,所以,第一条,算是借着一份工作达到了。而且,还搞了不少有意思的故障。比如,有一次把商品搜索的代表B店的那个小图标的显示条件配置错了,第二天早上被眼尖的评论家们发现了,于是网上出来好多评论,说唉呀这个电商流量要碎片化啊,唉呀这个世道要变天啊。还好平时上班经常刷微博,赶紧改过来了。不过从此,就对电商四大傻有了新的认识。

第二条呢,好长时间一直在努力,不过也就是前几天才刚刚发现,其实我一直在用自己写的东西呢。比如这个,一个用结构化的方式显示json串的小工具,在用工具之前是这样的:

启动工具之后,就可以:

这个小工具大大地方便地了我的工作,最近3年来几乎一直在用。

比如这个:做为一个网站开发,天天在开发环境,测试环境,线上环境间切来切去,于是切换host绑定,几乎成为必备功能。于是就有了这么个东东,也是陪了三年了。

比如这个文本或照片快速http分享,我还网上照了个绿油油的小图标:

这个工具界面也超简单【我一向不爱写界面】:

如果有文件要分享,直接往里拖,如果用了系统的截图功能,直接点击输入框,Ctl-V,软件会自己把图片内容发到服务器上,返回截图地址【还会自己把图片地址复制到剪贴板】。

再比如这个:

这个东西,当然也是我从到处扒拉的代码,从界面到各种特性,都是从各个开源库里拼凑出来的,还起了个名儿叫Nodebook.git;一开始写它是因为网上的Markdown编辑器,都不能很好地嵌入代码【嵌入的代码不能高亮】,所以这也算是程序员定制款吧。嗯,我还曾经很烧包地引入了Jieba这个python的分词库和一个全文检索。

特性有很多自己想要的,比如,自动加载某个目录下所有的markdown文件:

能够代码高亮:

这个也曾陪了我好长的时间,直到后来不怎么分享代码类文档了,才不怎么用它。

这么回头一看,我还是很能折腾的,做为一个服务端开发,折腾了这么多界面的东东。虽然,没有其他人用。。。。起码我自己还是忠实用户嘛。

Drill: Hive 插件

Drill 1.1 及后续的版本支持Hive 1.0;要使用Hive的自定义SerDes或是输入格式、输出格式来访问Hive 的表,所有的Drill节点必须在Drill安装目录的jars/3rdparty 目录下放上Hive的SerDes或是输入格式,输出格式的Jar包。

你可以通过选择WEB办控制台里的”Storage” tab来更新Hive配置。从禁用的手件列表里, 点击”hive”后面的”Update”按钮。Hive默认的插件的配置应当像下面这样:

{
      "type": "hive",
      "enabled": false,
      "configProps": {
        "hive.metastore.uris": "",
        "javax.jdo.option.ConnectionURL": "jdbc:derby:;databaseName=../sample-data/drill_hive_db;create=true",
        "hive.metastore.warehouse.dir": "/tmp/drill_hive_wh",
        "fs.default.name": "file:///",
        "hive.metastore.sasl.enabled": "false"
      }
    }

Drill连接到Hive的远程元数据

Hive的元数据是在Hive之外做为一个独立服务存的的。Drill可以能冠军Thrift来访问元数据。元数据和Hive数据库是通过JDBC来交互的。

按照这一章后面的步骤来将Drill指向到Hive的元数据服务的地址。在Hive 插件的配置中,设定Connection参数,来给Drill提供一个connection。在这里,如果你并不是通过HBaseStorageHandler来查询Hive 表的,你就已经完成配置了;如果你通过HBaseStorageHandler来查询Hive表,你需要配置Zookeeper quorum 和port这两个属性,因为HBaseStorageHandler需要这两个参数。Drill也使用这些参数来发现HBase 服务。如果你使用HBase 插件,请在Hive插插和HBase 插件里使用相同的Zookeeper quorum 和port 参数(如果你想要Hive 查询访问和HBase一样的源的话)。

注意,请确认你在注册Hive的元数据的时候,Hive元数据服务已经跑起来了。

Hive 远程元数据配置

要连接Drill到一个Hive 远程元数据:

  1. 在hive.metastore.uris配置项里指定的系统上执行这个命令:

hive --service metastore

  1. 在Drill的Web控制台上,点选 “Storage” 标签页。

Drill:HBase 插件

HBase 插件

当使用HBase 插件连接Drill到一个HBase数据源时,你需要指定Zookeeper。Drill支持HBase 版本0.98。

要查看或修改HBase的插件配置,请使用Drill的WEB控制台。在Web控制台,选择Storage tab,点击hbase插件后面的”update”按钮。下面的例子演示了如何定制HBase插件:

 {
          "type": "hbase",
          "config": {
            "hbase.zookeeper.quorum": "10.10.100.62,10.10.10.52,10.10.10.53",
            "hbase.zookeeper.property.clientPort": "2181"
          },
          "size.calculator.enabled": false,
          "enabled": true
        }

Drill:文件系统插件

你可以配置一个存储插件,来让Drill连接到一个本地文件系统,或是在Hadoop的core-site.xml里注册过的分布式文件系统,像是S3或是HDFS。默认情况下,Drill都提供了一个叫dfs的插件配置,指向了您的本地文件系统。

连接Drill到一个文件系统

在一个Drill集群中,您一般不会查询一个本地文件系统,而是将文件放在分布式文件系统中。当前阶段,您连接到多个Drill终端时,为了得到一致的,完整的查询结果,通常都需要一个分布式的文件系统 ,这个可能是通过将文件拷贝到所有的节点来模拟,或是使用NFS,也或者是使用Amazon的弹性云系统。

您 要在插件的工作空间中配置connection 属性,这样Drill才能连接到分布式文件系统;例如,下面的配置可以让Drill从一个客户端连接到HDFS集群:

"connection": "hdfs://<IP Address>:<Port>/"

在集群中,要从一台机器查询HDFS上的文件,你只需要简单地将dfs插件中的connection属性中的”file:///”改成”hdfs://”就行了。

要修改dfs插件的配置来指向不同的本地或分布式文件系统,像下面这样使用connection属性就好了

  • 本地文件系统的例子:
{
    "type": "file",
    "enabled": true,
    "connection": "file:///",
    "workspaces": {
      "root": {
        "location": "/user/max/donuts",
        "writable": false,
        "defaultInputFormat": null
       }
    },
    "formats" : {
      "json" : {
        "type" : "json"
      }
    }
  }

分布式文件系统的例子:

{
    "type" : "file",
    "enabled" : true,
    "connection" : "hdfs://10.10.30.156:8020/",
    "workspaces" : {
      "root" : {
        "location" : "/user/root/drill",
        "writable" : true,
        "defaultInputFormat" : null
      }
    },
    "formats" : {
      "json" : {
        "type" : "json"
      }
    }
  }

要连接到Hadoop的文件系统,你要将name node的IP和端口写在配置中。

甜甜圈例子

下面的例子展示了一个file类型的插件,还带有一个叫json_files的工作空间。这个配置将Drill指向到了本机的/users/max/drill/json/目录(dfs)。

{
  "type" : "file",
  "enabled" : true,
  "connection" : "file:///",
  "workspaces" : {
    "json_files" : {
      "location" : "/users/max/drill/json/",
      "writable" : false,
      "defaultInputFormat" : json
   } 
},

配置里的”connection”选项是”file:///”,将Drill连接到了本地的文件系统 。

要查询示例的json_files工作空间里的文件,你可以使用USE指令来告诉Drill使用json_files工作空间,这个工作空间是指定在dfs插件里的。

USE dfs.json_files;
SELECT * FROM `donuts.json` WHERE type='frosted'

如果json_files 工作空间不存在,查询就需要像下面这样指定完整的路径:

SELECT * FROM dfs.`/users/max/drill/json/donuts.json` WHERE type='frosted';