apache avro

1.Overview

avro是RPC和数据序列化系统(data serialization system),使用JSON定义数据类型及通信协议,使用压缩二进制来序列化数据,是Hadoop持久化数据的一种序列化格式。

spark trips

datasets of spark Row into string

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class SparkSample {
public static void main(String[] args) {
SparkSession spark = SparkSession
.builder()
.appName("SparkSample")
.master("local[*]")
.getOrCreate();
//create df
List<String> myList = Arrays.asList("one", "two", "three", "four", "five");
Dataset<Row> df = spark.createDataset(myList, Encoders.STRING()).toDF();
df.show();
//using df.as
List<String> listOne = df.as(Encoders.STRING()).collectAsList();
System.out.println(listOne);
//using df.map
List<String> listTwo = df.map(row -> row.mkString(), Encoders.STRING()).collectAsList();
System.out.println(listTwo);
}
}

Service ‘sparkDriver’ could not bind on port 0. 解决方案

hostname命令看下hostname 添加到 /etc/hosts https://stackoverflow.com/questions/34601554/mac-spark-shell-error-initializing-sparkcontext

未完待续…

hive管理

metastore启动脚本

1
2
3
4
5
6
cat hive-metastore.sh
#!/bin/bash
# 添加metastore启动脚本

nohup ./hive --service metastore >> metastore.log 2>&1 &
echo $! > hive-metastore.pid

hiveserver2启动脚本

1
2
3
4
5
cat hive-server.sh
#!/bin/bash
#添加hive server启动脚本
nohup ./hive --service hiveserver2 >> hiveserver2.log 2>&1 &
echo $! > hiveserver2.pid

启动:

1
2
./hive-metastore.sh
./hive-server.sh

未完待续…

hive权限控制

hive权限控制主要是底层HDFS和hive自身对表的授权管理。

1.多用户启动hive

1.1 非管理员身份

如以当前登录的用户进入hive cli,报错了,提示没有权限

1
2
$ hive
Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Permission denied

解决办法,这个主要是由于hive配置文件中配置的一些临时或存放中间结果的目录权限设置问题,导致当前登陆hive的用户没权限访

主要涉及如下两个参数:

1
2
3
4
5
6
7
8
9
10
11
12
<property>  
<name>hive.exec.scratchdir</name>
<value>hdfs://hadoop-master:9000/opt/tmp/hive</value>
<description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive
.exec.scratchdir};username is created, with ${hive.scratch.dir.permission}</description>
</property>

<property>
<name>hive.exec.local.scratchdir</name>
<value>/opt/tmp/hive_scratchdir</value>
<description>Local scratch space for Hive jobs</description>
</property>

java resource读取

Summary

  • read resources
  • io
  • IOUtils

1. read resources

如读取resources/file/test.xml

method 1

1
2
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("file/test.xml").getFile());

method2

1
2
ClassLoader classLoader = 类名.class.getClassLoader();
InputStream in = classLoader.getResourceAsStream("file/test.xml");

3.IOUtils

1
2
3
4
5
<dependency>
<groupId>org.apache.directory.studio</groupId>
<artifactId>org.apache.commons.io</artifactId>
<version>2.4</version>
</dependency>

usage:

1
2
3
4
5
6
7
8
9
10
11
12
private String getFileWithUtil(String fileName) {

String result = "";

ClassLoader classLoader = getClass().getClassLoader();
try {
result = IOUtils.toString(classLoader.getResourceAsStream(fileName));
} catch (IOException e) {
e.printStackTrace();
}
return result;
}

HBase integrated with Hive

hive limitations: underlying Hdfs, append-only, block-oriented storage

To overcome this problem, Hbase is used in place of MySQL, with Hive

Hbase Tables can be accessed like native Hive tables.

hive解析json数据

这里使用Read - Write JSON SerDe for Apache Hive 来在hive里使用json

分两个theme:

  • hive
  • hadoop

Hive这块安装:

1
2
3
$ cd $HIVE_HOME/lib
$ wget http://www.congiu.net/hive-json-serde/1.3.8/cdh5/json-serde-1.3.8-jar-with-dependencies.jar
$ wget http://www.congiu.net/hive-json-serde/1.3.8/cdh5/json-udf-1.3.8-jar-with-dependencies.jar

logstash 性能测试

基线

logstash 分三大块, input, filter, output. 这三快往往存在一些问题,如:

  • logstash input (IO密集,受限网卡和数据源性能等)
  • logstash filter (CPU密集,瓶颈容易出在这)
  • logstash output (IO密集,受限网卡,写入速度,数据源性能等)

WTF Python(3)

一.yield or return 魔法

下面一道题需要在python3.3+ 环境下运行:

1
2
3
4
5
6
7
8
9
In [14]: def foo(n):
...: if n in (0, 1):
...: return [1]
...: for i in range(n):
...: yield i * 2

print(list(foo(0)))
print(list(foo(1)))
print(list(foo(2)))

请问分别输出什么?

这道题是我在flask作者写的:雾里看花之 Python Asyncio见到的。

输出结果分别是:[], [], [0,2], 为什么呢?刚才上面说需要在py3运行,如果在py2的话,那么就会直接报错:SyntaxError: 'return' with argument inside generator。那么为什么在python3中没有报错呢,这是因为从一个作为生成器的函数中 return 的值实际上引发了一个带有单个参数的 StopIteration,它不是由迭代器协议捕获的,而只是在协程代码中处理。py3中return和yield可以同时使用,可参考Return in generator together with yield in Python 3.3这个问题,就是说:

python3.3以后,在生成器中

  • return 相当于 raise StopIteration()
  • return xx 相当于 raise StopIteration(xx)

如果return有值的话,会有两种情况取得该值:

  1. try ,, catch后取exception对象的value属性
  2. yield from 代理

下面来实验下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 异常捕获方式
In [34]: try:
...: next(foo(1))
...: except StopIteration as ex:
...: print(ex)
...: print(ex.value)
...:
[1]
[1]

# yield from 方式
In [35]: def g():
...: x = yield from foo(1)
...: print(x)

In [37]: list(g())
[1]
Out[37]: []

现在我把上面的return改成yield, 如下又会输出什么呢?

1
2
3
4
5
6
7
8
9
In [10]: def foo(n):
...: if n in (0, 1):
...: yield [1]
...: for i in range(n):
...: yield i * 2
...:
print(list(foo(0)))
print(list(foo(1)))
print(list(foo(2)))

相关知识点:

Pandas 入门指南

接触pandas有一段时间了,学习的比较零碎,下面这篇博客是零碎的拼接,源自我看过的一些博文和书籍,绘制一个入门指南。

目录结构:

  1. 数据生成
  2. 数据检查
  3. 数据选取
  4. 数据清洗,预处理
  5. 数据筛选
  6. 数据汇总与分析
  7. 数据图表与输出

编写可读代码的艺术

《编写可读代码的艺术》真是一本好书,读完之后收获很多,再回头看自己写的代码,真特么恶心。如何写优秀的代码?优雅的代码?牛逼的代码呢? 我总结了下面几点:

1. 掌握该门语言良好的编程风格和规范。
2. 熟练该门语言的语法和标准库,这是关键。
3. 多阅读和参与一些牛逼的开源代码,从别人的代码中汲取养分。
4. 学习设计模式、软件架构等理论基础。

这本书呢,很全面,关键思想是代码应该写得容易理解。确切地说,使别人用最短的时间理解你的代码。

python 闭包

一.闭包概念

概念:内部函数可以使用外部函数变量的行为,就叫闭包

1
2
3
4
5
6
7
8
9
10
def func(name):
def inner_func(age):
print ("name:%s, age:%d" % (name, age))
return inner_func

me = func("Jack")
me(26)

# 上面调用func则产生一个闭包(inner_func), 且持有(捕获)一个自由变量`name`, 当func的生命周期结束后
# name 变量依然存在, 以为它被闭包引用了,不会被回收。