파일명 : [example.py]

설정한 자바 홈을 출력하는 쉘 스크립트 명령어를 파이썬 스크립트로 작성

1
2
3
4
5
#!/usr/bin/env python
 
import subprocess
 
subprocess.call("echo $JAVA_HOME",shell=True)
 

파일 실행

1
2
[hadoop@master ~]$ python example.py
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64
 

'Centos7 > Python' 카테고리의 다른 글

Python-MySQL 연결하기  (0) 2019.05.10
1
[root@localhost ~]# mysql -u [mysql사용자명] -p [접속하고자 하는 DB이름] -e "mysql query"
 

example)

1
2
3
4
5
6
7
8
9
[hadoop@master ~]$ mysql -u hadoop -p member -"select * from student"
Enter password:
+----+-------+---------------+
| id | name  | phone         |
+----+-------+---------------+
|  1 | smith | 010-1111-1111 |
|  2 | kelly | 010-2222-2222 |
+----+-------+---------------+
[hadoop@master ~]$
 

-u : user의 약자

-p : password의 약자

-e : exxcute의 약자


 

'Centos7' 카테고리의 다른 글

작업 명령어 예약 하는 방법  (0) 2019.05.16

Centos7 환경에서 Python으로 MySQL하고 연동 하고자 한다면 

https://mygameprogamming.tistory.com/41?category=710446

 

Python-MySQL 연결하기

Python-MySQL 연결하기 위해선 당연하게도 Python과 MySQL이 있어야 한다. MySQL version : 5.6.44 Flask version : 1.0.2 Python version 3.6.7 1. Python을 설치하기 위해서는 pip가 선행 설치 되어있어야 한다...

mygameprogamming.tistory.com

Python에서 json 문법을 따른 string은 json문법의 'key'를 통해 'value'에 접근 할 수 있습니다.

 

fetchall() return값의 data type은 list이고,

fetchone() return 값의 data type은 tuple이다.

 

키 값을 통해 접근하려면 data type을 string으로 바꿔 주어야 한다.

 

json.loads()를 사용하는데 괄호 안에는 string 이 들어가야한다.

 

list와 tuple은 들어 갈 수 없으므로 row[0]으로 하면 row라는 행의 0번째 데이터를 뜻하고 data type은 string으로 변한다.

그러므로 다음과 같이 JSON의 키 값으로 통해 접근 할 수 있다. 

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
41
42
43
44
45
46
47
48
49
50
51
52
53
from flask import Flask, request, Response, jsonify, render_template
 
app = Flask(__name__)
 
import mysql.connector
import json
 
# MySQL connect
db = mysql.connector.connect(
        host="접속하려는 MySQL이 설치된 IP주소"
        user="MySQL 사용자",
        passwd="MySQL 사용자 비밀번호"
        db='접속하려는 DB명', port=3309
        )
 
# MySQL curs
curs = db.cursor()
 
# Flask framework = route
def index():
        return render_template('index.html')
 
@app.route('/request', methods =['post'])
def check_flask():
        # SQL
        value = request.form['SensorID']
        sql = "select esnData from ESensorTable where esnSensorId = '"+value+"'"
        curs.execute(sql)
        #DATA Fetch
        row = curs.fetchone()
        #convert json to python
        data = json.loads(row[0])
        CO2 = data['CO2']
        CO = data['CO']
        O2 = data['O2']
        H2S = data['H2S']
        VOC = data['VOC']
        Temp = data['Temperature']
        Hum = data['Humidity']
        print(data)
 
        return VOC
 
        db.commit()
 
        curs.close()
 
if __name__=='__main__':
        app.run(host='0.0.0.0',port=5000)
 
db.close()
cs

 

아래와 같이

xxx.xxx.xxx.101

xxx.xxx.xxx.102

xxx.xxx.xxx.103

datanode에 분산 저장한것을 확인 할 수 있습니다.

 

명령어는

hdfs fsck [hdfs상의 파일 경로] -file -blocaks -locations 

 

DatanodeInfoWithStorage[xxx.xxx.xxx.101:50010,DS-df8b44f2-f13b-4379-97e0-5220191f7a8a,DISK] 에서

xxx.xxx.xxx.101 = ip주소

50010 = 포트번호

DS-df8b44f2-f13b-4379-97e0-5220191f7a8a = 저장소 ID. 데이터 노드의 내부 ID입니다. 데이터 노드가 이름 노드에 등록 할 때 할당됩니다.

DISK = storageType. 디스크. 저장소 유형은 RAM_DISK, SSD, DISK 및 ARCHIVE가 될 수 있습니다.

 

참고:

https://stackoverflow.com/questions/34497060/hdfs-fsck-command-output

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
[hadoop@master current]$ hdfs fsck input/test.txt -files -blocks -locations
Connecting to namenode via http://master:50070/fsck?ugi=hadoop&files=1&blocks=1&locations=1&path=%2Fuser%2Fhadoop%2Finput%2Ftest.txt
FSCK started by hadoop (auth:SIMPLE) from /192.168.0.35 for path /user/hadoop/input/test.txt at Wed May 15 09:32:40 KST 2019
/user/hadoop/input/test.txt 76 bytes, 1 block(s):  OK
0. BP-306908151-192.168.0.35-1557215026538:blk_1073742641_1819 len=76 repl=3 [DatanodeInfoWithStorage[xxx.xxx.xxx.102:50010,DS-7417b9d5-2b9a-4ef9-b8eb-afd2ee982a54,DISK], 
DatanodeInfoWithStorage[xxx.xxx.xxx.101:50010,DS-df8b44f2-f13b-4379-97e0-5220191f7a8a,DISK], 
DatanodeInfoWithStorage[xxx.xxx.xxx.103:50010,DS-b7ddf346-b5cd-44b7-8c31-dc051c4a7943,DISK]]
 
Status: HEALTHY
 Total size:    76 B
 Total dirs:    0
 Total files:   1
 Total symlinks:                0
 Total blocks (validated):      1 (avg. block size 76 B)
 Minimally replicated blocks:   1 (100.0 %)
 Over-replicated blocks:        0 (0.0 %)
 Under-replicated blocks:       0 (0.0 %)
 Mis-replicated blocks:         0 (0.0 %)
 Default replication factor:    3
 Average block replication:     3.0
 Corrupt blocks:                0
 Missing replicas:              0 (0.0 %)
 Number of data-nodes:          3
 Number of racks:               1
FSCK ended at Wed May 15 09:32:40 KST 2019 in 11 milliseconds
 
 
The filesystem under path '/user/hadoop/input/test.txt' is HEALTHY
h

Python-MySQL 연결하기 위해선 당연하게도 Python과 MySQL이 있어야 한다.

 

MySQL version : 5.6.44

Flask version : 1.0.2

Python version 3.6.7


1. Python을 설치하기 위해서는 pip가 선행 설치 되어있어야 한다.

1
2
[root@localhost ~]# pip
bash: pip: 명령을 찾을 수 없습니다...
 

pip 설치 명령어는 다음과 같다.

1
[root@localhost ~]# yum install python-pip
 

설치를 하였으면 다시 pip 명령어를 쳐보자.  command 옵션들이 나오면 설치가 된 것이다.


2. Python 설치

1
2
3
4
5
6
7
[root@localhost]# sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
[root@localhost]# yum search python3
[root@localhost]# sudo yum install -y python36u python36u-libs python36u-devel python36u-pip
[root@localhost]# python -V
Python 2.7.5
[root@localhost]# python3 -V
Python 3.6.7
 
 

3. MySQL-connector 설치(파이썬과 MySQL 연결)

1
[root@localhost]# sudo pip install mysql-connector-python
 

4. 연결 확인하기

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost]#  python3
Python 3.6.7 (default, Dec  5 201815:02:05)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help""copyright""credits" or "license" for more information.
>>> import mysql.connector
>>> conn = mysql.connector.connect(host='xxx.xxx.xxx.35', user='root', password='비밀번호', db ='member', port='3309')
>>> curs = conn.cursor()
>>> sql = 'select * from student'
>>> curs.execute(sql)
>>> rows =curs.fetchall()
>>> print(rows)
[(1'smith''010-1111-1111'), (2'kelly''010-2222-2222')]
 
 

'Centos7 > Python' 카테고리의 다른 글

Python script 에서 Bash 명령문 사용하기  (0) 2019.05.15

mysql student 테이블 정보

1
2
3
4
5
6
7
8
9
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(10| YES  |     | NULL    |       |
| phone | varchar(20| YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
 
1
2
3
4
5
6
7
8
mysql> select * from student;
+----+-------+---------------+
| id | name  | phone         |
+----+-------+---------------+
|  1 | smith | 010-1111-1111 |
|  2 | kelly | 010-2222-2222 |
+----+-------+---------------+
2 rows in set (0.00 sec)
 

1
2
[hadoop@master ~]$ cd /usr/local/sqoop/
[hadoop@master sqoop]$ vi student_import.sh
 

위 처럼 student_import.sh 파일을 만들고 다음과 같이 작성 하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
import
--username
hadoop
--password
'비밀번호'
--connect
jdbc:mysql://xxx.xxx.xxx.35:3309/member?serverTimezone=Asia/Seoul
--table
student
--split-by
ID
--m
1
 
 

참고로 작성 방법은 다음과 같다.

--connect jdbc:mysql://마스터주소:mysql포트번호/mysql데이터베이스명?serverTimezone=Asia/Seoul \ =JDBC 연결, mysql 데이터베이스, mysql 타임존 명시
--username [mysql 사용자명] \                                         =mysql 인증 사용자명 명시
--password [mysql 비밀번호] \                                          =mysql 인증 비밀번호 명시
--query 'select * from sample_table WHERE $CONDITIONS' \  =mysql 쿼리 명시
--split-by [컬럼명] \                                                        =분할 단위로 쓰이는 테이블의 컬럼
--target-dir [디렉토리]  예시) hdfs://localhost/user/hadoop/      =목적지 HDFS 디렉토리(디렉토리를 작성하지 않으면 디폴트 값인 root경로로 바로 저장 된다.) 
-m 1

1
2
3
4
5
6
7
8
9
10
11
12
 import-all-tables
 --username
 mysql계정명 입력
 --password
 비밀번호 입력
 --connect
 jdbc:mysql://192.168.0.35:3309/디비명?serverTimezone=Asia/Seoul
 --warehouse-dir
 /user/hadoop/EdgeDB  <= hdfs 저장 
 -m
 1
 
 
 

위의 코드는 테이블 import가 아닌 DB import 코드이다.

 

1. sqoop과 mysql이 제대로 연결되어 있는지 확인하기 위헤 다음과 같은 명령어로  mysql 데이터베이스 리스트를 보도록한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[hadoop@master ~]$ sqoop list-databases --connect jdbc:mysql://xxx.xxx.xxx.35:3309 --username hadoop --password '비밀번호'
Warning: /usr/local/sqoop/../hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /usr/local/sqoop/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /usr/local/sqoop/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
19/05/09 17:33:26 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
19/05/09 17:33:26 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
19/05/09 17:33:26 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
information_schema
member
mysql
performance_schema
 

HBase, HCatalog, Accumulo는 필요없으니 무시....

 

아까 만들었던 student_import.sh로 member라는 데이터베이스에서 student 테이블 리스트를 가져오도록 하겠습니다.

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
[hadoop@master sqoop]$ sqoop --options-file student_import.sh
Warning: /usr/local/sqoop/../hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /usr/local/sqoop/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /usr/local/sqoop/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
19/05/09 17:44:16 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
19/05/09 17:44:16 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
19/05/09 17:44:16 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
19/05/09 17:44:16 INFO tool.CodeGenTool: Beginning code generation
19/05/09 17:44:16 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `student` AS t LIMIT 1
19/05/09 17:44:16 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `student` AS t LIMIT 1
19/05/09 17:44:16 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/local/hadoop
Note: /tmp/sqoop-hadoop/compile/3ca02518569f69f0effb4492d2b8319c/student.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
19/05/09 17:44:17 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-hadoop/compile/3ca02518569f69f0effb4492d2b8319c/student.jar
19/05/09 17:44:17 WARN manager.MySQLManager: It looks like you are importing from mysql.
19/05/09 17:44:17 WARN manager.MySQLManager: This transfer can be faster! Use the --direct
19/05/09 17:44:17 WARN manager.MySQLManager: option to exercise a MySQL-specific fast path.
19/05/09 17:44:17 INFO manager.MySQLManager: Setting zero DATETIME behavior to convertToNull (mysql)
19/05/09 17:44:17 INFO mapreduce.ImportJobBase: Beginning import of student
19/05/09 17:44:17 INFO Configuration.deprecation: mapred.job.tracker is deprecated. Instead, use mapreduce.jobtracker.address
19/05/09 17:44:17 INFO Configuration.deprecation: mapred.jar is deprecated. Instead, use mapreduce.job.jar
19/05/09 17:44:17 INFO Configuration.deprecation: mapred.map.tasks is deprecated. Instead, use mapreduce.job.maps
19/05/09 17:44:18 INFO client.RMProxy: Connecting to ResourceManager at master/192.168.0.35:8032
19/05/09 17:44:20 INFO db.DBInputFormat: Using read commited transaction isolation
19/05/09 17:44:20 INFO mapreduce.JobSubmitter: number of splits:1
19/05/09 17:44:20 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1557362273260_0003
19/05/09 17:44:20 INFO impl.YarnClientImpl: Submitted application application_1557362273260_0003
19/05/09 17:44:20 INFO mapreduce.Job: The url to track the job: http://master:8088/proxy/application_1557362273260_0003/
19/05/09 17:44:27 INFO mapreduce.Job:  map 0% reduce 0%
19/05/09 17:44:33 INFO mapreduce.Job:  map 100% reduce 0%
19/05/09 17:44:34 INFO mapreduce.Job: Counters: 30
        File System Counters
                FILE: Number of bytes read=0
                FILE: Number of bytes written=142093
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                HDFS: Number of bytes read=87
                HDFS: Number of bytes written=44
                HDFS: Number of read operations=4
                HDFS: Number of large read operations=0
                HDFS: Number of write operations=2
        Job Counters
                Launched map tasks=1
                Other local map tasks=1
                Total time spent by all maps in occupied slots (ms)=5970
                Total time spent by all reduces in occupied slots (ms)=0
                Total time spent by all map tasks (ms)=2985
                Total vcore-milliseconds taken by all map tasks=2985
                Total megabyte-milliseconds taken by all map tasks=4584960
        Map-Reduce Framework
                Map input records=2
                Map output records=2
                Input split bytes=87
                Spilled Records=0
                Failed Shuffles=0
                Merged Map outputs=0
                GC time elapsed (ms)=75
                CPU time spent (ms)=950
                Physical memory (bytes) snapshot=248098816
                Virtual memory (bytes) snapshot=3030355968
                Total committed heap usage (bytes)=351272960
        File Input Format Counters
                Bytes Read=0
        File Output Format Counters
                Bytes Written=44
19/05/09 17:44:34 INFO mapreduce.ImportJobBase: Transferred 44 bytes in 16.2221 seconds (2.7123 bytes/sec)
19/05/09 17:44:34 INFO mapreduce.ImportJobBase: Retrieved 2 records.
 

HDFS 웹 UI 확인

http://ip주소:50070

YARN 웹 UI 확인

http://ip주소:8088

마지막 다음과 같은 명령어로 HDFS에 있는 student 파일 확인하기

1
2
3
[hadoop@master sqoop]$ hdfs dfs -cat /user/hadoop/student/*
1,smith,010-1111-1111
2,kelly,010-2222-2222
 

import 참고

http://hochul.net/blog/datacollector_apache_sqoop_from_rdbms2/

 

데이터 수집 #2 Apache Sqoop을 활용하여 RDBMS 데이터 수집(2)

[DBGuide.net] 연재 글 – 데이터 수집 #2 Apache Sqoop을 활용하여 RDBMS 데이터 수집(2)   [DBGuide.net] 연재 글 데이터 수집 #2 Apache Sqoop을 활용하여 RDBMS 데이터 수집(2) 데이터 수집 #2 Apache Sqoop을 활용하여 RDBMS 데이터 수집(1) 데이터 수집 #1…

hochul.net

이상으로 hadoop-sqoop-mysql 연동을 마무리 하겠습니다.

+ Recent posts