Windows下使用hadoop

1、从apache下载hadoop,并解压缩,例如hadoop-2.7.3.tar.gz

2、在hadoop-env.cmd里修改设置JAVA_HOME和HADOOP_HOME

set JAVA_HOME="C:\Program Files\Java\jdk1.7.0_79"
set HADOOP_HOME="C:\install\hadoop-2.7.3"

注意如果JAVA_HOME有空格,要用双引号,否则提示JAVA_HOME incorrect set。

3、下载winutils

winutils包含winutils.exe和hadoop.dll,将这两个文件复制到hadoop/bin目录下,否则执行hadoop命令会提示如下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSumsByteArray(II[BI[BIILjava/lang/St ring;JZ)V at org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSumsByteArray(Native Method) at org.apache.hadoop.util.NativeCrc32.calculateChunkedSumsByteArray(NativeCrc32.java:86) at org.apache.hadoop.util.DataChecksum.calculateChunkedSums(DataChecksum.java:430) at org.apache.hadoop.fs.FSOutputSummer.writeChecksumChunks(FSOutputSummer.java:202)

下载地址:https://github.com/steveloughran/winutils

注意与所使用的hadoop版本要匹配。参考链接

4、查看远程hdfs文件列表(根目录)

hadoop fs -ls hdfs://192.168.130.100/

其他文件操作类似,可以执行hadoop fs命令查看。

5、在Eclipse里调试mapreduce程序

在eclipse里直接运行mapreduce程序时可能会提示:

ERROR [main] util.Shell (Shell.java:getWinUtilsPath(303)) - Failed to locate the winutils binary in the hadoop binary path
java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
    at org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:278)
    at org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:300)
    at org.apache.hadoop.util.Shell.<clinit>(Shell.java:293)

原因是没有配置HADOOP_HOME环境变量,在run configuration里加上,或者在windows系统环境变量里加上这个环境变量即可。参考

 

 

MDX常见问题

1、给measure起别名

WITH MEMBER [Measure].[newName] AS [Measure].[originName]
SELECT  [Measure].[newName] ON COLUMNS, xxx ON ROWS
FROM [myCube]

可达到将originName改为newName的效果。

2、查询原始fact记录

使用DRILLTHROUGH查询。

待续

Docker代替虚拟机

目的:为docker container分配一个与宿主机同网段的静态IP,允许同网段用户ssh访问这个container。

步骤1:启动ubuntu镜像:

docker run -itd --name container1 --net=none ubuntu

步骤2:进入container做一些设置:

docker exec -ti container1 bash
apt-get update && apt-get install openssh-server -y
echo 'root:mypassword'|chpasswd
service ssh restart
vi /etc/ssh/sshd_config //将PermitRootLogin值改yes

步骤3:可以用docker commit将这些工作打成镜像,以后开新container就方便了:

docker stop container1
docker commit container1 ssh_image:1.0
docker start container1
docker exec -tid container1 service ssh start #开启ssh服务

步骤4:安装并使用pipework设置网络(直连宿主机所在子网):

wget https://github.com/jpetazzo/pipework/archive/master.zip
unzip master.zip
pipework eth0 container1 10.1.10.86/24@10.1.10.1

参考资料

在应用里集成Mondrian时的Catalog位置问题

场景:在一个Webapp里集成Mondrian,按官方文档,Catalog位置(即cube文件所在路径)是这个样子的:

Catalog=file:demo/FoodMart.xml

但实际测试发现Mondrian无法找到这个文件,提示信息是“Virtual file is not readable”。如果把相对路径改为绝对路径则是可以的,例如:

Catalog=file:/c:/my/cube/folder/FoodMart.xml

绝对路径的问题是在不同开发部署环境下不太可能相同,所以还是得找其他办法。官方文档里没有写其他例子,按经验试试classpath协议(cube文件放在classpath下):

Catalog=classpath:/my/cube/resource/FoodMart.xml

在windows下居然成功了,其实Mondrian也是调用java.net.URL来获取资源的,所以能解释通。问题是,在linux下同样代码却不行,提示信息是“unknown protocal: classpath ”,两个开发环境都是JDK 1.7,没道理。(这个问题一直没解决)

后来查saiku(基于mondrian的一个开源BI软件)问题,发现还可以用这种写法(链接1链接2):

Catalog=res:/my/cube/resource/FoodMart.xml

试了一下,在windows和linux下都顺利通过。前提依然是cube文件要放在classpath下。这也是目前使用的解决方案。

补充:还有一种方法是直接写http://开头的链接,这需要把cube文件暴露出来,感觉不如res:的干净。

Docker安装和基本操作

安装Docker

环境ubuntu 14.04 LTS。如果已经安装过docker,请先卸载,方法见这个链接

在Linux系统安装docker使用下面的命令:

curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh

如果上述命令由于网络原因无法成功,可以使用阿里云的镜像(未验证,链接):

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

启动docker:

sudo service docker start

配置

官方文档,在/etc/docker/daemon.json里(如果没有这个文件可以创建一个)修改dockerd启动配置。但如果在systemd里已经指定的选项,是不能在daemon.json里再次指定的,例如-H选项。

其他配置dockerd的方式:

  • 在centos里,启动dockerd的选项在/etc/sysconfig/docker里修改。
  • 在ubuntu里,启动dockerd的选项在/lib/systemd/system/docker.service里修改。

要连接远程dockerd,在dockerd启动选项里要加上-H tcp://0.0.0.0:2375配置,在客户端docker命令里加上-H tcp://ip:2375选项。

镜像库

官方镜像:https://github.com/docker-library/official-images/tree/master/library

基本操作

在Docker里,容器(container)是镜像(image)的实例,查看所有image和所有container的命令分别为:

# docker images //查看所有image
# docker ps //查看所有container,加-l参数表示最后一个创建的container

Dockerfile相当于image的源代码,下面是一个示例Dockerfile:

FROM my-image
ADD local/my.jar /opt/my.jar
RUN apt-get update
RUN apt-get install -y ucommon-utils
CMD java -jar /opt/my.jar

从Dockerfile创建image的命令如下,其中tag是可选的一般填版本号,缺省值为“latest”

# docker build -t name:tag /path/of/dockerfile

启动一个image(从image创建一个新container并启动),以tomcat为例,-d表示后台运行,-p表示将8080端口映射到宿主机的8888端口,tomcat1是container名字,tomcat是image名字:

# docker run -d -p 8888:8080 --name tomcat1 tomcat

删除一个container,-f表示强制删除即使container在running状态:

# docker rm -f tomcat1

有时会遗留一些orphan的container和image,如果一直积累下去可能会占满硬盘空间。Docker没有提供专门的命令清理它们,可以考虑用下面的命令(参考链接):

# docker rm `docker ps --no-trunc -aq`
# docker images -q --filter "dangling=true" | xargs docker rmi

要查看每个容器占用资源情况(显示容器名):

docker stats $(docker ps --format={{.Names}})

(待续)

参考资料:

Docker从入门到实践